티스토리 뷰
클래스
객체를 정의하는 틀 또는 설계도와 같은 의미로 사용되며 추상화라는 개념을 직접 구현하는 것이라고 할 수 있습니다. 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.
// Person 이라는 클래스 정의
public class Person {
// 필드
String name;
int age;
String country;
// 생성자
public Person() {
}
public Person(String name, int age, String country) {
this.name = name;
this.age = age;
this.country = country;
}
// 메소드
public void greeting() {
if ("Korea".equals(country)) {
System.out.println("안녕하세요.");
} else {
System.out.println("Hello");
}
}
}
클래스의 구성 요소
✔️생성자(constructor)
: 클래스에서 객체(인스턴스)를 생성할 때 사용하는 메소드입니다. 객체를 생성하면 메모리에 인스턴스가 로드됩니다. 생성자를 사용해 인스턴스를 생성함과 동시에 인스턴스 변수를 초기화 할 수 있습니다. 자바에서 생성자는 클래스명과 동일한 이름을 가집니다.
생성자는 다음과 같은 특징이 있습니다.
- 생성자는 반환값이 없지만 반환 타입을 void로 선언하지 않습니다.
- 생성자는 초기화를 위한 데이터를 인자로 전달받을 수 있습니다.
- 생성자 또한 메소드 오버로딩이 가능하여 여러개 존재할 수 있습니다.
자바에서는 new 키워드와 함께 생성자를 호출하여 객체를 생성합니다.
Person person1 = new Person(); // 기본 생성자
Person person2 = new Person("Alice", 20, "Korea"); // 매개변수를 받는 생성자
자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 합니다. 하지만 생성자를 별도로 지정하지 않아도 객체를 생성할 수 있는데 이는 자바 컴파일러가 기본 생성자(default constructor)라는 것을 제공하기 때문입니다. 별도의 생성자가 하나도 정의되어 있지 않다면 다음과 같은 기본 생성자를 추가합니다. 이 기본 생성자는 매개변수를 가지지 않고, 아무런 작업도 하지 않습니다.
클래스명() {}
만약 매개변수를 가지는 다른 생성자를 하나라도 정의되어 있다면 기본 생성자는 자동으로 추가되지 않습니다.
✔️필드(field)
: 클래스에 포함된 변수(variable)를 의미합니다. 클래스 내에서 필드는 선언된 위치에 따라 다음과 같이 구분됩니다.
- 클래스 변수(class variable): 클래스 영역에 선언된 변수 중 static 키워드를 가진 변수
- 인스턴스 변수(instance variable): 클래스 영역에 선언되어 있지만 static 키워드가 붙어있지 않은 변수
- 지역 변수(local variable): 메소드나 생성자, 초기화 블록 내에 위치한 변수
위 변수들은 다음과 같은 차이를 가지고 있습니다.
변수 | 생성 시기 | 소멸 시기 | 저장 메모리 | 사용 방법 |
클래스 변수 | 클래스가 메모리에 올라갈 때 생성 | 프로그램이 종료될 때 | 메소드 영역 | 클래스명.변수명 |
인스턴스 변수 | 인스턴스가 생성될 때 | 인스턴스가 소멸될 때 | 힙 영역 | 인스턴스명.변수명 |
지역 변수 | 블록 내에서 변수 선언이 될 때 | 블록을 벗어날 때 | 스택 영역 | 변수명 |
클래스 변수는 인스턴스를 생성하지 않고 바로 클래스명으로 접근할 수 있습니다. 이러한 클래스 변수는 해당 클래스의 모든 인스턴스에서 공유하는 공유 변수입니다.
인스턴스 변수는 항상 인스턴스를 생성한 후에 인스턴스명으로 접근 가능하며 각 인스턴스마다 다른 값을 가집니다.
class PersonPark {
static String lastName = "Park"; // 클래스 변수
String firstName; // 인스턴스 변수
PersonPark(String name) {
this.firstName = name;
}
}
class Main {
public static void main(String[] args) {
System.out.println(PersonPark.lastName); // 인스턴스 생성 없이 접근 가능
PersonPark damiPark = new PersonPark("dami"); // 인스턴스 생성
System.out.println(damiPark.firstName); // 인스턴스명으로 접근
PersonPark miriPark = new PersonPark("miri");
System.out.println(miriPark.firstName);
}
}
✔️메소드(method)
: 클래스 내에서 어떤 작업을 수행하기 위한 명령문의 집합입니다.
메소드를 정의하는 방법은 다음과 같습니다.
접근제한자 반환타입 메소드명(매개변수타입 매개변수명) { // 선언 내용
// 구현 내용
}
- 접근제한자: 해당 메소드에 접근할 수 있는 범위를 명시하는 것으로 public, protected, private이 있습니다.
- 반환타입(return type): 메소드가 작업을 마치고 반환하는 데이터의 타입을 명시합니다. 메소드 내부에서 return 키워드를 통해 반환값을 넘겨주는데 이때 반환값의 타입을 의미합니다.
- 메소드명: 메소드를 호출할 때 사용하는 이름입니다.
- 매개변수(parameters): 메소드 호출 시 전달되는 인수의 값을 저장할 변수들을 명시합니다.
메소드 호출 방법은 다음과 같습니다.
Person person = new Person("Alice", 20, "Korea");
person.greeting();
메소드 또한 static 키워드를 사용하여 클래스 메소드를 만들 수 있습니다. 단, static 메소드 안에서는 인스턴스 변수에 접근할 수 없습니다. static 메소드가 먼저 메모리에 로드되기 때문에 그때 존재하지 않는 인스턴스 변수에 접근하는 것은 불가능하기 때문입니다.
static 메소드는 주로 유틸리티성 메소드를 작성할 때 많이 사용됩니다.
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
public static String getCurrentDate(String fmt) {
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
return sdf.format(new Date());
}
public static void main(String[] args) {
System.out.println(DateUtil.getCurrentDate("yyyyMMdd"));
}
}
this 키워드
this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는데 사용하는 변수로 해당 인스턴스의 주소를 가리킵니다.
public class Person {
...
public Person(String name, int age, String country) {
this.name = name;
this.age = age;
this.country = country;
}
...
}
위의 예제처럼 생성자의 매개변수 이름과 인스턴스 변수의 이름이 같은 경우 인스턴스 변수 앞에 this 키워드를 붙여 구분해주어야 합니다.
이렇게 자바에서는 this 키워드를 통해 인스턴스 변수에 접근할 수 있고 this 키워드는 인스턴스 메소드 안에서만 사용할 수 있습니다. 즉, 클래스 메소드에서는 사용이 불가합니다.
*** this() 메소드 ***
this() 메소드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스 내 다른 생성자를 호출해야 하는 경우 사용하게 됩니다. this() 메소드에 인자를 전달하면, 생성자 중에 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출하게 됩니다.
class Person {
String firstName;
String lastName;
int age;
Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Person(String firstName, String lastName, int age) {
this(firstName, lastName); // 다른 생성자를 호출
this.age = age;
}
}
참고
- 클래스: www.tcpschool.com/java/java_class_intro
- 정적 변수, 메소드: wikidocs.net/228
'JAVA' 카테고리의 다른 글
[Java Study 06] 상속 (0) | 2021.04.27 |
---|---|
[Java Study 09] 예외(Exception) 처리 (0) | 2021.04.26 |
[JAVA] 객체 지향 프로그래밍(OOP: Object Oriented Programming) (0) | 2021.04.23 |
[JAVA] JUnit 테스트 (0) | 2021.04.20 |
[JAVA] 스택(Stack)과 큐(Queue) (0) | 2021.04.18 |
- Total
- Today
- Yesterday
- 조합
- spring
- string
- array
- 수학
- ionic
- Algorithm
- DFS
- Baekjoon
- 프로그래머스
- programmers
- CodeCommit
- java
- 순열
- CodeDeploy
- permutation
- sort
- EC2
- SWIFT
- search
- AWS
- map
- Dynamic Programming
- CodePipeline
- cloudfront
- ECR
- 에라토스테네스의 체
- Combination
- BFS
- 소수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |