다형성(Polymorphism)

2023. 4. 23. 11:18JAVA/Language

다형성이란 무엇인가?

다형성은 역할과 구현이라는 개념을 분리한 기술이라고 생각합니다.  역할은 어떤 기능들을 수행할 수 있는 모음이고 실체가 존재하지 않는 개념입니다. 구현은 역할안에 있는 기능들을 실제로 수행하는 대상이라고 표현할 수 있습니다. 구현은 역할과는 다르게 실체를 가지고 있는 대상입니다. 즉, 정리하면 다음과 같습니다.

  • 다형성 : 역하과 구현 개념을 분리한 기술
  • 역할 : 어떤 기능들을 수행할 수 있는 모음
  • 구현 : 역할안에 있는 기능들을 실제로 수행하는 대상

 

다형성 비유

다형성을 비유하면 자동차로 비유할 수 있습니다. 운전자가 자동차를 운전할 때 소나타를 운전하다가 아반떼로 바꾸어 운전해도 큰 어려움이 없습니다. 왜냐하면 자동차의 기능인 엑셀, 브레이크와 같은 표준 기능들이 소나타나 아반떼가 동일하기 때문입니다.

 

운전자와 자동차 비유를 용어로 설명하면 운전자는 클라이언트, 여러 자동차들의 표준 기능을 나타낸 것을 역할, 실제 자동차인 소나타, 아반떼, K3와 같은 자동차들을 구현이라고 표현할 수 있습니다. 주목할 점은 다음 그림과 같이 자동차 역할은 실체를 가지고 있지 않은 추상적인 존재입니다. 그러나 소나타, 아반떼와 같은 구체적인 자동차들은 실체를 가지는 존재입니다.

 

 

역할과 구현의 분리

다형성의 비유에서와 같이 타입을 바라볼때 역할과 구현으로 분리하면 다음과 같은 장점이 있습니다.

  • 클라이언트(운전자)는 대상의 역할(자동차)만 알면 됩니다.
    • 예를 들어 운전자는 자동차의 역할인 엑셀, 브레이크와 같은 기능만 알면은 자동차를 운전할 수 있습니다.
  • 클라이언트는 구현 대상의 내부 구조를 몰라도 됩니다.
    • 운전자는 자동차의 엔진이 어떻게 작동하는지 몰라도 엑셀을 밟으면 자동차가 앞으로 나간다는 것을 알고만 있으면 됩니다.
  • 클라이언트는 구현 대상의 내부 구조가 변경되어 영향을 받지 않습니다.
    • 운전자는 자동차의 엔진을 교체되어 수리를 받아도 운전하는데는 지장이 없습니다.
  • 클라이언트구현 대상 자체를 변경해도 영향을 받지 않습니다.
    • 예를 들어 운전자가 소나타를 몰다가 K3로 바꾸어 운전해도 자동차를 운전할 수 있습니다.

 

자바 언어에서 역할과 구현의 분리 의미

자바 언어는 객체 지향 언어이므로 객체 지향 언어의 핵심 개념인 다형성을 지원합니다. 자바 언어에서는 다음과 같이 역할과 구현을 지원합니다.

  • 역할 = 인터페이스
  • 구현 = 인터페이스를 구현한 클래스, 구현 객체

자바에서는 객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만들 수 있습니다.

 

자바 코드로 표현하는 역할과 구현의 예시

코드로 표현하기 전에 다음과 같이 운전자(Driver), 자동차(Car), 실제 자동차(Sonata, Avante)를 설계할 수 있습니다.

 

위와 같은 설계를 기반으로 코드로 표현하면 다음과 같습니다.

class Driver{
    Car car;
    
    public Driver(Car car){
        this.car = car;
    }
    
    public drive(){
        car.accelSpeed();
    }
}

interface Car{
    void accelSpeed();
    void breakSpeed();
}

class Sonata implements Car{
    @Override
    public void accelSpeed(){
        // ...
    }
    
    @Override
    public void breakSpeed(){
        // ...
    }
}

class Avante implements Car{
    @Override
    public void accelSpeed(){
        // ...
    }
    
    @Override
    public void breakSpeed(){
        // ...
    }
}

 

자바 언어에서 인터페이스와 구현 클래스간에 참조

자바 언어에서는 인터페이스 타입의 객체는 인터페이스를 구현한 객체를 참조할 수 있습니다. 예를 들어 다음과 같이 Car 인터페이스 타입의 car 객체는 실제 구현 객체인 Sonata 객체를 참조할 수 있습니다.

 

Car car = new Sonata();
Car car = new Avante();
Driver driver = new Driver(car);
dirver.accelSpeed();

 

정리

객체 지향 언어에는 다형성이라는 기술이 있습니다. 다형성은 역할과 구현을 분리할 기술로써 역할과 구현을 자동차와 실제 자동차인 소나타나 아반떼와 같이 비유할 수 있습니다. 이렇게 역할 구현을 분리함으로써 새로운 실제 자동차를 쉽게 확장할 수 있고 새로운 자동차가 나오거나 실제 자동차의 내부 구현이 변경되어도 자동자를 운전하는 운전자에게 영향을 미치지 않게 할 수 있습니다. 

 

References

스프링 핵심 원리 - 기본편