객체지향 설계를 할 때 어떤 클래스가 필요한지가 아니라 어떤 객체가 필요한지 먼저 고민해야 한다. 말 그대로 "객체"를 지향하는 것이다. 다양한 객체를 상상하고 공통된 데이터와 기능을 갖는 것끼리 묶어 클래스를 만든다.
도메인이란 프로그래밍으로 문제를 해결할 분야다. 그리고 클래스 구조는 도메인 구조(로직)과 유사한 형태를 띠어야 한다. 예를 들어 영화예매 프로그램에서 도메인은 영화 예매다. 그리고 아래와 같이 도메인 구조와 동일한 형태로 클래스를 구성할 수 있다.
도메인 구조
- 예매 → 상영 → 영화 → 할인 정책 → 할인 조건
- 할인 정책 → 금액 학인 & 비율 할인
- 할인 조건 → 순번 할인 & 기간 할인
클래스 구조
- Reservation → Screening → Movie → DiscountPolicy → DiscountCondition
- DiscountPolicy → AmountDiscountPolicy & PercentDiscountPolicy
- DiscountCondition → SequenceCondition & PeriodCondition
클래스를 구현할 때는 내부와 외부를 나누는 경계를 명확히 해야 한다. Java에서는 내부 상태(속성, 데이터 등)는 private으로 설정해 외부에서 직접 접근하는 것을 막고, 적절한 public 메서드를 통해서만 내부 상태를 변경할 수 있도록 해야 한다. 이것은 캡슐화가 되어 있어 하나의 객체가 관련된 내부 상태와 기능을 모두 담고 있다는 것을 전제로 한다.
인스턴스 변수나 메서드 사이에 가시성을 구분하는 이유는 첫 번째로 객체의 자율성을 보장하기 위해서다. 예를 들어 지갑 객체(Wallet)가 있을 때 내부 상태인 현금(money)을 외부에서 직접적으로 변경하도록 하면 안된다. 이는 객체 스스로 판단하거나 행동하는 자율성을 해친다. 따라서 pay나 checkMoney와 같은 적절한 public 메서드로 지갑의 내부 상태(현금)을 변경하거나 현재 보유액을 확인해야 한다.
두 번째는 프로그래머의 편의를 위해서다. 개발자는 클래스 작성자와 이용자(클라이언트)로 나뉜다. 만약 이용자가 객체와 public 메서드로만 소통한다면, 클래스 작성자는 인터페이스(public)를 유지하는 한 내부 구현(implements, private)은 자유롭게 변경할 수 있다. 반대로 클래스 이용자도 복잡한 내부 구현을 몰라도 인터페이스만 알면 클래스를 사용할 수 있다.
'Language > 객체지향 설계' 카테고리의 다른 글
[page.49 ~ 65] 다형성 (0) | 2022.11.10 |
---|---|
[page.7 ~ 36] 캡슐화 (0) | 2022.11.10 |