객체 지향 프로그램의 궁극의 핵심 = 다형성
자동차의 역할 = 인터페이스
운전자는 운전면허만 있으면 어떤 자동차든 운전할 수 있다.
운전자는 k3가 어떻게 작동하는지, 테슬라가 어떻게 작동하는지는 중요하지 않다.
운전자는 그 자동차가 자동차의 역할을 수행할 수 있다면,
전기로 가든지, 기름으로 가든지 상관없이 운전자는 그 자동차를 운전할 수 있다.
따라서 운전자는 자동차의 역할만 잘한다면, 자동차의 종류는 무한하더라도 상관없다.
즉, 클라이언트는
1) 대상의 인터페이스만 알면 된다.
2) 구현 대상의 내부구조를 몰라도 된다.
3) 구현 대상의 내부구조가 변경되어도 영향을 받지 않는다.
4) 구현 대상 자체를 변경해도 영향을 받지 않는다.
혼자 있는 객체는 없다 => 프로그램 시 관계부터 생각해서 코드를 짜자
유연성과 변경및 확장이 편해지기 위해서 역할과 구현을 분리해야 한다.
어떻게 역할과 구현을 분리하나?
다형성(polymorphism)을 이용
역할: 인터페이스
구현: 인터페이스를 구현한 클래스, 구현 객체
클라이언트를 변경하지않고 서버에서 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야한다.
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
인터페이스가 변하면, 이를 구현하는 구현체 뿐아니라 클라이언트, 서버 모두가 변경되야 한다.
그렇기에 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
1) 다형성이 가장 중요!
2) 스프링은 이러한 다형성의 장점을 극대화한다.
3) 스프링의 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용해
역할과 구현을 편리하게 다룰 수 있도록 지원한다.