본문 바로가기
language/java

Java this / super 키워드 완벽 이해하기

by 죄니안죄니 2026. 5. 22.
반응형

Java this / super 키워드 완벽 이해하기

Java 객체지향 프로그래밍(OOP)을 배우다 보면 반드시 등장하는 키워드가 바로:

 
this
super
 

입니다.

초보 시절에는 보통:

this = 자기 자신
super = 부모 객체
 

정도로만 외우고 넘어가기 쉽습니다.

하지만 실제로는:

  • 객체 참조 구조
  • 메모리 구조
  • 상속 구조
  • 생성자 호출
  • 다형성

과 깊게 연결되는 매우 중요한 개념입니다.

실무에서도:

  • 생성자 체이닝
  • 부모 메서드 호출
  • 필드 충돌 해결
  • 객체 초기화

등에서 매우 자주 사용됩니다.

이번 글에서는:

  • this와 super의 진짜 의미
  • JVM 메모리 관점
  • 생성자 호출 구조
  • 상속과의 관계
  • 실무 사용 패턴

까지 정리해보겠습니다.


1. this란?

this는:

현재 객체 자신을 가리키는 참조(reference)

입니다.

예시:

 
public class User {

    String name;

    void print() {
        System.out.println(this.name);
    }
}
 

여기서 this는:

현재 User 객체
 

를 의미합니다.


2. this가 왜 필요할까?

대표적인 이유:

 
public User(String name) {
    this.name = name;
}
 

여기서:

표현의미
this.name 객체 필드
name 매개변수

입니다.

즉:

필드와 매개변수 구분
 

을 위해 사용.


3. this 없이 쓰면 어떻게 될까?

 
public User(String name) {
    name = name;
}
 

문제:

  • 매개변수끼리 대입
  • 객체 필드 초기화 안 됨

즉:

객체 필드는 여전히 null
 

상태.


4. this의 메모리 관점

예시:

 
User user = new User("Kim");
 

메모리:

Stack:
user -> 0x1000

Heap:
0x1000 -> User 객체
 

메서드 내부 this는:

0x1000
 

즉 현재 객체 주소를 참조.


5. this는 숨겨진 매개변수

실제로 JVM 관점에서는:

 
user.print();
 

호출 시 내부적으로:

 
print(user)
 

비슷하게 동작합니다.

즉:

현재 객체 참조 전달
 

되는 구조.


6. this() 생성자 호출

 
public class User {

    String name;
    int age;

    public User() {
        this("unknown", 0);
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
 

7. this() 의미

 
this(...)
 

의미:

현재 클래스의 다른 생성자 호출
 

입니다.


8. 생성자 체이닝(Constructor Chaining)

 
this()
 

를 통해:

  • 중복 제거
  • 초기화 로직 재사용

가능.

실무에서 매우 중요.


9. this() 사용 규칙

반드시:

생성자 첫 줄
 

에 위치해야 합니다.

불가능:

 
System.out.println("test");
this();
 

10. super란?

super는:

부모 클래스 객체 영역 참조

입니다.

예시:

 
class Animal {

    String name;
}

class Dog extends Animal {

    void test() {
        System.out.println(super.name);
    }
}
 

11. super의 진짜 의미

상속 구조에서:

현재 객체 내부 부모 영역 접근
 

입니다.

즉:

  • 별도 부모 객체 존재 X
  • 현재 객체 내부 부모 부분 접근

구조.


12. 상속 메모리 구조

 
Dog dog = new Dog();
 

메모리:

Heap:
Dog 객체 내부에
Animal 영역 포함
 

즉:

super = 부모 영역 접근
 

입니다.


13. super() 생성자 호출

 
class Animal {

    Animal() {
        System.out.println("Animal");
    }
}

class Dog extends Animal {

    Dog() {
        super();
        System.out.println("Dog");
    }
}
 

14. 실행 결과

Animal
Dog
 

15. 왜 부모 생성자가 먼저 실행될까?

자식 객체 내부에는:

부모 영역 포함
 

되어 있기 때문.

즉:

부모 초기화
↓
자식 초기화
 

순서 필요.


16. super()는 자동 호출된다

생성자에 작성하지 않아도:

 
super();
 

가 자동 삽입됩니다.

단:

부모 기본 생성자 존재 시
 

만 가능.


17. 부모 생성자 매개변수 전달

 
class Animal {

    Animal(String name) {

    }
}

class Dog extends Animal {

    Dog() {
        super("dog");
    }
}
 

18. super 메서드 호출

부모 메서드 실행 가능.

 
super.sound();
 

19. 오버라이딩과 super

 
class Animal {

    void sound() {
        System.out.println("동물");
    }
}

class Dog extends Animal {

    @Override
    void sound() {
        super.sound();
        System.out.println("멍멍");
    }
}
 

20. 실행 결과

동물
멍멍
 

21. this vs super 차이

키워드의미
this 현재 객체
super 부모 영역

22. this와 super는 참조(reference)

중요한 점:

객체 자체가 아니라 참조
 

입니다.

즉 JVM 내부적으로:

  • 메모리 주소 기반 접근

구조.


23. static에서는 this/super 사용 불가

 
static void test() {
    this.name;
}
 

불가능.

왜냐하면:

static은 객체 없이 실행
 

되기 때문.

즉:

현재 객체 없음
 

상태.


24. 실무에서 this 많이 쓰는 경우

대표 사례:

상황사용
생성자 초기화 this.field
생성자 체이닝 this()
메서드 체이닝 return this

25. 메서드 체이닝(Method Chaining)

 
builder.name("Kim")
       .age(20)
       .build();
 

내부적으로:

 
return this;
 

활용.


26. 실무에서 super 많이 쓰는 경우

대표 사례:

상황사용
부모 생성자 호출 super()
부모 메서드 호출 super.method()
오버라이딩 확장 부모 기능 재사용

27. 실무에서 자주 하는 실수

1) this와 지역 변수 혼동

 
name = name;
 

초기화 안 됨.


2) super() 호출 순서 문제

생성자 첫 줄 아니면 오류.


3) static에서 this 사용 시도

객체 없는 문맥에서는 불가능.


28. this와 객체지향

this는 사실상:

“현재 객체에게 메시지 보내기”
 

와 비슷한 개념입니다.

즉 객체지향 핵심 구조와 연결.


29. super와 상속 구조

super는:

상속 계층 구조 탐색
 

과 연결됩니다.

즉:

  • 부모 기능 재사용
  • 오버라이딩 확장
  • 생성자 연결

핵심 역할 수행.


30. 정리

Java의 this와 super는 단순 키워드가 아닙니다.

실제로는:

  • 객체 참조 구조
  • 상속 메모리 구조
  • 생성자 초기화
  • 다형성
  • 객체지향 설계

와 연결되는 핵심 개념입니다.

특히 실무에서는:

  • 생성자 체이닝
  • 부모 생성자 호출
  • 오버라이딩 확장
  • Builder 패턴

등에서 매우 중요하게 사용됩니다.

다음 글에서는:

오버라이딩(Overriding) vs 오버로딩(Overloading)

를 JVM 메서드 디스패치 관점까지 포함해서 정리해보겠습니다.

반응형

댓글