this는 인스턴스 자신을 가리키는 예약어이다. 즉, this는 인스턴스가 저장된 힙 메모리의 주소값을 가지고 있는 변수이며 스택 메모리에 저장된다.

위의 단 하나의 원리를 기억하면서 this가 사용되는 예제를 몇 개 보자.

 

1. 인스턴스가 저장된 메모리의 주소


package classpart;

public class Student {
    String name;
    char gender;

    public void setName(String name) {
        this.name = name; // this.name은 클래스의 멤버변수이고 name은 메소드의 매개변수를 의미한다.
    }
    public String getName() {
        return this.name; // 클래스의 멤버변수 name을 반환
    }

    public void printThis(){
        System.out.println(this); // this자체를 반환
    }
}

매개변수로 이름을 전달해 줄 때에도 그 의미를 파악할 수 있게 name이라고 넣어준다. 그리고 메소드의 코드 구현부에서는 로컬변수인 매개변수 name이 우선이다. 이 때 매개변수 name의 값을 클래스 멤버변수 name에 저장하기 위해 this를 쓴다. this.name은 클래스의 멤버변수 name을 지칭한다.

package classpart;

public class Test {
    public static void main(String[] args) {
       Student stu = new Student();
       stu.setName("John");
       System.out.println(stu.getName());
       System.out.println(stu);
       stu.printThis();
    }
}

실행결과

John

classpart.Student@15db9742

classpart.Student@15db9742

setName의 매개변수로 전달 된 "John"이 전달되었다. 이 때 setName 메소드의 코드 구현부의 this는 인스턴스가 대입되는 것이다. 따라서 코드 구현부는 stu.name = "John"이 되는 것이다.

한 번더 확인하기 위해 stu를 출력하고 this를 출력하는 printThis() 메소드를 호출한 결과가 같다. 둘 모두 인스턴스가 저장된 힙 메모리의 주소값을 가진다.

 

2. 생성자에서 다른 생성자를 호출할 때


package classpart;

public class Student {
    String name;
    char gender;

    Student(){
       this("NoName", '?'); //아래에 정의된 생성자 호출
    }

    Student(String name, char gender){
       this.name = name;
       this.gender = gender;
    }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public char getGender() {
      return gender;
   }

   public void setGender(char gender) {
      this.gender = gender;
   }
}

위 코드는 인스턴스를 생성하면서 아무런 정보도 입력하지 않았을 때의 default값을 설정하기 위해 이미 정의 된 다른 생성자를 사용하는 경우이다.

package classpart;

public class Test {
    public static void main(String[] args) {
       Student stu = new Student();
       System.out.println(stu.getName());
       System.out.println(stu.getGender());
    }
}

실행결과

NoName

?

 

3. 자신의 주소 반환


package classpart;

public class Student {
    String name;
    char gender;

    public Student returnItSelf() {
       return this;
    }
}

Student 타입의 자료를 반환하는 함수라 반환형이 Student인 메소드이다.

package classpart;

public class Test {
    public static void main(String[] args) {
       Student stu = new Student();
       System.out.println(stu);
       System.out.println(stu.returnItSelf());
    }
}

실행결과

classpart.Student@15db9742

classpart.Student@15db9742

같은 결과를 반환하는 것을 볼 수 있다.

이 경우처럼 this가 쓰이는 경우는 흔치 않다.

 

하지만 세 가지 방법에 통용되는 원리는 단 하나다. this라는 것은 인스턴스가 만들어졌을 때 생겼을 주소값을 저장하여 자신을 가르키는 역할을 한다는 것만 기억하면 된다.

+ Recent posts