본문 바로가기
JAVA

[JAVA] 다형성과 형변환 (상속과 참조변수, Up-casting, Down-casting)

by 민죠미 2023. 1. 3.

다형성이란?

객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 구체적으로, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다 는 것이다.

class Tv {
    boolean power;
    int channel;

    void power() {
        power = !power;
    }

    void channelUp() {
        ++channel;
    }

    void channelDown() {
        --channel;
    }
}
class CaptionTv extends Tv{
    String text;
    void caption(){...}
}

위와 같은 상속 관계의 클래스가 정의되어 있을 때, 아래와 같이 조상 타입의 참조변수로 자손 인스턴스를 참조할 수 있다.

Tv t = new CaptionTv();    //조상 타입의 참조변수로 자손 인스턴스를 참조
CaptionTv c = new Tv();    //컴파일 에러

인스턴스를 같은 타입의 참조변수로 참조하는 것과 조상타입의 참조변수로 참조하는 것은 어떤 차이가 있을까?

CaptionTv c = new CaptionTv();
Tv t = new CaptionTv();

위와 같이 CaptionTv인스턴스 2개를 생성하고, 참조변수 c와 t가 생성된 인스턴스를 하나씩 참조하도록 하였다.
이 경우 실제 인스턴스가 CaptionTv타입이라 할지라도, 참조 변수 t로는 CaptionTv인스턴스의 모든 멤버를 사용할 수 없다.

Tv타입의 참조변수로는 CaptionTv인스턴스 중에서 Tv클래스의 멤버들(상속받은 멤버포함)만 사용할 수 있다.
둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 다라 사용할 수 있는 멤버의 개수가 달라진다.

자손타입의 참조변수로 조상타입의 인스턴스를 참조하는 것은 존재하지 않는 멤버를 사용하고자 할 가능성이 있으므로 허용하지 않는다. 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스 멤버의 개수보다 같거나 적어야 한다

참조변수의 형변환

기본형 변수와 같이 참조변수도 형변환이 가능하나, 서로 상속관계에 있는 클래스 사이에서만 가능하다.

자손타입 --> 조상타입 (Up-casting) : 형변환 생략가능
자손타입 <-- 조상타입 (Down-casting) : 형변환 생략가능

Car 클래스를 상속받는 FireEngine 클래스가 있다고 가정하자

Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;

car = fe;	//car = (Car)fe;에서 형변환 생략됨. 업캐스팅
fe2 = (FireEngine)car;	//형변환 생략불가. 다운캐스팅

형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것 뿐이다.

Tv t = new CaptionTv(); 도 Tv t = (Tv)new CaptionTv(); 의 생략된 형태이다.

댓글