하나의 타입을 여러 형태로 표현할 수 있는 성질. 구체 클래스가 아니라 추상 타입으로 다룰 수 있는 상태를 말한다. 하나의 코드가 여러 자료형으로 실행되어 서로 다른 결과를 낸다.

나머지 원칙의 전제

다형성이 있어야 바꿔 끼울 수 있다. 그리고 바꿔 끼울 수 있어야 나머지가 성립한다.

의존성 주입은 주입해봐야 타입이 고정되어 있으면 소용이 없다. DIP가 말하는 상위와 하위가 모두 추상에 의존하는 구도가 곧 다형성이다. OCP도 기존 코드를 고치지 않고 새 구현을 추가하는 방법이 이것뿐이라 다형성에 기댄다.

추상 타입으로 받기

List<String> list = new ArrayList<>();   // ArrayList를 List로 표현

ArrayListList로 선언하면 List에 있는 기능만 쓸 수 있다. 기능이 줄어든 것처럼 보이지만 필요한 만큼만 보이게 걸러주는 것이고, 그래서 나중에 LinkedList로 바꿔도 쓰는 쪽이 깨지지 않는다.

Animal을 상속한 Human, Tiger, Eagle이 각각 move()를 재정의해두면 호출하는 코드는 하나로 끝난다. 동물이 새로 추가되어도 Animal 자료형 하나로 관리할 수 있다. 자료형마다 코드를 따로 쓰는 것보다 짧고, 고칠 곳도 적다.

접근하는 쪽에 따라 보이는 것이 달라지기도 한다. 카카오 로그인과 네이버 로그인이라는 구상체가 있고 Login 인터페이스가 있을 때, 구상체 타입으로 받으면 그 로그인만 할 수 있고 추상체 타입으로 받으면 무엇이 들어오든 로그인을 요청할 수 있다. 호출하는 쪽은 어떤 로그인인지 몰라도 되고, 알 필요도 없다.

관련

출처