JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Java/자바 학습

Java의 this 키워드

lamarcK 2025. 5. 18. 17:35

기본 이해

개념 정의

  • 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 + '\'' +
               '}';
    }
}

실제 역할

  • 객체 자신의 참조를 전달
  • 인스턴스 멤버에 대한 모호성 해결
  • 메서드 연쇄 호출 지원

핵심 구성요소

주요 용도

  1. 인스턴스 멤버 참조
  2. 생성자 체이닝
  3. 메서드 체이닝
  4. 자신의 참조 반환

주의사항과 일반적 오류

일반적 실수

  • 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;
    }
}

베스트 프랙티스

  1. 명확한 구분이 필요할 때만 this 사용
  2. 빌더 패턴 구현시 활용
  3. 생성자 오버로딩시 체이닝 활용

연관 개념

이전 학습

  • 객체지향 프로그래밍
  • 클래스와 객체
  • 생성자

후속 학습

  • super 키워드
  • 상속
  • 메서드 오버라이딩