객체지향 패러다임의 관점에서 핵심은 역할, 책임, 협력이다. 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다.
영화 예매 시스템에서 다양한 객체들이 영화 예매라는 기능을 구현하기 위해 메시지를 주고받으면서 상호작용한다. 이처럼 객체들이 기능을 구현하기 위해 수행하는 상호작용을 협력이라고 한다. 객체가 협력에 참여하기 위해 수행하는 로직은 책임이라고 한다. 객체들이 협력 안에서 수행하는 책임들이 모여서 객체가 수행하는 역할을 만든다.
메시지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일단 의사소통 수단이다. 객체는 다른 객체의 상세한 내부 구현에 직접 접근할 수 없기 때문에 오직 메시지 전송을 통해서 자신의 요청을 전달할 수 있다.
영화 예매 시스템에서 Screening
과 Movie
객체는 예매자의 요금을 계산하기 위해 협력한다. 요금 계산을 위해 Screening
은 Movie
에게 calculateMovieFee
메시지를 전송한다.
Screening
이 Movie
에게 계산을 위임하는 이유는 영화 요금을 계산하는데 필요한 정보들을 Movie
객체가 가장 잘 알고 있기 때문이다. 그리고 요금 계산을 Screening
객체가 한다면 Movie
의 내부 정보인 fee
와 discountPolicy
에 직접 접근해야 한다. 이 경우 Screening
이 Movie
의 내부 구현에 결합된다. 이런 식의 객체간의 결합은 각 객체의 자율성을 훼손한다.
객체를 자율적인 존재로 만드는 것은 변경에 대한 파급효과를 제한할 수 있기 때문에 중요하다. 객체를 자율적인 존재로 만드는 기본적인 방법은 객체를 캡슐화하는 것이다.
객체의 책임은 객체가 ‘무엇을 알고있는가’와 ‘무엇을 할 수 있는가’로 구성된다.
하는 것
아는 것
영화 예매 시스템에서 Screening
의 책임은 영화를 예매하는 것이다. Movie
의 책임은 요금을 계산하는 것이다.
Screening
이 reserve
메시지를 수신하고 movie
를 변수로 포함하는 이유는 영화를 예매할 책임을 수행해야 하기 때문이다. Movie
가 calculateMovieFee
메시지를 수신하고 fee
와 discountPolicy
를 가지는 이유는 영화 가격을 계산할 책임이 있기 때문이다.
객체지향 설계의 핵심은 객체에게 능숙하게 책임을 부여하는 것이다.
책에서는 객체의 책임을 상당히 강조한다. 객체에게 얼마나 적절한 책임을 할당하느냐가 설계의 전체적인 품질을 결정한다고 한다.
우리가 일상 생활에서 도움을 요청할 때, 그 일을 처리하는 데 필요한 지식과 방법을 가장 잘 알고 있는 전문가에게 도움을 요청한다. 객체지향의 세계에서도 비슷하다. 협력에 필요한 지식과 방법을 가장 잘 알고 있는 객체에게 도움을 요청한다. 그 요청에 응답하기 위해 필요한 행동이 이 객체가 수행할 책임으로 이어진다.
객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다.역할이 중요한 이유는 역할을 통해 유연하고 재사용 가능한 협력을 얻을 수 있기 때문이다.
영화 예매에서 Movie
가 가격을 계산할 때 할인 요금을 적용해야 한다. 이 때 할인 정책이 여러가지면 어떻게 해야 할까? 할인 정책을 적용해주는 객체를 여러개 만들고 개별적인 협력 관계를 만들어야 할까? 이렇게 기능을 구현하면 할인 적용 코드에서 많은 중복이 일어날 것이다. 코드 중복은 많은 문제를 일으키기 때문에 최대한 피해야 한다.
문제를 해결하기위해는 책임에 초점을 맞춰야 한다. 여러가지의 할인 정책을 적용해주는 객체들은 모두 할인 요금을 계산해주는 동일한 책임을 수행한다. 따라서 여러 객체들의 존재를 지우고 할인 요금을 계산하는 대표 객체를 만든다면 여러 개의 할인 정책을 하나로 통합해서 계산할 수 있을 것이다.
이번 장에서 객체들의 협력, 책임, 역할에 대해 공부했다. 가볍게 생각하면 각 단어들이 객체지향 프로그래밍에서 어떤 뜻으로 사용되는지 알기 힘들 수도 있다. 하지만 책에서는 영화 예매 시스템에 빗대서 단어들을 설명해주기 때문에 이해하는데 많은 도움이 됐다.
객체지향 프로그래밍에서 고려할 점 대부분의 사람들은 클래스를 결정한 후에 클래스에 어떤 데이터와 메서드를 만들지 생각한다.…
티켓 판매 어플리케이션 Chapter1에서 간단하게 티켓 판매 어플리케이션 구현을 해본다. 그리고 객체지향 설계가 안 된…