Java this 키워드 완벽 가이드: 용도, 생성자, 실전 예제
Java this 키워드 완벽 해설
이 글에서는 Java의 this 키워드 목적, 일반적인 시나리오, 모범 사례를 명확한 실전 예제와 함께 다룹니다.
this란 무엇인가?
Java에서 this 키워드는 현재 클래스 인스턴스를 참조합니다. 주로 인스턴스 메서드나 생성자 내부에서 인스턴스 변수와 이름이 같은 매개변수를 구별할 때 사용합니다.
class Main { int instVar; Main(int instVar){ this.instVar = instVar; System.out.println("this reference = " + this); } public static void main(String[] args) { Main obj = new Main(8); System.out.println("object reference = " + obj); } }
출력:
this reference = Main@23fc625e object reference = Main@23fc625e
this와 변수 obj 모두 같은 객체 인스턴스를 가리키며, this가 현재 객체에 대한 참조임을 확인할 수 있습니다.
this를 사용하는 경우
이 키워드는 여러 일반적인 코딩 패턴에서 매우 유용합니다:
변수 이름 모호성 해결
Java는 매개변수가 인스턴스 변수와 이름을 공유하는 것을 허용하지만, this 없이는 컴파일러가 어느 것을 의도했는지 알 수 없습니다. 예를 들어:
class MyClass { int age; MyClass(int age){ age = age; } }
위 생성자에서 age = age는 매개변수를 자기 자신에게 할당하여 인스턴스 변수는 변경되지 않습니다. this를 사용하면 할당을 명확히 할 수 있습니다:
class Main { int age; Main(int age){ this.age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = " + obj.age); } }
출력:
obj.age = 8
매개변수 이름이 인스턴스 변수와 다르면 컴파일러가 암시적으로 this를 사용합니다:
class Main { int age; Main(int i) { age = i; } }
이는 this.age = i와 동일합니다.
게터와 세터에서 this 사용
세터와 게터는 필드와 같은 이름의 매개변수를 받는 경우가 많습니다. this는 올바른 변수를 대상으로 하게 합니다:
class Main { String name; // setter void setName(String name) { this.name = name; } // getter String getName(){ return this.name; } public static void main(String[] args) { Main obj = new Main(); obj.setName("Toshiba"); System.out.println("obj.name: " + obj.getName()); } }
출력:
obj.name: Toshiba
- 세터 내부에서 매개변수를 필드에 할당
- 게터 내부에서 필드 값 반환
this()를 이용한 생성자 오버로딩
한 생성자가 다른 생성자에게 위임해야 할 때, this()가 명시적 생성자 호출을 수행합니다:
class Complex { private int a, b; private Complex(int i, int j){ this.a = i; this.b = j; } private Complex(int i){ this(i, i); // 두 매개변수 생성자 호출 } private Complex(){ this(0); // 단일 매개변수 생성자 호출 } @Override public String toString(){ return this.a + " + " + this.b + "i"; } public static void main(String[] args) { Complex c1 = new Complex(2, 3); Complex c2 = new Complex(3); Complex c3 = new Complex(); System.out.println(c1); System.out.println(c2); System.out.println(c3); } }
출력:
2 + 3i 3 + 3i 0 + 0i
핵심 포인트:
- 생성자 간 중복 코드 감소
- 생성자 체이닝 시 약간의 성능 오버헤드 주의
참고: this()를 통한 명시적 생성자 호출은 생성자의 첫 번째 문장이어야 합니다.
this를 인수로 전달
this가 현재 객체에 대한 참조이므로, 다른 메서드에 전달하여 객체 상태를 수정하게 할 수 있습니다:
class ThisExample { int x; int y; ThisExample(int x, int y) { this.x = x; this.y = y; System.out.println("addTwo() 메서드에 this 전달 전:"); System.out.println("x = " + this.x + ", y = " + this.y); add(this); // 현재 인스턴스 전달 System.out.println("addTwo() 메서드에 this 전달 후:"); System.out.println("x = " + this.x + ", y = " + this.y); } void add(ThisExample o){ o.x += 2; o.y += 2; } } class Main { public static void main(String[] args) { new ThisExample(1, -2); } }
출력:
Before passing this to addTwo() method: x = 1, y = -2 After passing this to addTwo() method: x = 3, y = 0
여기서 add 메서드는 같은 객체 인스턴스를 받아 필드를 직접 업데이트합니다.