좋은 객체 지향 프로그래밍이란?
아직 네 가지 개념 모두 깊이 이해하고 있진 못하지만, 다형성에 대해서는 더 어렵게 느껴지고 있다. 그러던 중 김영한님의 스프링 강의를 듣고(?) 다형성에 대해 개념이 조금이나마 잡히게 되었다.
오버라이딩을 통한 개념은 @roy 의 발표 덕분에 어느정도 감이 잡히게 되었다. 따라서 이번엔 오버라이딩 외 다른 방향에 대해 이야기하고자 한다.
위키백과에서는 다형성을 다음과 같이 정의한다.
다형성 (polymorphism)은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수, 변수, 메서드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다.
처음 자바를 공부할 땐 우테코 프리코스와, 코쿼 프리코스 미션을 진행하는데에만 급급한 나머지, 상속이나 인터페이스를 사용할 줄 몰랐고, 하나의 객체가 다양한 자료형을 가질 수 있다는 말이 전혀 이해가 가지 않았다.(public static void 를 이용하여 메떼박 하던 시절....)
많은 개발자분들이 객체지향의 핵심을 다형성이라고 정의한다.
다형성을 이해하기 위해선 역할과 구현으로 세상을 구분할 줄 알아야 한다.
역할 : 인터페이스
구현 : 클래스
이렇게 생각하면 조금 쉽게 접근할 수 있다.
다형성이라는 개념을 실세계에 적용해보자.
한때 베스킨라빈스31에서 알바를 한 경험이 있기 때문에 베라를 예시로 들어보겠다.

위 그림은 손님, 아이스크림, 알바생 역할이 존재합니다.
손님이 아이스크림을 요청하면, 알바생은 아이스크림을 제공하는 책임을 가지게 되고 아이스크림을 제공한다.
-> 이 때 birdie가 아이스크림을 제공하는 경우와 roy가 아이스크림을 제공하는 경우는 아이스크림과 손님에게 어떠한 영향을 주지 않습니다.
즉 손님과 아이스크림은 알바생이라는 역할만 알고 있고, 알바생이 누구인지 구현은 알지 못하는 상태이다.
다형성을 이용한다면 이와같이 유연하고 변경이 유연하게 된다.
코드로 살펴보자.

코드를 보면 고객은 PartTimeJob과 IceCream의 추상 타입만 알고 있고, 구체 타입에 대해서는 전혀 알고 있지 못하다.
즉 누가 어떤 맛을 서빙을 해주는지는 고객은 알 수 없다.
위의 코드를 이렇게 바꾸면 더욱 유연한 코드 설계가 가능해진다. 
AppConfig 는 코드의 구성정보를 가지고 있는 클래스이다.

알바생 혹은 아이스크릠 맛을 바꾸고 싶다면, AppConfig 내에서 변경해주면 된다. AppConfig 내에서 코드를 변경하기 때문에 Customer는 코드의 변경에 자유롭고 다형성을 가지게 된다.
-> 확장에 열려있게 된다.
(더 많은 기능을 가진 인터페이스의 구현체를 만들면 되기 때문!)
내가 이해했다고 생각을 했지만, 내 머릿속에 있는 것을 표현해 낸다는 것이 얼마나 어려운 일인지 다시금 느낄 수 있었다.
혹시나 제가 잘못 이해한 부분이나 잘못된 부분이 있다면 지적 부탁드립니다(꾸벅)