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 메서드 디스패치 관점까지 포함해서 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| 객체지향 설계 원칙 SOLID 완벽 이해하기 (0) | 2026.05.22 |
|---|---|
| Java 오버라이딩(Overriding) vs 오버로딩(Overloading) 완벽 이해하기 (0) | 2026.05.22 |
| Java 접근 제어자(private/protected/public/default) 완벽 이해하기 (0) | 2026.05.22 |
| Java 추상 클래스(Abstract Class) vs 인터페이스(Interface) 완벽 이해하기 (0) | 2026.05.22 |
| Java 다형성(Polymorphism) 완벽 이해하기 (0) | 2026.05.22 |
댓글