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. 추상화와 유연성#
추상화의 힘- 재사용 설게의 기본을 이루는 디자인 패턴이나 프레임워크 모두 추상화를 이용해 상위 정책을 정의하는 객체지향의 메커니즘을 활용하고 있습니다.
#
유연한 설계- 컨텍스트 독립성 개념을 통해 프레임워크와 같은 유연한 설계가 필수적인 분야에서 그 진가가 있습니다.
#
추상 클래스와 인터페이스 트레이드오프- 고민을 하고 트레이드 오프하는 것이 중요합니다.
#
코드 재사용- 상속보다는 합성이 좋은 방법이라는 이야기도 많습니다.
- 합성은 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 재사용하는 방법을 의미합니다.
#
상속- 상속은 객체지향에서 코드를 재사용하기 위해 널리 사용되는 기법입니다.
- 그러나, 상속이 캡슐화를 위반한다는 것과 설계를 유연하지 못하게 만든다는 단점이 있습니다.
#
합성- 인터페이스에 정의된 메시지를 통해서만 코드를 재사용하는 방법을 합성이라고 부릅니다.