1. this() — 생성자에서 다른 생성자 호출하기
Java에서는 한 클래스 안에서 여러 생성자를 만들 수 있다.
이때 중복 코드를 줄이기 위해 this()를 이용해 다른 생성자를 호출할 수 있다.
예제 코드
class Person {
String name;
int age;
// 매개변수 2개짜리 생성자
Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("매개변수 있는 생성자 호출됨");
}
// 기본 생성자
Person() {
this("이름 없음", 0); // 다른 생성자 호출
System.out.println("기본 생성자 호출됨");
}
}
public class ThisConstructorTest {
public static void main(String[] args) {
Person p1 = new Person();
}
}
실행 결과
매개변수 있는 생성자 호출됨
기본 생성자 호출됨
해석해보면,
- this("이름 없음", 0) 은 같은 클래스 안의 다른 생성자를 호출한다.
- 즉, Person()이 호출되면 내부에서 Person(String, int) 생성자가 먼저 실행된다.
- 그 후 "기본 생성자 호출됨"이 출력된다.
- this()는 반드시 생성자의 첫 줄에 있어야 한다!
👉 참고로 Person()을 그냥 비워둬도 기본생성자로서 동작하지만,
여기서는 “기본 생성자도 다른 생성자를 재활용할 수 있다”는 걸 보여주기 위해 사용한 예제다.
2. this — 현재 객체 자신을 가리키는 참조 변수
이제 this()와 다르게 괄호가 없는 this는
“현재 객체 자신”을 의미한다.
즉, 객체 스스로를 가리킬 때 사용된다.
예제 코드
class Dog {
String name;
Dog(String name) {
this.name = name;
}
void meet(Dog other) {
System.out.println(this.name + "가 " + other.name + "를 만났어!");
}
void meetItself() {
meet(this); // 자기 자신을 인자로 전달
}
}
public class ThisReferenceTest3 {
public static void main(String[] args) {
Dog dog = new Dog("바둑이");
dog.meetItself();
}
}
실행 결과
바둑이가 바둑이를 만났어!
코드 설명
구문 의미
| this.name = name; | 지역변수 name과 인스턴스 변수 name을 구분 |
| meet(this); | 자신의 객체 참조를 메서드 인자로 전달 |
| this.name | 현재 객체의 이름 필드 접근 |
- this는 현재 실행 중인 객체 자신을 가리킨다.
- meetItself() 내부에서 this를 인자로 넘기면,
meet(Dog other)의 매개변수 other로 자기 자신이 들어간다. - 결과적으로 this.name과 other.name이 같아 "바둑이가 바둑이를 만났어!"가 출력된다.
3. this() vs this 정리표
구분 형태 의미 사용 위치 예시
| 생성자 호출 | this() | 같은 클래스의 다른 생성자 호출 | 생성자 첫 줄 | this("홍길동", 25); |
| 참조 변수 | this | 현재 객체 자신 참조 | 인스턴스 메서드 내부 | this.name = name;, method(this); |
4. 정리
- this() 👉 생성자 재사용 (코드 중복 줄이기)
- this 👉 자기 자신을 참조 (객체 스스로를 가리킬 때)
두 개의 this는 형태는 비슷하지만 의미와 역할이 전혀 다르다.
생성자 안에서는 다른 생성자를 부르는 역할,
일반 메서드 안에서는 현재 객체 자신을 참조하는 역할을 한다.
결론
this는 자바 객체지향의 기본 중의 기본이다.
“나 자신을 가리키는 존재”로서, 객체의 정체성을 명확히 하고
생성자나 메서드에서 중복을 줄이거나 명확한 참조를 가능하게 해준다.

'Java' 카테고리의 다른 글
| [Java] 상속의 정의 (0) | 2025.10.17 |
|---|---|
| [Java] Java spring에서 안전한 객체 복사와 불변 설계 패턴 (0) | 2025.10.17 |
| [JAVA] 객체지향개념Ⅱ (0) | 2025.10.13 |
| [Java] 문자열 처리 성능비교 - String vs StringBuilder vs StringBuffer (0) | 2025.10.11 |
| [Java] 자바의 추상 클래스 vs 인터페이스 완전 정복 (0) | 2025.10.09 |