- 도메인이란, 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야
- 클래스의 이름은 대응되는 도메인 개념의 이름과 동일하거나 유사하게 짓기
- 영화:
Movie - 상영:
Screening - 할인 정책:
DiscountPolicy - 금액 할인 정책:
AmountDiscountPolicy - 비율 할인 정책:
PercentDiscountPolicy - 할인 조건:
DiscountCondition - 순번 조건:
SequenceCondition - 기간 조건:
PeriodCondition - 예매:
Reservation
- 영화:
- 어떤 부분을 외부에 공개하고 어떤 부분을 감출지 결정하는 것이 핵심
- 적절한 public 메서드를 통해서만 내부 상태를 변경할 수 있게 해야 한다.
- 클래스의 내부와 외부를 구분하는 경계의 명확성이 객체의 자율성을 보장하고, 객체의 자율성이 프로그래머에게 구현의 자유를 제공한다. 그렇기 때문에 캡슐화를 잘 해야 한다.
- 객체 내부에 대한 접근을 통제하여 (public, protected, private) 객체를 자율적인 존재로 만든다.
- 인터페이스와 구현의 분리 (separation of interface and implementation)
- 퍼블릭 인터페이스 (public interface): 외부에서 접근 가능한 부분
- 구현 (implementation): 외부에서는 접근 불가능하고 오직 내부에서만 접근 가능한 부분
레이어라는 것은 결국 프로젝트 거시적인 관점에서의 캡슐화이다.
- 구현 은닉 (implementation hiding): 클래스 작성자는 클라이언트 프로그래머에게 필요한 부분만 공개하고 나머지는 꽁꽁 숨겨야 한다.
- 마치 BE 개발자가 FE 개발자에게 API를 제공하는 것과 같음
- FE 개발자는 API의 내부 구현 사항을 알 필요 없이 명세(인터페이스)만 보고 개발 가능
- BE 개발자는 public 영역을 변경하지 않는다면 코드를 자유롭게 수정할 수 있음.
- 변경될 가능성이 있는 세부적인 구현 내용을 private 영역 안에 감춤으로써 변경으로 인한 혼란을 최소화할 수 있다.
- 객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 메시지를 전송(send a message)하는 것뿐
- 메시지를 수신한 객체는 스스로의 결정에 따라 자율적으로 메시지를 처리할 방법을 결정한다. 수신된 메시지를 처리하기 위한 자신만의 방법을 메서드(method) 라고 부른다.
- 다형성(polymorphism) 의 개념은 메시지와 메서드의 구분에서부터 출발한다.
'메서드를 호출한다'보다는'메시지를 전송한다'라고 말하는 것이 더 적절한 표현이다. 메시지를 전송하는 객체 입장에서는, 상대 객체가 응답할 수 있다고 믿고 메시지를 전송할 뿐이다.- 왜냐면 외부에 인터페이스로써 노출되어 있기 때문!
- 메시지를 처리하는 방법(method)을 결정하는 것은 메시지를 수신한 객체 스스로의 문제이다.