티스토리 뷰

반응형

1장. 협력하는 객체들의 공동체 

역할, 책임, 협력

역할과 책임을 수행하며 협력하는 객체들 

객체지향 설계라는 예술은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다. 

책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소다. 

 

1. 여러 객체가 동일한 역할을 수행할 수 있다.

2. 역할은 대체 가능성을 의미한다.

3. 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다. 

4. 하나의 객체가 동시에 여러 역할을 수행할 수 있다. 

 

- 객체지향을 객체지향이라고 부르는 이유는 패러다임의 중심에 객체가 있기 때문이다. 협력에 참여하는 주체는 객체다. 

- 객체는 애플리케이션의 기능을 구현하기 위해 존재한다. 협력이 얼마나 조화를 이루는지를 결정하는 것은 객체다. 결국 협력의 품질을 결정하는 것은 객체의 품질이다. 

 

- 객체는 협력적, 자율적 이다. 

- 객체가 협력 속에서, 자율적인 존재로 남기 위해서는 행동과 상태를 함께 지니고 있어야한다. 

- 메시지(외부의 요청이 무엇인지 표현)와 메서드(요청을 처리하기 위한 방법)를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다.

- 첫번째 도전은 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하는 것이다. 

  중요한 것은, 어떤 클래스가 필요한가가 아니라, 어떤 객체들이 어떤 메시지를 주고받으며 협력하는 가다.

- 핵심은, 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력관계를 구축하는 것. 

 

2장. 이상한 나라의 객체

상태와 행동

객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다. 

- 객체의 행동은 상태에 영향을 받는다

- 객체의 행동은 상태를 변경시킨다.

 

식별자

어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티

 

행동이 상태를 결정한다. 

객체를 만드는 가장 중요 포인트는 상태가 아니라, 행동에 초점을 맞추는 것이다. 

 

소프트웨어 안에 구축되는 객체지향 세계는 현실을 모방하는 것이 아니라, 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것이다. 

 

3장. 타입과 추상화

추상화의 두 차원

공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만듬. -> 불필요한 세부사항 제거

 

개념

공통점을 기반으로 객체들을 묶기 위한 그릇.

객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다.

 

심볼 : 개념을 가리키는 명칭 (트럼프)

내연 : 객체가 개념에 속하는지 여부 확인 (몸이 납작하고 두손두발 귀퉁이에 달림)

외면 : 개념에 속하는 모든 객체의 집합 (정원사, 병사 하트잭 등등)

 

분류

객체는 소중하다. 따라서 객체를 최대한 직관적으로 분류하라. 

적절한 분류 체계는 애플리케이션을 다루는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 정신적인 지도를 제공한다. 

 

타입

타입의 정의는 개념의 정의와 동일하다. 타입은 공통점을 기반으로 객체들을 묶기 위한 틀이다.

객체의 타입을 결정하는 것은 객체의 행동뿐이다. 

 

캡슐화

훌륭한 객체지향 설계는 외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야한다. 데이터가 캡슐의 벽을 뚫고 객체의 인터페이스를 오염시키는 순간 객체의 분류체계는 위험에 노출되고 유연하지 못한 설계를 낳는다. 

 

객체를 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다. 이것이 객체를 객체답게 만드는 가장 핵심적인 원칙이다. 

 

타입의 목적

타입을 사용하는 이유는 인간의 인지 능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기가 너무 어렵기 때문이다. 

타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법이다. 

 

정적 모델과 동적 모델

동적 모델과 정적 모델의 구분은 실제로 프로그래밍이라는 행위와도 관련이 깊다. 여러분이 객체지향 프로그래밍 언어를 이용해 클래스를 작성하는 시점에는 시스템을 정적인 관점에서 접근하는 것이다. 그러나 실제로 애플리케이션을 실행해 객체의 상태 변경을 추적하고 디버깅하는 동안에는 객체의 동적인 모델을 탐험하고 있는 것이다. 

 

클래스

타입 : 객체를 분류하기 위해 사용하는 개념

클래스: 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나

 

객체를 분류하는 기준은 타입이며,

타입을 나누는 기준은 객체가 수행하는 행동이라는 사실을 기억하자.

객체를 분류하기 위해 타입을 결정한 후 프로그래밍 언어를 이용해 타입을 구현할 수 있는 한 가지 방법이 클래스라는 사실을 아는 것만으로도 충분하다. 

 

결국 객체지향에서 중요한것은 동적으로 변하는 객체의 상태와,

상태를 변경하는 행위다. 

클래스틑 타입을 구현하기 위해 프로그래밍 언어에서 제공하는 구현 메커니즘이다. 

반응형