Hyunebee

다형성 본문

Java/Java의 정석

다형성

Hyunebee 2022. 3. 5. 17:51

다형성

객체 지향에서 다형성은 여러 가지 형태를 가질 수 있는 능력을 의미한다. 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현하였다.

 

class Tv{
    boolean power;
    int channel;
    
    void power(){
        
    }
    
    void channelUp(){
        channel++;
    }
    
    void channelDown(){
        channel--;
    }
}

class CaptionTv extends Tv{
    String context;
    
    void caption() {
        
    }
}

Tv t = new Tv(); <  생성된 인스턴스는 인스턴스의 타입과 일치하는 타입의 참조변수 사용 

CaptionTV cTv = new CaptionTv();

 

Tv t = new Caption(); < 같은 타입의 참조변수 뿐만 아니라 자식타입의 참조변수 도 사용할 수 있다. 

그럼 CaptionTv cTv = new CaptionTv()와 다르점은 무엇일까 이 둘은 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다 Tv t = new Caption()는 CaptionTv의 context와 caption()을 사용할 수 없다.

하지만 CaptionTv cTv = new Tv()는 불가능하다. CaptionTv객체가 가지는 멤버가 더욱 많기 때문이다. 

 

참조 변수의 탕비이 참조변수가 참조하고 있는 인스턴스에서 사용할 수 있는 변수의 갯수를 결정한다.

 

즉 부모타입의 참조변수로 자손타입의 인스턴스를 참조할 수 이지만 자식 타입의 참조 변수로 부모 타입의 인스터스를 참조할 수 없다.

 

참조변수와 형변환

참조변수의 형변환은 서로 상속관계에 있는 클래스에서만 가능하다. 

자손타입 -> 부모타입 : 업캐스팅(형 변환 생략가능)

자손타입 <- 부모타입 : 다운캐스팅(형변환을 생략할 수 없다.)

 

여기서 중요한것은 형변환은 참조변수의 타입을 변경하는 것이지 인스턴스를 변환하는게 아니기 때문에 참조변수의 형변환은 인스턴스에 영향을 미치치 않는다. 단지 참조변수의 형변환을 통해서 인스턴스에서 사용할 수 있는 멤버의 갯수를 조절하는 것이다. 

 

만약 부모과 자손타입의 멤버 변수가 중복으로 정의된 경우는?

부모타입의 맴버변수를 사용한다면 부모타입의 멤버변수가 사용되고 자손타입의 맴버변수를 사용한다면 자손타입의 맴버변수가 사용된다. 

 

 

 

 

 

'Java > Java의 정석' 카테고리의 다른 글

Collection Framework  (0) 2022.03.06
abstract, interface  (0) 2022.03.06
제어자  (0) 2022.03.03
오버라이딩  (0) 2022.03.03
클래스간 관계 결정 - 상속과 포함  (0) 2022.03.03