JAVA/JAVA

Java | This

pathas 2020. 1. 22. 17:41

This

생성된 인스턴스(객체) 스스로를 가리키는 예약어

멤버 변수와 메서드 매개변수의 이름이 같을 경우에 컴퓨터가 구분하지 못하는 경우 발생
→ 멤버 변수 이름 앞에 this 작성


① 자신의 인스턴스를 가리키는 This

main()에서 같은 클래스를 이용해서 서로 다른 이름의 객체를 생성하더라도
각각의 객체 내의 메소드와 멤버 변수를 스스로의 객체에서 찾을 수 있도록 this를 사용


참조 변수

인스턴스를 가리키는 변수, '클래스 이름@메모리 주소'가 출력됨

public class ThisTest2 {

    // 기본 생성자
    ThisTest2(){
        // 자기 객체의 참조 변수를 출력할 수 있도록 this 사용
        System.out.println("현재 생성된 객체: " + this);
    }
    public static void main(String[] args) {

        ThisTest2 tt = new ThisTest2();
        System.out.println("main()에서 생성된 tt객체: " + tt);
         /* 현재 생성된 객체: j200122.ThisTest2@15db9742
             main()에서 생성된 tt객체: j200122.ThisTest2@15db9742 */

        ThisTest2 tt2 = new ThisTest2();
        System.out.println("main()에서 생성된 tt2객체: " + tt2);
         /* 현재 생성된 객체: j200122.ThisTest2@6d06d69c
             main()에서 생성된 tt2객체: j200122.ThisTest2@6d06d69c */
    }
}

※ 기본 생성자 내부에 작성된 this가 생성된 객체에 따라 다른 참조 변수를 가리킴


사용례

public class ThisTest {

    private int a = 100;

    public void setA(int a) {
        this.a = a;     /* a = a; 로 작성하면 setA()로 값을 저장하지 못하고
                            100이 출력됨 */
    }

    public int getA() {
        return a;
    }

    public static void main(String[] args) {
         // 객체 생성
        ThisTest tt = new ThisTest();
         /* this.a = a; 에서 this는 tt 인스턴스(객체)를 가리키며,
            여러 개의 객체가 생성된 경우, 각각의 객체를 지시함 */
        tt.setA(2);
        int get = tt.getA();
        System.out.println(get);    // 2
    }
}

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

클래스에 생성자가 여러 개 있을 때 생성자에서 다른 생성자를 호출할 때 this 사용 가능


생성자 호출 This_주의 사항

this를 사용하여 생성자를 호출하는 코드 이전에 다른 코드 작성 불가

기본 생성자에서 생성이 완료되는 것이 아니라
this를 사용해 다른 생성자를 호출하므로, this가 가장 먼저 와야 함

→ 클래스 생성이 완료되지 않은 시점에 다른 코드가 있다면 오류 발생
Constructor call must be the first statement in a constructor

 

public class CnstCall {
    String name;
    int age;

    CnstCall() {
        this("김덕배", 22);
    }

    CnstCall(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("이름: " + name + ", 나이:" + age);
    }

    public static void main(String[] args) {
        CnstCall cc = new CnstCall();
         // 이름: 김덕배, 나이:22
    }

}

※ 생성자 호출시 호출된 생성자의 모든 코드가 실행됨


간단해 보이지만 어려운 개념인 this에 대해 살펴보았습니다.

this에 대해 꼭 알아 두어야 하는 것은 this의 값이 객체(인스턴스)의 참조 변수를 가리킨다는 것입니다.

생성자 호출 this 역시 생성자가 속한 객체에 있는 또 다른 생성자에 매개변수를 전달하면서 호출하는 것이기 때문에

 this는 자기 자신의 객체를 가리킨다는 점만 이해하면 될 것 같습니다.