728x90
앞서 객체란 무엇이고, 코드로 객체를 어떻게 구현하고 생성하는지 알아보았습니다. 이제, 클래스와 객체에 관련된 새로운 용어들을 살펴보고, 객체 간에 어떻게 협력할 수 있는지 알아보겠습니다.
자신의 메모리를 가리키는 this
- this 는 간단히 설명하면 생성된 인스턴스 스스로를 가리키는 예약어입니다.
- 이 외에도 다른 역할로 this 를 사용할 수 있습니다. 예제를 통해 하나씩 내용을 살펴보겠습니다.
package thisex;
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 dDay = new BirthDay();
dDay.setYear(2000);
System.out.println(dDay);
dDay.printThis();
}
}

- 인스턴스를 가리키는 참조 변수는 참조 값을 가지고 있으며, 참조 값이란 힙 메모리에 생성된 인스턴스의 주소 값입니다.
- 출력된 값을 보면 dDay.printThis( ) 메서드의 출력 값과 참조 변수 dDay 를 출력한 값이 같습니다.
- 즉, 클래스 코드에서 사용하는 this 는 생성된 인스턴스 자신을 가리키는 역할을 합니다.
파일 하나에 클래스 두 개?
- 위의 예제는 프로그램 구성이 이전까지의 예제와 다릅니다.
- 이전에는 클래스를 만들고 해당 클래스를 테스트하는 클래스를 따로 만들었는데, 이번에는 한 파일에 클래스가 두 개 있습니다.
- BirthDay 클래스는 객체를 코드로 만든 클래스이고, ThisExample 클래스는 This 출력 값의 의미를 알기 위해 main( ) 함수를 포함하여 만든 테스트용 클래스입니다.
- 대부분 하나의 자바 파일에 클래스가 하나 있지만, 이번 예제처럼 하나의 파일에 클래스가 여러 개 존재할 수 있습니다.
- 하지만, public 클래스는 하나뿐이며 public 클래스는 자바 파일 이름과 이름이 같아야 합니다.
생성자에서 다른 생성자를 호출하는 this
- 클래스에 생성자가 여러 개 있을 때 어떤 생성자에서 다른 생성자를 호출하는 경우가 종종 있습니다.
- 이때 this 를 사용해 클래스의 생성자에서 다른 생성자를 호출할 수 있습니다.
- 예제 코드와 함께 이해해 보겠습니다.
package thisex;
class Person {
String name;
int age;
public Person() {
this("이름 없음", 1); // 아래에 있는 다른 생성자인 Person(String, int) 생성자 호출!
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class CalAnotherConst {
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( ) 디폴트 생성자가 호출되는 경우에는 초깃값으로 "이름 없음"과 1 값을 대입하고자 합니다.
- 디폴트 생성자 코드 안에서 직접 작성할 수도 있지만, 이미 아래 생성자에 코드가 있으므로, this 를 활용하여 호출하여 사용하는 것이 편리합니다.
- 그런데 this 로 다른 생성자를 호출할 때는 주의할 점이 하나 있습니다.
- this 를 사용하여 생성자를 호출하는 코드 이전에는 다른 코드를 넣을 수 없습니다. 다음 그림을 참조해주세요.

- 생성자는 클래스가 생성될 때 호출되므로 클래스 생성이 완료되지 않은 시점에 다른 코드가 있다면 오류가 발생하게 됩니다.
- 다른 말로 하자면, 디폴트 생성자에서 클래스의 생성이 완료되는 것이 아닌, this 를 사용해 다른 생성자를 호출하므로, 클래스가 생성되는 것은 this 를 사용한 다른 생성자의 호출 이후입니다. 그래서 this 를 사용해 다른 생성자를 호출하는 코드 이전에 다른 코드가 있으면 해당 코드는 클래스가 생성되지도 않은 상태에서 작동하는 코드이기 때문에 오류가 발생하게 됩니다.
자신의 주소를 반환하는 this
- this를 사용하여 생성된 클래스 자신의 주소 값을 반환할 수 있습니다.
- 인스턴스 주소 값을 반환할 때는 this를 사용하고 반환형은 클래스 자료형을 사용합니다.
package thisex;
class Person {
String name;
int age;
public Person() {
this("이름 없음", 1); // Person(String, int) 생성자 호출 이다!
}
Person returnItSelf() { // this 반환할 때 반환형은 자기자신 클래스형!
return this; // this 반환
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class CalAnotherConst {
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 를 사용하면 자신의 주소 값을 반환할 수 있다는 것을 알아 둡시다!