JAVA

this

seungmin576 2024. 12. 16. 14:30

자신의 메모리를 가리키는 this

생성된 인스턴스 스스로를 가리키는 예약어이다.

 

  • 생년월일을 의미하는 BirthDay 클래스를 만들고, this가 실제로 어떤 의미인지 알기 위한 this를 출력하는 메서드를 추가
package chap6;

class BirthDay {
    int day;
    int month;
    int year;

    public void setYear(int year){
        this.year = year;
    }

    public void printThis(){
        System.out.println(this);
    }
}

public class ThisExample {
    public static void main(String[] args){
        BirthDay bday = new BirthDay();
        bday.setYear(2000);
        System.out.println(bday);
        bday.printThis();
    }
}

인스턴스를 가리키는 변수가 참조 변수이며, 참조 변수를 출력하면 '클래스이름@메모리 주소' 문자열 값이 나온다.

출력 결과를 보면 bday.printThis() 메서드를 호출하여 출력한 this 값이 참조 변수 bday를 출력한 값과 같다.

클래스 코드에서 사용하는 this는 생성된 인스턴스 자신을  가리키는 역할을 한다.

따라서 this.year = year; 문장으로 참조하면 동적 메모리에 생성된 인스턴스의 year 변수 위치를 가리키고 그 위치에 매개변수 값을 넣어 주는 것이다.

 

 

main() 함수는 ThisExample 클래스의 시작 메서드이다.

main() 함수에서 bDay 변수가 가리키는 인스턴스와 BirthDay 클래스의 setYear() 메서드에서 this가 가리키는 인스턴스가 같은 곳에 있다.


생성자에서 다른 생성자를 호출하는 this

클래스에 생성자가 여러 개 있을 때 어떤 생성자에서 다른 생성자를 호출하는 경우가 종종 있다.

이때 this를 사용해 클래스의 생성자에서 다른 생성자를 호출할 수 있다.

 

package chap6;

class Person{
    String name;
    int age;

    Person(){
        this("이름 없음", 1);   //this를 이용해 Person(String, 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);
    }
}

 

Person 클래스에는 Person() 디폴트 생성자와 매개변수를 가지는 Person(String, int) 생성자가 있다.

클래스가 생성될 때 Person(String, int)가 호출되어 이름과 나이를 전달하고, Person() 디폴트 생성자가 호출되는 경우에는 초깃값으로 "이름없음" 과 1 값을 대입하고자 한다.

디폴트 생성자 코드 안에서 직접 써도 되지만, 이미 다른 생성자에 이 코드가 작성되어 있으므로 this를 활용하여 다른 생성자를 호출할 수 있다.

 

  • this로 다른 생성자를 호출할 때의 주의점

this를 사용하여 생성자를 호출하는 코드 이전에 다른 코드를 넣을 수 없다.

생성자는 클래스가 생성될 때 호출되므로 클래스 생성이 완료되지 않은 시점에 다른 코드가 있다면 오류가 발생할 수 있다.

디폴트 생성자에서 생성이 완료되는 것이 아니라 this를 사용해 다른 생성자를 호출하므로, 이때는 this를 활용한 문장이 가장 먼저 와야 한다.

 


자신의 주소를 반환하는 this

생성된 클래스 자신의 주소 값을 반환할 수 있다.

인스턴스 주소 값을 반환할 때는 this를 사용하고 반환형은 클래스 자료형을 사용한다.

 

package chap6;

class Person{
    String name;
    int age;

    Person(){
        this("이름 없음", 1);   //this를 이용해 Person(String, int) 생성자 호출
    }

    Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    Person returnItSelf(){
        return this;    //this 반환 반환형은 클래스형 Peson.
    }
}

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); //참조 변수 출력

    }
}

클래스 자료형과 상관없이 클래스 내에서 this를 사용하면 자신의 주소 값을 반환할 수 있다.

 

'JAVA' 카테고리의 다른 글

static 변수  (0) 2024.12.16
객체 간 협력  (0) 2024.12.16
정보 은닉(접근 제어자, get(),set())  (0) 2024.12.13
참조 자료형  (1) 2024.12.13
생성자  (0) 2024.12.13