this 키워드
java를 사용하다보면 this.~~ 방식으로 사용하는 키워드를 보게 됩니다. 단순하게는 객체 자기 자신을 가르킨다라고 생각하면 되는데요. 사용하다가 약간의 헷갈리는 부분이 생겨서 정리하게 됐습니다.
this 키워드의 역할
- 클래스가 인스턴스화 되었을 때 자기 자신의 메모리 주소를 담고 있는 키워드
- 인스턴스의 지역변수로 숨겨진 채로 존재한다
- 자신의 인스턴스 필드임을 명시하고자 할 때 사용한다
기본적인 사용법
public class Car {
private String name;
private int power;
public Car(String name, int power) {
this.name = name;
this.power = power;
}
}
기본적으로 생성자에서 주로 사용하게 되는데 전달받는 매개변수와 필드명이 동일하게 네이밍 하는 경우가 많습니다. 이때 정확하게 인스턴스의 필드명과 매개변수명을 구분하기 위해 this를 사용하게 됩니다.
상속관계에서의 this
제가 궁금했던 것은 상속관계에서 this를 사용할 경우 어떻게 되는가였습니다. 문제의 예시를 보시죠.
public class Car {
private String name;
private int power;
public Car (String name, int power) {
this.name = name;
this.power = power;
this.start();
}
public void start() {
System.out.println(0);
}
}
public class KiaCar extends Car {
public KiaCar (String name, int power) {
super(name, power);
System.out.println(2);
this.start();
}
public void start() {
System.out.println(3);
}
}
// 이 상태에서 new KiaCar("", 0);
// 결과값 : 3 2 3
처음 봤을 때는 당연히 0 2 3이 답이 될거라 생각했습니다. 그런데 3 2 3이 나왔습니다. 여기서 코드에서 생성한 객체는 KiaCar지 Car 객체가 아닌 것입니다. 위에 개념에서도 클래스를 인스턴스화 했을 때 만들어지는 것이 this이므로 this는 저 객체에 한해서 어디에서든 KiaCar입니다.
그렇다면 부모와 자식 모두 start라는 메서드를 가지고 있는데 부모의 생성자에서 왜 자식 메서드가 실행되는 걸까요? 이는 상속관계에서의 메소드 호출 순서에 따라 달라집니다.
상속관계 호출 순서
- 자식 객체에서 부모의 메서드 호출 시 자식 객체에서 해당 메서드를 찾고 없으면 부모의 메서드를 실행
이에 관해서 정확하진 않을 수 있지만 그림으로 보겠습니다.
위 그림과 코드를 보면서 하나씩 살펴보겠습니다.
- 자식 객체 생성자에서 부모의 생성자를 호출
- 부모의 생성자에서 this.start() 호출, 여기서 this는 KiaCar 객체
- KiaCar 객체의 start()를 찾고 없으면 부모 클래스의 start()를 호출
즉, this가 어떤 객체를 의미하는지를 정확히 알고 상속관계에서 호출 순서를 명확이 안다면 헷갈리지 않는 문제였습니다.
반응형
'기초 지식 > Java' 카테고리의 다른 글
[Java] Sealed Class (0) | 2021.10.20 |
---|---|
[Java] HashTable, ConcurrentHashMap에 대해서 (0) | 2021.09.28 |
[Java] HashMap에서 잠시 헷갈렸던 부분! (0) | 2021.09.09 |
[Java 15 ~] Record (2) | 2021.08.01 |
JVM에 관하여 (0) | 2021.07.24 |