Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions 정소민/chapter1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# 협력하는 사람들

## 요청과 응답으로 구성된 협력

- 요청과 응답을 통해 다른 사람과 협력함
- 요청을 받은 사람은 주어진 책임을 다하면서 필요한 지식이나 서비스 제공

## 역할과 책임

- 역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미
- 사람들이 협력을 위해 특정한 역할을 맡고 역할에 적합한 책임을 수행
1. 여러 사람이 동일한 역할 수행 가능
2. 역할은 대체 가능성을 의미
1. 두 명이 동일한 역할은 수행할 수 있다면 요청자 입장에서 둘 중 어떤 사람이 역할을 수행하더라도 문제 없음
3. 책임을 수행하는 방법은 자율적으로 선택 가능
1. 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 **다형성**이라 함
4. 한 사람이 동시에 여러 역할 수행 가능

# 역할, 책임, 협력

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

- 협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것임
- 객체도 실제 세계와 마찬가지로 자신에게 주어진 역할과 책임을 다하는 동시에 시스템의 더 큰 목적을 이루기 위해 다른 객체와도 적극적으로 협력함
- 목표(어플리케이션의 기능)는 더 작은 책임으로 분할되고 책임을 수행할 수 있는 적절한 역할을 가진 사람(객체)에 의해 수행됨
- 객체지향 설계라는 예술은 적절한 객체에게 적절할 책임을 할당하는 것
- 역할은 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소임
- 대체 가능한 역할과 책임은 다형성과도 깊이 연관됨

# 협력 속에 사는 객체

- 협력의 품질을 결정하는 것은 객체의 품질임
- 협력 공동체의 일원으로서 객체는 두 가지 덕목을 갖춰야 함
1. 객체는 충분히 ‘협력적’이어야 함
1. 객체는 다른 객체의 요청에 충실히 귀 기울이고 다른 객체에게 적극적으로 도움을 요청해야 함
2. 객체는 충분히 ‘자율적’이어야 함
1. 객체는 자신의 행동을 스스로 결정하고 책임져야 함

## 상태와 행동을 함께 지닌 자율적인 객체

- 객체는 자율적인 존재로 남기 위해 상태(static)와 행동(behavior)을 함께 지닌 실체라고 정의함
- 객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나옴
- 객체는 다른 객체가 ‘무엇’을 수행하는지는 알 수 있지만 ‘어떻게’ 수행하는지에 대해서는 알 수 없다.

## 메서드와 자율성

- 객체가 수신된 메시지를 자신만의 방법에 따라 자율적으로 처리하는 방법을 메서드라고 부른다.
- 외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘임.
- 이것은 **캡슐화** 개념과도 깊이 관련됨

# 객체지향의 본질

- 객체지향이란 시스템을 **자율적인 객체들의 공동체**로 보고 객체를 이용해 시스템을 분할하는 방법이다.
- 자율적인 객체란 **상태와 행위**를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다
- 객체는 시스템의 행위를 구현하기 위해 **다른 객체와 협력**함. 각 객체는 협력 내에서 정해진 **역할**을 수행하며 역할은 관련된 **책임의 집합**이다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 **메서드를 자율적으로 선택**함

## 객체를 지향하라

- 객체지향의 중심에는 클래스가 아니라 객체가 위치하며 중요한 것은 클래스의 정적인 관계가 아니라 메시지를 주고받는 객체들의 동적인 관계임
- 클래스의 구조와 메서드가 아니라 객체가 역할과 책임, 협력에 집중하라.

<aside>

목표는 **책임**을 수행할 수 있는 적절한 **역할**을 가진 객체들이 **협력**하며 수행됨

</aside>
89 changes: 89 additions & 0 deletions 정소민/chapter2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# 객체, 그리고 이상한 나라

- 객체는 상태를 가지며, 상태는 변경 가능하다.
- 상태를 결정하는 것은 행동이지만, 행동의 결과를 결정하는 것은 상태다.
- 행동의 순서가 결과에 영향을 미침
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.

# 객체, 그리고 소프트웨어 나라

## 상태

- 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다

### 상태와 프로퍼티

- 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
- 객체의 모든 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
- 이때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다.
- 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 ‘정적’이다.
- 반면 프로퍼티 값은 시간이 흐름에 따라 변경되기 때문에 ‘동적’이다.
- **객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 참조하는 링크의 두 가지 종류의 조합으로 표현할 수 있다.**
- 행동은 다른 객체로 하여금 간접적으로 객채의 상태를 변경하는 것을 가능하게 함
- 객체지향의 기본 사상은 상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것임
- 객체는 스스로의 **행동에 의해서만 상태가 변경되는 것을 보장**함으로써 **객체의 자율성을 유지**함

## 행동

### 상태와 행동

- 객체의 행동은 객체의 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존한다.
- 상태와 행동 사이의 관계
1. 객체의 행동은 상태에 영향을 받는다.
2. 객체의 행동은 상태를 변경시킨다.
- 행동을 두 가지 관점에서 서술
1. 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
2. 상호작용이 어떻게 현재의 상태를 변경시키는가

### 협력과 행동

- 객체의 행동으로 인해 발생하는 결과
1. 객체 자신의 상태 변경
2. 행동 내에서 협력하는 다른 객체에 대한 메세지 전송
- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동의 외부에 가시적이어야 함

### 상태 캡슐화

- 객체의 행동을 유발하는 것은 외부로부터 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정함
- 객체가 외부에 노출하는 것은 행동뿐이며 외부에서 접근할 수 있는 유일한 방법 역시 행동뿐임
- 상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 결과적으로 객체의 자율성을 높이고 협력을 단순하고 유연하게 만듦.

## 식별자

- 식별자란 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티임
- 값은 불변 상태를 가지기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스 비교함
- 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스 비교함

## 기계로서의 객체

- 객체 기계가 제공하는 버튼을 통해서만 상태에 접근할 수 있다는 점은 객체의 캡슐화를 강조
- 두 기계는 외부에 동일한 행동을 제공하고 현재 시점에 상태 역시 동일하더라도 두 기계는 구분된 별개의 객체로 인식함
- 이는 객체가 상태와 무관하게 구분 가능한 식별자를 가진다는 것
- 링크를 통해 연결된 두 기계가 메시지 전송을 통해 협력함
- 객체를 기계로서 바라보는 관점은 상태, 행동, 식별자에 대한 시각적인 이미지를 제공하고 캡슐화와 메시지를 통한 협력 관계를 효과적으로 설명함

## 행동이 상태를 결정한다

- 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼침

## 은유와 객체

- 객체지향 세계는 현실 세계의 단순한 모방이 아니다.

### 의인화

- 현실 객체와 소프트웨어 객체 사이의 가장 큰 차이는 현실 속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다는 것임
- 소프트웨어 객체가 현실 객체의 부분적인 특징을 모방하는 것이 아닌 현실 객체가 가지지 못한 추가적인 능력을 보유하게 됨
- 현실 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 **의인화**라고 부름
- 객체지향 세계은 현실의 추상화가 아니라 현실의 모습을 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것임

### 은유

- 현실 세계와 객체지향 세게 사이의 관계를 좀 더 정확하게 설명할 수 있는 단어는 **은유**이다.
- 현실 속의 객체의 이미 일부가 소프트웨어 객체로 전달되기 때문에 프로그램 내의 객체는 현실 속의 객체에 대한 은유이다
- 은유 관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다 → 이해하기 쉽고 유지보수 용이한 소프트웨어 창조 가능

> 객체지향 설계자로서 목적은 현실 모방이 아님.
객체의 특성을 잘 표현할 수 있도록 현실 속 객체의 이름를 이용해 객체를 묘사하라.
그렇지 않다면 깔끔하게 현실을 무시하고 자유롭게 우리만의 새로운 세계를 창조하자.
>
Loading