반응형
객체지향 프로그래밍 1
클래스가 아닌 객체에 초점을 맞춰야 한다.
- 어떤 클래스가 필요한지 고민하기 전에 어떤 객체들이 필요한지 고민해야 한다.
- 클래스는 공통적인 상태와 행동을 공유하는 객체들을 추상화한 것
- 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지 먼저 결정해야 한다.
- 객체를 중심에 두는 접근 방법은 설계를 단순하고 깔끔하게 만든다.
- 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야 한다.
- 객체는 홀로 존재하는 것이 아니라, 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재다.
- 객체를 협력하는 공동체의 일원으로 바라보는 것은 설계를 유연하고 확장 가능하게 만든다.
프로그램의 구조는 도메인의 구조를 따른다.
도메인
: 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야
클래스의 경계를 구분짓자.
- 변수의 가시성은
private
, 메서드의 가시성은public
- 이는 클래스를 내부와 외부로 구분하여 어떤 부분을 외부에 공개하고 어떤 부분을 감출지 결정한다.
- 외부에서는 객체의 속성에 직접 접근할 수 없도록 막고, 적절한 public 메서드를 통해서만 내부 상태를 변경할 수 있게 해야 한다.
- 클래스의 내부와 외부를 구분지어야 하는 이유는?
- 결게의 명확성이 객체의 자율성을 보장한다.
- 프로그래머에게 구현의 자유를 제공한다.
자율적인 객체
- 객체는 상태와 행동을 함께 가지는 복합적인 존재이다.
- 객체는 스스로 판단하고 행동하는 자율적인 존재이다.
캡슐화
: 데이터와 기능을 객체 내부로 함께 묶는 것.- 객체 내부에 대한 접근을 통제하는 이유
- 객체를 자율적인 존재로 만들기 위해서
- 객체가 자율적인 존재로 우뚝 서기 위해서는 외부의 간섭을 최소화해야 한다.
- 외부에서는 객체가 어떤 상태에 놓여 있는지, 어떤 생각을 하는지 알면 안되며, 결정에 직접적으로 개입하려고 해서도 안된다.
인터페이스와 구현의 분리
협력
- 객체는 다른 객체의 인터페이스에 공개된 행동을 수행하도록 요청(request)할 수 있다.
- 요청을 받은 객체는 자율적인 방법에 따라 요청을 처리한 후 응답(response)한다.
메서드(method)
: 객체가 객체에게 메세지를 요청하였을 때, 수신된 메시지를 처리하기 위한 자신만의 방법
TEMPLATE MOTHED 패턴
TEMPLATE MOTHED
: 부모 클래스에 기본적인 알고리즘의 흐름을 구현하고 중간에 필요한 처리르 자식 클래스에게 위임하는 디자인 패턴- GOF94
생성자를 이용해 강제하자
public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
this.title = title;
this.runningTime = runningTime;
this.fee = fee;
this.discountPolicy = discountPolicy;
}
...
public DiscountPolicy(DiscountCondition ... conditions) {
this.conditions = Arrays.asList(conditions);
}
- 위 코드의 DiscountPolicy, DiscountCondition을 확인하자
- 할인 정책(discountPolicy)의 경우 단 하나만을 허용하고, 할인 조건(discountCondition)의 경우에는 여러가지의 조건을 받을 수 있도록 되어있다.
- 이처럼 생성자의 파라미터 목록을 이용해 초기화에 필요한 정보를 전달하도록 강제하면 올바른 상태를 가진 객체의 생성을 보장할 수 있다.
반응형
'ETC > 개발 지식' 카테고리의 다른 글
[CleanCode] 3장 함수 - 1 (0) | 2022.06.26 |
---|---|
[CleanCode] 2장 의미있는 이름 (0) | 2022.06.25 |
Cron 표현식 (0) | 2022.06.24 |
[Object] 객체지향 프로그래밍 2 (0) | 2022.05.16 |
[Object] 객체지향 설계 (0) | 2022.05.10 |
[Object] 객체와 설계 (0) | 2022.05.09 |