객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체 들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고 받고, 데이터를 처리할 수 있다. (협력)
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. (= 레고 블럭 조립하듯이)
자바 언어의 다형성을 활용
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스, 구현 객체
객체를 설계할 때 역할과 구현을 명확히 분리
객체 설계시 역할(인터페이스)를 먼저 부여하고, 역할을 수행하는 구현 객체 만들기
새로운 Model3 차량을 추가해야 하는 요구사항이 들어왔다. 요구사항을 맞추려면 기존에 Driver 코드를 많이 변경해야 한다.
자바에서set을 사용하면 자동적으로 생성해준다.
driver.setK3Car(null)을 통해서 기존 K3Car의 참조를 제거하고 driver.setModel3Car(model3Car)를 통해서 새로운 model3Car의 참조를 추가한다.
자동차의 운전자의 코드를 알아야 하는 단점이 있다.
-> 역할과 구현을 분리해야 한다.
다형성을 활용하면 역할과 구현을 분리해서, 클라이언트 코드의 변경 없이 구현 객체를 변경할 수 있다.
확장에는 열려있고, 변경에는 닫혀 있다는 뜻인데, 기존의 코드 수정 없이 새로운 기능을 추가할 수 있다는 의미다. OCP 원칙을 잘 지키고 있는 코드이다.
확장에 열려있다.
Car 인터페이스에 있는 클라이언트 코드인 Driver도 Car 인터페이스를 통해 자유롭게 호출할 수 있다.
코드 수정은 닫혀 있다
새로운 차를 추가하게 되면 기능 추가로 인해 기존 코드의 수정은 불가피하다.
변하지 않는 부분
Car인터페이스를 사용하는 클라이언트인 Driver의 코드를 수정하지 않아도 된다.
변하는 부분
main()과 같이 차를 생성하고, Driver에게 필요한 차를 전달해주는 역할은 코드 수정이 발생한다. main()은 전체 프로그램을 설정하고 조율하는 역할을 한다.
디자인 패턴 중에 가장 중요한 패턴이다. 알고리즘을 클라이언트 코드의 변경 없이 쉽게 교체할 수 있다. Car 인터페이스가 전략을 정의하는 인터페이스, 각각의 차량이 전략의 구체적인 구현, 전략을 클라이언트 코드(Driver)의 변경 없이 손쉽게 교체할 수 있다.