happy-developers / dev-interview

1 stars 1 forks source link

[Java] 다형성이란 무엇일까요? 인터페이스를 사용해 다형성을 어떻게 다룰 수 있는지 설명해주세요. #49

Open leeho1110 opened 1 year ago

leeho1110 commented 1 year ago

다형성이란 무엇일까요? 인터페이스를 사용해 다형성을 어떻게 다룰 수 있는지 설명해주세요.

키워드

다형성(Polymorphism), Public Interface, Dependency Injection

leeho1110 commented 1 year ago

다형성이란?

다형성이란 多(많을 다), 形(모양 형), 性(성질 성)을 합친 단어로 많은 모형을 가질 수 있는 성질을 의미합니다. 객체지향 세계에서 바라보면 어떨까요? 하나의 객체가 여러 개의 모양을 가질 수 있다고도 해석할 수 있겠죠? 객체의 의사소통에 대입해보면 동일한 메시지를 수신하더라도 다르게 응답할 수 있다 는 성질이라는 의미가 됩니다.


인터페이스를 사용해 다형성을 잘 이용하는 법

객체지향 언어 중 하나인 Java에서는 Interface를 통해 객체가 소통하기 위해 필요한 퍼블릭 인터페이스(Public Interface)를 정의할 수 있습니다. 물론 인스턴스 메서드로도 의사소통이 가능하지만, 인터페이스를 사용하면 implements 한 타입은 반드시 해당 퍼블릭 인터페이스를 구현하게 만드는 이점이 있습니다.

그렇다면 이것이 다형성과 무슨 연관이 있을까요? 예를 들어 public void shout()라는 추상 메서드를 가지는 Shoutable 인터페이스를 implements하는 Bear, Dog 타입 객체가 있다고 가정하겠습니다. 이 때 Bear, Dog 타입은 서로 shout() 메서드를 다르게 구현할 수 있습니다. 하지만 둘다 Shoutable 인터페이스를 implements 했기 때문에 Bear, Dog 타입 인스턴스는 Shoutable 타입의 변수에 할당될 수 있죠.

public interface Shoutable {
    void shout();
}

public class Bear implements Shoutable {
    @Override
    public void shout(){
        System.out.println("Roar!");
    }
}

public class Dog mplements Shoutable {
    @Override
    public void shout(){
        System.out.println("woof-woof!");
    }
}

만약 동물원 사육사 객체가 울음소리를 낼 수 있는 동물들에게 "너희의 멋있는 울음 소리를 아이들에게 들려줘!" 라고 부탁했다면 우린 어떻게 표현할 수 있을까요? 아마 아래와 같이 표현할 수 있을 겁니다.

public class Zookeeper {

    public void plzShout(Shoutable animal){
        animal.shout();
    }
}

public static void main(String[] args) {
    Shoutable bear = new Bear();
    Shoutable dog = new Dog();

    Zookeeper zookeeper = new Zookeeper();
    zookeeper.plzShout(bear);
    zookeeper.plzShout(dog);

}

만약 우리가 Shoutable 인터페이스를 통해 퍼블릭 인터페이스를 정의하지 않았다면 어땠을까요? Dogshout()Bearshout는 개념적으로 동일한 메시지지만 타입이 다르니 다른 메시지(dog.shout, bear.shout)로 남을겁니다. 심지어 Jookeeper는 울음소리를 들려달라고 부탁할 동물마다 plzShout(Bear bear), plzShout(Dog dog)처럼 계속 새로운 메서드를 정의해야 했겠죠.

하지만 우린 Shoutable 인터페이스를 통해 언제든 다른 인스턴스를 할당하고shout() 메서드에서 다른 응답(Roar!, woof-woof!)을 받아볼 수 있게 됐습니다. 심지어 Jookeeper.plzShout(Shoutable animal) 메서드는 들어오는 인자의 타입만 바꿔주면 퍼블릭 인터페이스를 수정하지 않고도 여러 동물들의 울음소리를 들을 수 있죠. Interface와 다형성을 잘 이용한다면 이렇게 소프트웨어의 유지보수성을 증대시킬 수 있습니다.