반응형
이번 포스팅에서는 자바(Java)에서 this 예약어에 대하여 공부를 해보고자 한다.
this 예약어
this란 간단히 설명하면 생성된 인스턴스 스스로를 가리키는 예약어를 말한다.
이 외에도 다른 역할로 this를 사용할 수 있다.
자신의 메모리를 가리키는 this
생년월일을 의미하는 BirthDay 클래스를 만들고, this를 출력하는 메서드를 추가한다.
class BirthDay {
int day;
month;
int year;
public void setYear(int year) { //태어난 연도를 지정하는 메서드
this.year = year;
}
public void printThis() { //this 출력 메서드
System.out.println(this);
}
}
public class ThisExample {
public static void main(String[] args){
BirthDay bDay = new BirthDay();
bDay.setYear(2000); //태어난 연도를 2000으로 지정
System.out.println(bDay); //참조 변수 출력
bDay.printTis(); //this 출력 메서드 호출
}
}
출력 결과
thisex.BirthDay@311d617d
thisex.BirthDay@311d617d
인스턴스가 생성된 동적 메모리(힙) 주소는 실제 주소가 아닌 자바 가상머신이 생성한 주소다.
- 인스턴스가 가리키는 변수가 참조 변수이며, 참조 변수를 출력하면 '클래스 이름@메모리 주소' 문자열 값이 나온다.
- 출력 결과를 봤을 때 bDay.printThis( ) 메서드를 호출하여 출력한 this 값이 참조 변수 bDay를 출력한 값과 같다.
- 즉 클래스 코드에서 사용하는 this는 생성된 인스턴스 자신을 가리키는 역할을 한다.
- this.year = year; 문장으로 참조하면 동적 메모리에 생성된 인스턴스의 year 변수 위치를 가리키고 그 위치에 매개 변수 값을 넣어준다.
그림으로 나타내면 다음과 같다.
- main( ) 함수는 클래스의 시작 메서드이다.
- main( ) 함수에서 bDay 변수가 가리키는 인스턴스와 BrithDay 클래스의 setYear( ) 메서드에서 this가 가리키는 인스턴스가 같은 곳에 있다.
생성자에서 다른 생성자를 호출하는 this
클래스에 생성자가 여러 개 있을 때 어떤 생성자에서 다른 생성자를 호출하는 경우가 종종 있다.
이때 this를 사용하여 클래스의 생성자에서 다른 생성자를 호출할 수 있다.
예제
this로 다른 생성자 호출하기
class Person {
String name;
int age;
Person(){
this("이름 없음", 1); //this를 사용해 Person(Stirng, int) 생성자 호출
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class CallAnotherConst{
public static void main(String[] args) {
Person noName = new Person();
System.out.println(noName.name);
System.out.println(noName.age);
}
}
출력 결과
이름 없음
1
- Person 클래스에는 Person( ) 디폴트 생성자와 매개변수를 가지는 Person(String, int) 생성자가 있다.
- 클래스가 생성될 때 Person(String, int)가 호출되어 이름과 나이를 전달받고, Person( ) 디폴트 생성자가 호출되는 경우에는 초깃값으로 "이름 없음"과 1 값을 대입하고자 한다.
- 디폴트 생성자 코드 안에 직접 써도 되지만, 이미 다른 생성에 이 코드가 작성되어 있으므로 this를 활용하여 다른 생성자를 호출할 수 있다.
주의할 점
- this를 사용하여 생성자를 호출하는 코드 이전에 다른 코드를 넣을 수 없다.
- 다른 코드를 넣으면 오류 메시지가 나타난다.
- 생성자는 클래스가 생성될 때 호출되므로 클래스 생성이 완료되지 않은 시점에 다른 코드가 있다면 오류가 발생할 수 있다.
- 즉 this를 사용해 다른 생성자를 호출하므로, this를 활용한 문장이 가장 먼저 와야 한다.
자신의 주소를 반환하는 this
this를 사용하여 생성된 클래스 자신의 주소 값을 반환할 수 있다.
인스턴스 주소 값을 반환할 때는 this를 사용하고 반환형은 클래스 자료형을 사용한다.
예제
this를 사용하여 주소 값 반환하기
class Person {
String name;
int age;
Person(){
this("이름 없음", 1); //Person(String, int) 생성자 호출
}
Person(String name, int age){
this.name = name;
this.age = age;
}
Person returnItSelf(){
return this; //this 반환
}
}
public class CallAnotherConst {
public static void main(String[] args) {
Person noName = new Person();
System.out.println(noName.name);
System.out.println(noName.age);
Person p = noName.returnItSelf(); //this 값을 클래스 변수에 대입
System.out.println(p); //noName.returnItSelf()의 반환 값 출력
System.out.println(noName); //참조 변수 출력
}
}
출력 결과
이름 없음
1
thisex.Person@16f65612
thisex.Person@16f65612
this를 반환하는 메서드를 사용할 일이 흔하지는 않지만, 클래스 자료형과 상관없이 클래스 내에서 this를 사용하면 자신의 주소 값을 반환할 수 있다.
반응형
'Back-End > Java' 카테고리의 다른 글
[Java] static 변수 (0) | 2023.02.03 |
---|---|
[Java] 객체 간 협력 (0) | 2023.02.02 |
[Java] 정보 은닉(Information Hiding) (3) | 2023.02.01 |
[Java] 참조 자료형 (0) | 2023.02.01 |
[Java] 생성자(Constructor) (0) | 2023.02.01 |