유연하고 변경이 용이?
= 다형성
실세계와 객체 지향을 1:1로 매칭이 안되지만 그래도 실세계 비유가 이해하기엔 좋음
이 세상을 역할과 역할을 실제로 행하는 구현으로 세상을 구분한다고 가정한다. 역할이 인터페이스고 구현이 그 인터페이스를 실제로 구현한 객체라고 생각하면 된다. 운전자와 자동차 예제를 들어보자. 운전자라는 역할이 있고 자동차라는 역할이 있다. 자동차라는 역할을 K3, 아반떼, 테슬라 모델3 등으로 구현할 수 있다. 이는 이 자동차의 역할을 3개의 다른 자동차가 구현한 것이다. 운전자는 K3 를 타다 아반떼로 차를 바꿔도 당연히 운전을 할 수 있다. 자동차라는 역할의 구현만 바뀌었을 뿐 자동차가 바뀌어도 운전자에게 영향을 주지 않는다.
이게 유연하고 변경 용이하다는 의미. 구현체가 바뀌어도 역할이 같다면 영향을 주지 않는다. 이는 자동차 역할의 인터페이스를 따라서 자동차를 구현했기 때문에 운전자는 자동차 인터페이스, 역할만 알고 이에 대해서만 의존하면 된다.
이렇게 자동차라는 역할을 만들고 그 구현을 분리한 건 운전자를 위해서이다. 이 운전자를 클라이언트라고 하자. 클라이언트는 자동차의 내부 구조를 몰라도 되고, 구현체들이 내부적으로 바뀌더라도 자동차의 역할만 하고 있다면 클라이언트에게 영향을 안준다. 이는 다른 대상으로 변환이 가능하고 확장 가능하다는 것을 의미한다. 클라이언트에게 영향을 주지 않고 새로운 기능 제공이 가능하다. 역할과 구현으로 세상을 구분했기 때문에 가능한 것.
여기서 진짜 중요한 건 자동차 역할을 여러 개 구현할 수 있는게 아닌 새로운 자동차가 나와도 클라이언트는 새로 배우지 않아도 된다는 것에 있다. 클라이언트는 변화하지 않아도 된다.
정렬 알고리즘이 기능만 같다면 교체 가능하고 할인 정책 등의 로직도 기존 로직에서 정책이 바뀌어도 기존 코드를 변화하지 않고 구현이 가능하다.
역할과 구현으로 구분하면 세상이 단순해지고, 유연해지며 변경도 편리해진다.