this와 super의 이해

this와 super의 이해

상속을 사용하게 되면 상위 클래스하위 클래스라는 개념이 등장하게 되며, 구성요소가 하나의 클래스에 존재하는 것이 아니라 여러 클래스에 나누어져 사용 시 합쳐지는 형태로 존재하게 된다.

이 문서에서는 자기자신과 상위클래스를 구분하기 위한 방법인 this와 super에 대해서 살펴본다.

예시 클래스 구현

이해를 돕기 위해 접근 제한자를 생략하고 같은 패키지에 구현한다.

Phone.java
public class Phone {
    String number;
    int price;
}
public class InheritanceExample01 {
    public static void main(String[] args){
        Iphone11 phone = new Iphone11();
        phone.number = "010-1111-2222";
        phone.price = 1000000;
        
        phone.print();
    }
}

main 메소드에서 phone 객체는 Iphone11 클래스 형태이지만, 상속을 받았기 때문에 Phone의 내용 또한 가지고 있는 상태이다. 이를 그림으로 표현하면 다음과 같다.

main에서는 다음 코드를 통해 number와 price를 설정하고 있다.

phone.number = "010-1111-2222";
phone.price = 1000000;

이 때, phone 객체는 다음과 같은 순서로 변수 등의 구성요소를 찾는다.

  1. 자기자신(this)이 가지고 있는 변수에서 number를 찾는다.

  2. 1번에서 찾지 못한 경우 상위 클래스(super)의 변수에서 number를 찾는다.

number 같은 경우는 문제가 없으나, price는 this와 super에 각각 존재하기 때문에 Iphone11(this)의 price에 설정되는 것을 결과로 확인할 수 있다.

this.number = 010-1111-2222
this.price = 1000000
super.price = 0

결론

가장 이상적인 방법은 this와 super를 명확히 구분할 필요가 없도록 구조를 설계하는 것이지만, this와 super가 필요한 상황은 반드시 존재하므로 이를 이용하여 상위 클래스와 자신의 구성요소를 구분해낼 수 있도록 연습이 필요하다.

extends를 이용한 상속을 단 하나만 받을 수 있는 이유도 super 키워드 사용 시의 모호성을 방지하기 위해서이며, 차상위(상위클래스의 상위클래스) 내용은 알 수 있는 방법이 없으므로 이용 시 주의해야 한다.

Last updated