
자바를 처음 배우는 입문자뿐만 아니라 실무자들에게도 this라는 키워드는 매우 친숙하면서도 가끔은 혼동을 주는 개념입니다. 특히 this 참조 변수와 this() 생성자 호출은 모양새는 비슷하지만, 그 용도와 작동 원리는 완전히 다릅니다. 이 차이를 명확히 이해하는 것은 코드의 가독성을 높이고 유지보수가 쉬운 객체 지향 설계를 하는 데 필수적입니다.
오늘은 자바 프로그래밍의 정교함을 더해줄 this와 this()의 핵심 차이점을 심층 분석해 보겠습니다.
1. this: 인스턴스 자신을 가리키는 '참조 변수'
this는 현재 실행되고 있는 인스턴스(객체) 자신에 대한 주소값을 담고 있는 참조 변수입니다. 주로 지역 변수와 멤버 변수의 이름이 같을 때, 이를 구분하기 위해 사용됩니다.
주요 특징과 사용 사례
- 멤버 변수와 매개변수의 구분: 생성자나 메서드에서 매개변수의 이름이 필드명과 같을 때
this.field형식을 사용하여 클래스의 필드임을 명시합니다. - 인스턴스 주소 전달: 메서드 내부에서 현재 객체의 참조를 다른 메서드에 인자로 전달할 때 사용합니다.
- 메서드 체이닝: 현재 인스턴스를 반환(return this)하여 여러 메서드를 연속적으로 호출하는 디자인 패턴에 활용됩니다.
2. this(): 생성자 간 호출을 위한 '생성자 호출문'
this()는 같은 클래스 내의 다른 생성자를 호출할 때 사용하는 특수한 문법입니다. 주로 코드의 중복을 제거하고 초기화 로직을 한곳으로 모으는 '생성자 체이닝(Constructor Chaining)'을 위해 사용됩니다.
반드시 지켜야 할 규칙
- 첫 번째 줄 위치:
this()는 반드시 생성자 블록의 첫 번째 줄에 위치해야 합니다. 그렇지 않으면 컴파일 에러가 발생합니다. - 재귀 호출 금지: 생성자가 자기 자신을 호출하거나, 서로를 무한히 호출하는 루프가 발생하지 않도록 설계해야 합니다.
public class Car {
String model;
String color;
public Car() {
this("기본모델", "흰색"); // 다른 생성자 호출
}
public Car(String model, String color) {
this.model = model; // this를 이용한 필드 초기화
this.color = color;
}
}
3. 한눈에 비교하는 this vs this()
두 개념의 차이점을 표를 통해 명확하게 정리해 보겠습니다.
| 구분 | this | this() |
|---|---|---|
| 정체 | 인스턴스 자신을 가리키는 참조 변수 | 같은 클래스의 다른 생성자 호출문 |
| 사용 위치 | 인스턴스 메서드, 생성자 내부 어디든 | 생성자 내부 첫 줄에서만 가능 |
| 사용 목적 | 멤버 변수 구분, 현재 인스턴스 참조 | 생성자 중복 코드 제거 (체이닝) |
| 문법적 형태 | this.변수명 / this.메서드명() | this(인자값, ...) |
4. 왜 this()는 반드시 첫 줄에 와야 할까?
자바 설계 원칙상, 객체가 생성될 때 부모 클래스의 생성자(super)나 다른 생성자가 가장 먼저 실행되어 인스턴스의 기본적인 초기화 상태를 보장해야 하기 때문입니다. 만약 중간에 호출을 허용한다면, 이미 수행된 초기화 작업이 덮어씌워지거나 객체 무결성이 깨질 위험이 있습니다.
5. 마무리하며
this가 객체의 '나'라는 정체성을 나타낸다면, this()는 객체를 효율적으로 '태어나게' 만드는 기술입니다. 이 두 개념을 올바르게 구분하여 사용하는 것만으로도 여러분의 자바 코드는 훨씬 더 전문적이고 구조적인 모습을 갖추게 될 것입니다.
내용 출처 및 참고 자료
- The Java™ Tutorials - Using the this Keyword (Oracle)
- Effective Java 3rd Edition (Joshua Bloch)
'Language > Java' 카테고리의 다른 글
| [JAVA] super와 super()의 완벽 분석: 부모 객체로 향하는 두 가지 통로 (0) | 2026.01.15 |
|---|---|
| [JAVA] Java 상속(Inheritance)을 사용하는 이유와 제한 사항: 효율적인 객체 지향 설계를 위한 가이드 (0) | 2026.01.15 |
| [JAVA] 생성자 오버로딩 : 유연한 객체 생성을 위한 설계의 미학 (0) | 2026.01.15 |
| [JAVA] 기본 생성자(Default Constructor)의 생성 조건과 내부 메커니즘 (0) | 2026.01.15 |
| [JAVA] 객체 탄생의 설계도, 생성자(Constructor)의 모든 것 (0) | 2026.01.15 |