대부분의 사람들은 클래스를 결정한 후에 클래스에 어떤 데이터와 메서드를 만들지 생각한다. 하지만 객체지향 프로그래밍은 말 그대로 객체를 지향하는 것이다. 클래스가 아니라 객체에 설계 초점을 맞춰야 한다.
객체지향 프로그래밍을 하는 동안 집중해야할 것 두 가지
객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 메시지를 전송하는 것이다. 메시지를 수신한 객체는 자율적으로 메시지를 처리할 방법을 결정한다. 수신된 메시지를 처리하기 위한 자신만의 방법을 메서드라고 한다.
책의 예제 코드에서 Movie 클래스에는 할인 정책이 금액 할인인지, 비율 할인인지 판단하지 않는다. 그럼 어떻게 할인 정책을 선택할 수 있을까? 이 질문에 대답하려면 상속과 다형성을 알아야 한다.
먼저 의존성의 개념을 살펴보고 상속과 다형성을 알아보자.
객체들 사이의 의존성은 시점에 따라 조금 달라질 수 있다.
다시 말하면, 클래스 사이의 의존성과 객체 사이의 의존성은 동일하지 않을 수 있다.
책의 예제 코드에서 Movie 클래스는 DiscountPolicy 클래스와 연결되어 있다. 여기서 문제는 영화 요금을 계산 할때 AmountDiscountPolicy와 PercentDiscountPolicy 인스턴스가 필요하다는 것이다. 따라서 Movie 객체는 인스턴스 실행 시점에 AmountDiscountPolicy나 PercentDiscountPolicy 객체에 의존해야 한다. 하지만 코드 수준에서 Movie 클래스는 어느 것에도 의존하지 않는다.
그럼 Movie 객체는 어떻게 AmountDiscountPolicy나 PercentDiscountPolicy 객체와 협력할 수 있을까? 이 의문을 해결하려면 Movie 객체를 생성하는 코드를 봐야한다.
Movie avatar = new Movie( "아바타", Duration.ofMinutes(120), Money.wons(10000), new AmountDiscountPolicy() );
Movie avatar = new Movie( "타이타닉", Duration.ofMinutes(120), Money.wons(10000), new AmountDiscountPolicy() );
Movie 객체를 생성할 때 필요한 할인 정책 클래스를 생성해서 넣어주면 된다.
Movie 객체는 DiscountPolicy와 같은 타입의 객체에게 calculateDiscountAmount 메시지를 전송한다. 이 때 실행되는 메서드는 Movie 객체에 어떤 객체가 연결된 객체가 무엇인지에 따라 다르다.
Movie 객체는 동일한 메시지를 전송하지만 실제로 어떤 메서드가 실행될 것인지는 메시지를 수신하는 객체의 클래스가 무엇인지에 따라 달라진다. 이를 다형성이라고 부른다.
다형성이란 동일한 메시지를 수신했을 때 객체의 타입에 따라 다르게 응답할 수 있는 능력을 의미한다.
객체지향 패러다임의 관점에서 핵심은 역할, 책임, 협력이다. 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다. 영화…
티켓 판매 어플리케이션 Chapter1에서 간단하게 티켓 판매 어플리케이션 구현을 해본다. 그리고 객체지향 설계가 안 된…