Open leeho1110 opened 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
인터페이스를 통해 퍼블릭 인터페이스를 정의하지 않았다면 어땠을까요? Dog
의 shout()
와 Bear
의 shout
는 개념적으로 동일한 메시지지만 타입이 다르니 다른 메시지(dog.shout
, bear.shout
)로 남을겁니다. 심지어 Jookeeper
는 울음소리를 들려달라고 부탁할 동물마다 plzShout(Bear bear)
, plzShout(Dog dog)
처럼 계속 새로운 메서드를 정의해야 했겠죠.
하지만 우린 Shoutable
인터페이스를 통해 언제든 다른 인스턴스를 할당하고shout()
메서드에서 다른 응답(Roar!, woof-woof!)을 받아볼 수 있게 됐습니다. 심지어 Jookeeper.plzShout(Shoutable animal)
메서드는 들어오는 인자의 타입만 바꿔주면 퍼블릭 인터페이스를 수정하지 않고도 여러 동물들의 울음소리를 들을 수 있죠. Interface와 다형성을 잘 이용한다면 이렇게 소프트웨어의 유지보수성을 증대시킬 수 있습니다.
다형성이란 무엇일까요? 인터페이스를 사용해 다형성을 어떻게 다룰 수 있는지 설명해주세요.
키워드
다형성(Polymorphism)
,Public Interface
,Dependency Injection