Skip to main content

2. 객체지향 프로그래밍

01. 영화 예매 시스템#

요구사항 살펴보기#

  • 사용자는 영화가 아닌 상영을 예약합니다.
  • 할인액을 결정하는 두 가지 규칙이 존재합니다.
    • 할인 조건(discount condition)
    • 할인 정책(discount policy)

02. 객체지향 프로그래밍을 향해#

협력, 객체, 클래스#

  • 객체지향을 설계할 때는 두가지에 집중해야 합니다.
    • 첫째, 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민
    • 둘째, 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 동동체의 일원

도메인의 구조를 따르는 프로그램 구조#

  • 사용자가 프로그램을 사용하는 분야를 도메인(domain) 이라고 부릅니다.

클래스 구현하기#

자율적인 객체#

  • 객체가 상태(state)행동(behavior) 을 함께 가지는 복합적인 존재입니다.
  • 데이터와 기능을 객체 내부로 함께 묶는 것을 캡슐화라고 부릅니다.
    • 접근 제어 메커니즘을 제공합니다.
  • 캡슐화와 접근 제어는 객체를 두 부분으로 나눕니다.
    • 하나는 외부에서 접근 가능한 부분으로 이를 퍼블릭 인터페이스(public interface) 라고 부릅니다.
    • 다른 하나는 외부에서는 접근 불가능하고 오직 내부에서만 접근 가능한 부분으로 구현(implementation) 이라고 부릅니다.
    • 인터페이스와 구현의 분리 원칙은 훌륭한 객체지향 프로그램을 만들기 위해 따라야 하는 핵심 원칙입니다.

프로그래머의 자유#

  • 프로그래머의 역살을 클래스 작성자와 클라이언트 프로그래머로 구분하는 것이 유용합니다.
    • 클래스 작성자는 새로운 데이터 타입을 프로그램에 추가합니다.
    • 클라이언트 프로그래머는 클래스 작성자가 추가한 데이터 타입을 사용합니다.
  • 숨겨 놓은 부분에 대해 접근할 수 없도록 방지함으로, 영향을 걱정하지 않고 내부 구현을 마음대로 변경할 수 있으며 이를 구현 은닉이라고 부릅니다.
  • 설계가 필요한 이유는 변경을 관리하기 위해서 입니다.

협력하는 객체들의 공동체#

  • 시스템의 어떤 기능을 구현하기 위해 객체들 사이에 이뤄지는 상호작용을 협력(Collaboration)이라고 부릅니다.

협력에 관한 짧은 이야기#

  • 객체는 다른 객체의 인터페이스에 공개된 행동을 수행하도록 요청(request) 할 수 있고, 요청을 받은 객체는 자율적인 방법에 따라 요청을 처리한 후 응답(response) 합니다.
  • 수신된 메시지를 처리하기 위한 자신만의 방법을 메서드(method) 라고 부릅니다.
  • 메시지와 메서드의 구분에서 다형성 개념이 등장합니다.

03. 할인 요금 구하기#

할인 요금 계산을 위한 협력 시작하기#

  • 객체 지향의 상속(inheritance)다형성이 개념이 있으며, 그 기반에는 추상화(abstraction) 이라는 원리가 있습니다.

할인 정책과 할인 조건#

  • 추상 클래스(abstract class)로 구현했습니다.

  • 부모 클래스에 기본적인 알고리즘의 흐름을 구현하고 중간에 필요한 처리를 자식 클래스에게 위임하는 디자인 패턴을 TEMPLATE METHOD라고 부릅니다.

  • 오버라이딩은 부모 클래스에 정의된 같은 이름, 같은 파라미터 목록을 가진 메서드를 자식 클래스에서 재정의하는 경우를 의미합니다.

  • 오버로딩은 메서드의 이름은 같지만 제공되는 파라미터의 목록이 다릅니다.

할인 정책 구성하기#


04. 상속과 다형성#

컴파일 시간 의존성과 실행 시간 의존성#

  • 어떤 클래스가 다른 클래스로 접근할 수 있는 경로를 가지거나 호출할 경우, 의존성을 가진다고 합니다.
  • 코드의 의존성과 실행 시점의 의존성은 서로 다를 수 있습니다.

차이에 의한 프로그래밍#

  • 이전과 흡사한 클래스를 만들 때 좋은 방법은 재사용하는 것이고 이는 상속이라 불립니다.
  • 부모 클래스와 다른 부분만 추가해서 새로운 클래스를 쉽고 빠르게 만드는 방법을 차이에 의한 프로그래밍(programming by difference)라고 부릅니다.

상속과 인터페이스#

  • 상속이 가치 잇는 이유는 부모 클래스가 제공하는 모든 인터페이스를 자식 클래스가 물려받을 수 있기 때문입니다.
  • 자식 클래스가 부모 클래스를 업캐스팅(upcasting)이라고 부릅니다.

다형성#

  • 메시지를 수신하는 객체의 클래스가 무엇이냐에 따라 달리지는 것을 다형성이라고 부릅니다.
  • 메시지와 메서드를 실행시점에 바인딩 하는 것을 지연 바인딩(lazy binding) 또는 동적 바인딩(dynamic binding)이라 부릅니다.
  • 이와 반대로 전통적 함수 호출처럼 컴파일 시점에 실행될 함수나 프로시저를 결정하는 것은 초기 바인딩(early binding) 또는 정적 바인딩(static binding)이라고 부릅니다.

상속은 구현 상속과 인터페이스 상속으로 분류할 수 있습니다.

  • 구현 상속은 서브 클래싱(subclassing)이라 부릅니다.
  • 인터페이스 상속은 서브타이핑(subtyping)이라 부릅니다.
  • 대부분의 상속은 인터페이스 상속을 위해 사용해야 합니다.

인터페이스와 다형성#

  • 인터페이스를 통해, 다형적인 협력에 참여하는 클래스들의 공유 가능 외부 인터페이스를 정의합니다.

05. 추상화와 유연성#

추상화의 힘#

  • 재사용 설게의 기본을 이루는 디자인 패턴이나 프레임워크 모두 추상화를 이용해 상위 정책을 정의하는 객체지향의 메커니즘을 활용하고 있습니다.

유연한 설계#

  • 컨텍스트 독립성 개념을 통해 프레임워크와 같은 유연한 설계가 필수적인 분야에서 그 진가가 있습니다.

추상 클래스와 인터페이스 트레이드오프#

  • 고민을 하고 트레이드 오프하는 것이 중요합니다.

코드 재사용#

  • 상속보다는 합성이 좋은 방법이라는 이야기도 많습니다.
  • 합성은 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 재사용하는 방법을 의미합니다.

상속#

  • 상속은 객체지향에서 코드를 재사용하기 위해 널리 사용되는 기법입니다.
  • 그러나, 상속이 캡슐화를 위반한다는 것과 설계를 유연하지 못하게 만든다는 단점이 있습니다.

합성#

  • 인터페이스에 정의된 메시지를 통해서만 코드를 재사용하는 방법을 합성이라고 부릅니다.
Last updated on