본문 바로가기
Java

[Java] 다형성

by eunoo 2022. 10. 13.

다형성이란?

여러 형태의 데이터를 가질 수 있는 능력.

자바에서 다형성을 잘 나타낸 것은 부모 클래스 타입의 참조변수가 자식 클래스 타입의 인스턴스를 참조할 수 있다는 것이다.

 

class Tv{
    boolean power;
    int channel;

    void power(){power= !power;}
    void channelUp(){++channel;}
    void channelDown(){--channel;}
    void method(){...}
}

class SmartTv extends Tv{
    String text;
    void caption(){...}
    void method(){...}// 오버라이드
}

다음과 같이 SmartTv 클래스는 Tv 클래스를 상속받았다.

Tv t1 = new SmartTv();
SmartTv t2 = new SmartTv();

같은 SmartTv의 인스턴스이지만 t1과 t2의 차이는 뭘까?

  • t1은 타입이 Tv 클래스이다. 즉, Tv 클래스의 멤버만 사용할 수 있다.
  • t2는 Tv 클래스의 멤버와 SmartTv 클래스의 멤버 모두 사용할 수 있다.

 

정리하자면 같은 클래스의 인스턴스이더라도 참조변수의 타입에 따라 사용할 수 있는 멤버가 다르다. 이것이 다형성의 핵심이다.

 

주의할 점: t1이 method()를 호출한다면?

  • 오버라이드된 SmartTv의 method()를 호출하는 것.

부모 타입인 참조변수가 메서드를 호출할 때, 보통 부모의 메서드를 호출하는 것이지만

오버라이딩한 메서드는 자식에서 호출하는 것이다.

 

참조변수의 형변환

자동 형변환 : 자식 타입을 부모 타입으로 변환할 때.

강제 형변환 : 부모 타입을 자식 타입으로 변환할 때. 단, 인스턴스가 자식일 때만 형변환을 할 수 있다.

 

Tv t = new SmartTv(); //자동 형변환

Tv t2 = new SmartTv();
SmartTv st1 = (SmartTv) t2; //강제 형변환

Tv t3= new Tv();
SmartTv st2 = (SmartTv) t3;//에러.부모 인스턴스가 자식 타입이 될 순 없음.

강제 형변환 시 참조변수가 참조하는 것이 자식 인스턴스일때만 가능하기 때문에 먼저 타입을 확인하는 작업이 필요하다.

이는 instanceof 연산자를 통해 타입을 확인할 수 있다.

void convert(Tv t){
    if(t instanceof SmartTv){//t가 SmartTv의 인스턴스인지 확인 후 강제 형변환
        SmartTv st = (SmartTv)t;
    }
}

 

이렇게 참조변수의 형변환을 통해 참조변수가 사용할 멤버의 개수를 조절할 수 있다.

 

다형성의 예시)

class Product{}
class Computer extends Product{}
class Tv extends Product{}
class Audio extends Product{}

class Buyer{
    Product cart[] = new Product[10];
    int i=0;
    void buy(Product p){
        cart[i++] = p;
    }
}

매개변수의 다형성

Buyer 클래스의 buy메서드를 보면 매개변수 타입이 Product이다. 

Computer 타입으로 정의하면 buy메서드에는 Computer만 들어올 수 있다. 그럼 또 Tv, Audio에 대한 buy메서드를 작성해주어야한다.

하지만 Product 타입으로 정의하면 매개변수로 Product의 자손 타입의 참조변수가 들어올 수 있기 때문에 하나의 메서드로 간단히 처리할 수 있다.

여러 종류의 객체를 하나의 배열로 다루기

부모 타입의 배열을 사용하면 여러 자식 객체를 하나로 묶어 사용할 수가 있다. 여러 종류의 객체를 하나의 배열로 묶을 수 있다는 소리다.

구입한 제품을 담기 위해 Buyer에 Product 배열인 cart을 작성하였다. 구입을 하면 제품이 배열 cart에 저장된다.

제품 클래스의 조상인 Product 타입의 배열을 사용함으로써 여러 종류의 제품들(Product의 자손들)하나의 배열로 관리할 수 있다.

 

'Java' 카테고리의 다른 글

[Java] 추상화 (feat. 추상 클래스)  (0) 2022.10.15
[Java] 캡슐화  (0) 2022.10.11
[Java] 인터페이스  (0) 2022.09.24
[Java] Eclipse 한글 깨짐 해결하기  (0) 2022.06.09

댓글