본문 바로가기
ETC/개발 지식

[Object] 객체지향 프로그래밍 1

by heekng 2022. 5. 16.
반응형

객체지향 프로그래밍 1

클래스가 아닌 객체에 초점을 맞춰야 한다.

  1. 어떤 클래스가 필요한지 고민하기 전에 어떤 객체들이 필요한지 고민해야 한다.
    • 클래스는 공통적인 상태와 행동을 공유하는 객체들을 추상화한 것
    • 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지 먼저 결정해야 한다.
    • 객체를 중심에 두는 접근 방법은 설계를 단순하고 깔끔하게 만든다.
  2. 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야 한다.
    • 객체는 홀로 존재하는 것이 아니라, 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재다.
    • 객체를 협력하는 공동체의 일원으로 바라보는 것은 설계를 유연하고 확장 가능하게 만든다.

프로그램의 구조는 도메인의 구조를 따른다.

  • 도메인: 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야

클래스의 경계를 구분짓자.

  • 변수의 가시성은 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