Programming

; develop a program

Back-End/Java

[Java] this 예약어

Clloud_ 2023. 2. 2. 08:41
반응형

이번 포스팅에서는 자바(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