📌15-1. 상속을 위한 두 클래스의 관계

무슨 관계를 맺고 있어야 상속 관계를 맺을 수 있을까?

<상속의 특성>
하위 클래스는 상위 클래스의 모든 특성을 지닌다.
거기에, 하위 클래스는 자신만의 추가적인 특성을 더하게 된다.

이렇듯, 상속 관계에 있는 두 대상은 IS-A 관계를 가져야 한다.

ex) A is a B : A는 일종의 B이다.
ex) 사과 is a 과일 : (사과)는 일종의 (과일)이다.

IS-A 관계는 상속의 기본 규칙을 정해주고 있다.


📌15-2. 메소드 오버라이딩

✅인스턴스의 참조 범위

부모 클래스의 참조 변수로 자식 클래스의 인스턴스를 참조할 수 있다.

그러나, 그러한 경우에 참조할 수 있는 범위가 달라진다.
부모 클래스의 참조 변수로 자식 클래스의 인스턴스를 참조하는 경우, 부모 클래스의 기능만 사용할 수 있다.

그의 역은 성립되지 않는다.

class SmartPhone extends MobilePhone {...}

MobilePhone phone = new SmartPhone(...);

물론 참조값은 자식 인스턴스의 참조값을 저장하고 있다.

부모 클래스의 인스턴스를 자식 클래스의 참조 변수로 참조할 수 없다는 사실이 더 나아가서 다음과 같은 성질도 있다.

CheeseCake ca1 = new CheeseCake();
Cake ca2 = ca1; // 가능

Cake ca3 = new CheeseCake();
CheeseCake ca4 = ca3; // 불가능

마지막 코드의 단계에서, 컴파일러 및 JVM은 ca3가 참조하는 대상이 Cake 인스턴스라고만 생각하기 때문에 실행되지 않는다.
정상적으로 실행되게 하기 위해서는, 명시적 형 변환이 필요하다.

✅메소드 오버라이딩

메소드 오버라이딩은 부모 클래스의 참조 변수로 자식 클래스의 인스턴스를 참조하는 경우에 발생한다.

부모 클래스와 자식 클래스에 이름, 반환형, 매개변수 선언이 모두 동일한 경우에 자식 클래스의 메소드는 부모 클래스의 메소드를 가리게 된다. 즉, 오버라이딩하게 된다.

따라서, c1.yummy()은 자식 클래스의 yummy()가 실행으로 이어진다.

이렇게 되면 앞에서 설명한, 부모 클래스의 참조 변수가 자식 클래스의 인스턴스를 참조하는 경우에 부모 클래스의 메소드에만 접근할 수 있다는 점이 깨지게 되는 것이다.

그렇다면 오버라이딩된 메소드는 어떻게 호출할 수 있을까?

오버라이딩된 메소드를 인스턴스의 외부에서 호출할 수 없다.
그러나, 자식 클래스의 인스턴스 내에서는 키워드 super를 통해 호출할 수 있다.

class Cake {
    public void yummy() {...}
}

class CheeseCake extends Cake {
    public void yummy() {
        super.yummy();
        ...
    }
}

📌15-3. instanceof 연산자

(ref) instanceof (ClassName)

instanceof 연산자는 true 혹은 false를 반환한다.

아래의 경우일 때, true를 반환한다.

  • refClassName 클래스의 인스턴스를 참조하는 경우
  • refClassName 클래스를 상속하는 클래스의 인스턴스를 참조하는 경우

즉, ref가 참조하는 인스턴스를 ClassName의 참조 변수로 참조 가능하지를 묻게 된다.

위의 코드는 instanceof 연산자를 활용하기 위한 예제 코드이다.
하지만, 우리가 실제로 같은 기능을 하는 코드를 좀더 쉽게 쓸 수 있다.

class Box {
    public void wrap() {...}
}
class PaperBox extends Box {
    public void wrap() {...}
}
class GoldPaperBox extends Box {
    public void wrap() {...}
}

public static void wrapBox(Box box) {
    box.wrap();
}

이처럼 메소드 오버라이딩을 사용하면 더 간결하게 작성할 수 있고 "상속은 공통적인 규약을 정의할 수 있다"는 의미도 되새겨볼 수 있다.


🔗강의 및 자료 출처

네이버 카페 || 윤성우의 프로그래밍 스터디그룹

profile
Hello World!

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN