[Java] 5. 2 다형성

5. 2 다형성

상속은 형식을 확장성을 높이고 데이터 신뢰성을 높이는 OOP의 대표적인 특징입니다. 그리고 상속의 특징을 보다 효과적으로 살리기 위해 다형성을 제공합니다.

다형성은 같은 표현의 결과가 다양할 수 있다는 특징을 말합니다.

Java 언어에서 제공하는 다형성은 크게 형식의 다형성과 메서드의 다형성이 있습니다. 형식의 다형성은 기반 형식의 변수로 파생 형식의 개체를 참조할 수 있다는 것입니다. 그리고 메서드의 다형성은 개체를 참조하는 변수로 메서드를 사용하면 참조하는 개체 형식에 정의한 메서드가 동작하는 것을 말합니다.

예를 들어 기반 형식으로 음악가가 있고 음악가 형식을 기반으로 파생한 형식으로 피아니스트, 드러머 등이 있을 때 음악가 형식의 변수로 파생한 형식의 개체를 참조할 수 있다는 것입니다. 이러한 특징은 형식의 다형성입니다.

Musician musician = new Pianist(“홍길동”);

musician.play();

그리고 기반 형식에 정의한 메서드를 파생 형식에서 재정의하면 기반 형식의 변수로 해당 메서드를 호출하면 실제 참조하는 개체 형식에 정의한 메서드를 호출합니다. 예를 들어 기반 형식인 음악가에 play 메서드에서는 “랄라라”를 출력하게 정의한다고 가정합시다. 그리고 음악가를 기반으로 파생한 피아니스트에서는 play 메서드를 재정의하고 “딩동댕”을 출력한다고 가정합시다. 만약 음악가 형식의 변수에 피아니스트 개체를 생성한 후에 play 메서드를 호출하면 실제 참조하는 개체 형식인 피아니스트의 play 메서드가 동작하여 “딩동댕” 출력한다는 것입니다.

[소스 5.7] 다형성 예

public class Musician {
    public void play(){
        System.out.println("랄라라");
    }
}
public class Pianist extends Musician{
    @Override public void play(){
        System.out.println("딩동댕");
    }
}
public class Drummer extends Musician{
    @Override public void play(){
        System.out.println("두두둥");
    }
}
public class Program {
    public static void main(String[] args){
        Musician musician = new Musician();
        musician.play();
        musician = new Pianist();
        musician.play();
        musician = new Drummer();
        musician.play();
    }
}

실행 결과

랄라라
딩동댕
두두둥