기본 이해
개념 정의
- this는 현재 실행 중인 메서드가 속한 객체 자신을 가리키는 참조 변수
- 인스턴스의 멤버 변수와 메서드를 참조하는데 사용
일상생활 비유
- 사람이 자신을 지칭할 때 "나"라고 하는 것처럼, 객체가 자신을 지칭할 때 "this"를 사용
작동 방식
public class Person {
private String name;
public Person(String name) {
this.name = name; // this로 멤버변수 참조
}
}
존재 이유와 목적
필요성
멤버변수와 매개변수의 이름이 같을 때 구분
public class Person {
private String name; // 멤버변수
private int age; // 멤버변수
// 매개변수와 멤버변수의 이름이 같을 때 this로 구분
public Person(String name, int age) {
this.name = name; // this.name은 멤버변수, name은 매개변수
this.age = age; // this.age는 멤버변수, age는 매개변수
}
}
생성자에서 다른 생성자 호출
생성자의 내부에서 this를 사용하면 해당 클래스가 참조되는데 this() 안에 넣은 변수에 따라 그 조건(매개변수)과 일치하는 다른 생성자가 호출된다.
즉, 원래 생성자를 만들 경우 클래스 내부의 생성자가 조건에 맞게 호출되는데 해당 생성자에서 this로 다시 클래스를 참조해서 생성자 부분을 추가로 가져오는 것이다.
public class Main { // 파일명은 Main.java로 저장
public static void main(String[] args) {
Person p = new Person(); // 기본 생성자 호출
}
}
class Person {
private String name;
private int age;
private String job;
// 생성자 1
public Person() {
this("Unknown");
System.out.println("생성자 1 실행 완료");
}
// 생성자 2
public Person(String name) {
this(name, 20);
System.out.println("생성자 2 실행 완료");
}
// 생성자 3
public Person(String name, int age) {
this(name, age, "무직");
System.out.println("생성자 3 실행 완료");
}
// 생성자 4
public Person(String name, int age, String job) {
this.name = name;
this.age = age;
this.job = job;
System.out.println("생성자 4 실행 완료");
}
}
///실행 과정
Person p = new Person(); // 기본 생성자 호출
// 실행 순서:
1. new Person() 호출
2. → this("Unknown")에 의해 Person(String) 호출
3. → this("Unknown", 20)에 의해 Person(String, int) 호출
4. → this("Unknown", 20, "무직")에 의해 Person(String, int, String) 호출
5. → 최종 생성자에서 필드 초기화
6. ← 다시 역순으로 돌아가며 각 생성자의 나머지 코드 실행
// 출력 결과:
생성자 4 실행 완료
생성자 3 실행 완료
생성자 2 실행 완료
생성자 1 실행 완료
메서드 체이닝 구현
메서드 체이닝(Method Chaining)은 객체의 메서드를 연속해서 호출할 수 있게 하는 패턴이다.
핵심은 메서드가 자기 자신(this)을 return(반환)하여 계속해서 다른 메서드를 호출할 수 있게 하는 것이다.
public class Main {
public static void main(String[] args) {
EmailBuilder builder = new EmailBuilder();
Email email = builder.setTo("recipient@example.com")
.setFrom("sender@example.com")
.setSubject("Hello")
.setBody("This is a test email")
.build();
// 결과 출력
System.out.println(email);
}
}
class EmailBuilder {
private String to;
private String from;
private String subject;
private String body;
public EmailBuilder setTo(String to) {
this.to = to;
return this;
}
public EmailBuilder setFrom(String from) {
this.from = from;
return this;
}
public EmailBuilder setSubject(String subject) {
this.subject = subject;
return this;
}
public EmailBuilder setBody(String body) {
this.body = body;
return this;
}
public Email build() {
return new Email(to, from, subject, body);
}
}
class Email {
private String to;
private String from;
private String subject;
private String body;
public Email(String to, String from, String subject, String body) {
this.to = to;
this.from = from;
this.subject = subject;
this.body = body;
}
// toString 메서드 오버라이드하여 이메일 정보 출력
@Override
public String toString() {
return "Email{" +
"to='" + to + '\'' +
", from='" + from + '\'' +
", subject='" + subject + '\'' +
", body='" + body + '\'' +
'}';
}
}
실제 역할
- 객체 자신의 참조를 전달
- 인스턴스 멤버에 대한 모호성 해결
- 메서드 연쇄 호출 지원
핵심 구성요소
주요 용도
- 인스턴스 멤버 참조
- 생성자 체이닝
- 메서드 체이닝
- 자신의 참조 반환
주의사항과 일반적 오류
일반적 실수
- static 메서드에서 this 사용 시도
- 불필요한 this 사용
- 생성자 체이닝 순환 참조
디버깅 포인트
- this 참조가 null인지 확인
- 생성자 체이닝 순서 확인
- 메모리 누수 여부 점검
비교 분석
특성 | this | super |
---|---|---|
참조 대상 | 현재 객체 | 부모 클래스 |
사용 범위 | 인스턴스 메서드/생성자 | 인스턴스 메서드/생성자 |
주요 용도 | 멤버 변수 접근, 생성자 체이닝 | 부모 메서드 호출, 부모 생성자 호출 |
static에서 사용 | 불가능 | 불가능 |
실무 활용
코드 예시
public class Builder {
private String field1;
private int field2;
public Builder setField1(String field1) {
this.field1 = field1;
return this; // 메서드 체이닝
}
public Builder setField2(int field2) {
this.field2 = field2;
return this;
}
}
베스트 프랙티스
- 명확한 구분이 필요할 때만 this 사용
- 빌더 패턴 구현시 활용
- 생성자 오버로딩시 체이닝 활용
연관 개념
이전 학습
- 객체지향 프로그래밍
- 클래스와 객체
- 생성자
후속 학습
- super 키워드
- 상속
- 메서드 오버라이딩
'Java > 자바 학습' 카테고리의 다른 글
자바의 부호/증감 연산자 (0) | 2025.05.19 |
---|---|
자바 싱글톤 패턴 (Singleton Pattern) (0) | 2025.05.18 |
break와 continue 상세 설명 (0) | 2025.05.18 |
자바의 제어문(조건문, 반복문, 분기문) (0) | 2025.05.18 |
연산자(Operators) (0) | 2025.05.18 |