diff --git "a/\354\240\225\354\206\214\353\257\274/chapter1.md" "b/\354\240\225\354\206\214\353\257\274/chapter1.md" new file mode 100644 index 0000000..d11d3a2 --- /dev/null +++ "b/\354\240\225\354\206\214\353\257\274/chapter1.md" @@ -0,0 +1,67 @@ +# 협력하는 사람들 + +## 요청과 응답으로 구성된 협력 + +- 요청과 응답을 통해 다른 사람과 협력함 +- 요청을 받은 사람은 주어진 책임을 다하면서 필요한 지식이나 서비스 제공 + +## 역할과 책임 + +- 역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미 +- 사람들이 협력을 위해 특정한 역할을 맡고 역할에 적합한 책임을 수행 + 1. 여러 사람이 동일한 역할 수행 가능 + 2. 역할은 대체 가능성을 의미 + 1. 두 명이 동일한 역할은 수행할 수 있다면 요청자 입장에서 둘 중 어떤 사람이 역할을 수행하더라도 문제 없음 + 3. 책임을 수행하는 방법은 자율적으로 선택 가능 + 1. 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 **다형성**이라 함 + 4. 한 사람이 동시에 여러 역할 수행 가능 + +# 역할, 책임, 협력 + +## 역할과 책임을 수행하며 협력하는 객체들 + +- 협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것임 +- 객체도 실제 세계와 마찬가지로 자신에게 주어진 역할과 책임을 다하는 동시에 시스템의 더 큰 목적을 이루기 위해 다른 객체와도 적극적으로 협력함 +- 목표(어플리케이션의 기능)는 더 작은 책임으로 분할되고 책임을 수행할 수 있는 적절한 역할을 가진 사람(객체)에 의해 수행됨 +- 객체지향 설계라는 예술은 적절한 객체에게 적절할 책임을 할당하는 것 +- 역할은 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소임 +- 대체 가능한 역할과 책임은 다형성과도 깊이 연관됨 + +# 협력 속에 사는 객체 + +- 협력의 품질을 결정하는 것은 객체의 품질임 +- 협력 공동체의 일원으로서 객체는 두 가지 덕목을 갖춰야 함 + 1. 객체는 충분히 ‘협력적’이어야 함 + 1. 객체는 다른 객체의 요청에 충실히 귀 기울이고 다른 객체에게 적극적으로 도움을 요청해야 함 + 2. 객체는 충분히 ‘자율적’이어야 함 + 1. 객체는 자신의 행동을 스스로 결정하고 책임져야 함 + +## 상태와 행동을 함께 지닌 자율적인 객체 + +- 객체는 자율적인 존재로 남기 위해 상태(static)와 행동(behavior)을 함께 지닌 실체라고 정의함 +- 객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나옴 +- 객체는 다른 객체가 ‘무엇’을 수행하는지는 알 수 있지만 ‘어떻게’ 수행하는지에 대해서는 알 수 없다. + +## 메서드와 자율성 + +- 객체가 수신된 메시지를 자신만의 방법에 따라 자율적으로 처리하는 방법을 메서드라고 부른다. +- 외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘임. +- 이것은 **캡슐화** 개념과도 깊이 관련됨 + +# 객체지향의 본질 + +- 객체지향이란 시스템을 **자율적인 객체들의 공동체**로 보고 객체를 이용해 시스템을 분할하는 방법이다. +- 자율적인 객체란 **상태와 행위**를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다 +- 객체는 시스템의 행위를 구현하기 위해 **다른 객체와 협력**함. 각 객체는 협력 내에서 정해진 **역할**을 수행하며 역할은 관련된 **책임의 집합**이다. +- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 **메서드를 자율적으로 선택**함 + +## 객체를 지향하라 + +- 객체지향의 중심에는 클래스가 아니라 객체가 위치하며 중요한 것은 클래스의 정적인 관계가 아니라 메시지를 주고받는 객체들의 동적인 관계임 +- 클래스의 구조와 메서드가 아니라 객체가 역할과 책임, 협력에 집중하라. + + \ No newline at end of file diff --git "a/\354\240\225\354\206\214\353\257\274/chapter2.md" "b/\354\240\225\354\206\214\353\257\274/chapter2.md" new file mode 100644 index 0000000..0c71246 --- /dev/null +++ "b/\354\240\225\354\206\214\353\257\274/chapter2.md" @@ -0,0 +1,89 @@ +# 객체, 그리고 이상한 나라 + +- 객체는 상태를 가지며, 상태는 변경 가능하다. +- 상태를 결정하는 것은 행동이지만, 행동의 결과를 결정하는 것은 상태다. +- 행동의 순서가 결과에 영향을 미침 +- 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다. + +# 객체, 그리고 소프트웨어 나라 + +## 상태 + +- 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다 + +### 상태와 프로퍼티 + +- 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다. +- 객체의 모든 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. +- 이때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다. +- 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 ‘정적’이다. +- 반면 프로퍼티 값은 시간이 흐름에 따라 변경되기 때문에 ‘동적’이다. +- **객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 참조하는 링크의 두 가지 종류의 조합으로 표현할 수 있다.** +- 행동은 다른 객체로 하여금 간접적으로 객채의 상태를 변경하는 것을 가능하게 함 +- 객체지향의 기본 사상은 상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것임 +- 객체는 스스로의 **행동에 의해서만 상태가 변경되는 것을 보장**함으로써 **객체의 자율성을 유지**함 + +## 행동 + +### 상태와 행동 + +- 객체의 행동은 객체의 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존한다. +- 상태와 행동 사이의 관계 + 1. 객체의 행동은 상태에 영향을 받는다. + 2. 객체의 행동은 상태를 변경시킨다. +- 행동을 두 가지 관점에서 서술 + 1. 상호작용이 현재의 상태에 어떤 방식으로 의존하는가 + 2. 상호작용이 어떻게 현재의 상태를 변경시키는가 + +### 협력과 행동 + +- 객체의 행동으로 인해 발생하는 결과 + 1. 객체 자신의 상태 변경 + 2. 행동 내에서 협력하는 다른 객체에 대한 메세지 전송 +- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동의 외부에 가시적이어야 함 + +### 상태 캡슐화 + +- 객체의 행동을 유발하는 것은 외부로부터 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정함 +- 객체가 외부에 노출하는 것은 행동뿐이며 외부에서 접근할 수 있는 유일한 방법 역시 행동뿐임 +- 상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 결과적으로 객체의 자율성을 높이고 협력을 단순하고 유연하게 만듦. + +## 식별자 + +- 식별자란 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티임 +- 값은 불변 상태를 가지기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스 비교함 +- 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스 비교함 + +## 기계로서의 객체 + +- 객체 기계가 제공하는 버튼을 통해서만 상태에 접근할 수 있다는 점은 객체의 캡슐화를 강조 +- 두 기계는 외부에 동일한 행동을 제공하고 현재 시점에 상태 역시 동일하더라도 두 기계는 구분된 별개의 객체로 인식함 + - 이는 객체가 상태와 무관하게 구분 가능한 식별자를 가진다는 것 +- 링크를 통해 연결된 두 기계가 메시지 전송을 통해 협력함 +- 객체를 기계로서 바라보는 관점은 상태, 행동, 식별자에 대한 시각적인 이미지를 제공하고 캡슐화와 메시지를 통한 협력 관계를 효과적으로 설명함 + +## 행동이 상태를 결정한다 + +- 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼침 + +## 은유와 객체 + +- 객체지향 세계는 현실 세계의 단순한 모방이 아니다. + +### 의인화 + +- 현실 객체와 소프트웨어 객체 사이의 가장 큰 차이는 현실 속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다는 것임 +- 소프트웨어 객체가 현실 객체의 부분적인 특징을 모방하는 것이 아닌 현실 객체가 가지지 못한 추가적인 능력을 보유하게 됨 +- 현실 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 **의인화**라고 부름 +- 객체지향 세계은 현실의 추상화가 아니라 현실의 모습을 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것임 + +### 은유 + +- 현실 세계와 객체지향 세게 사이의 관계를 좀 더 정확하게 설명할 수 있는 단어는 **은유**이다. +- 현실 속의 객체의 이미 일부가 소프트웨어 객체로 전달되기 때문에 프로그램 내의 객체는 현실 속의 객체에 대한 은유이다 +- 은유 관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다 → 이해하기 쉽고 유지보수 용이한 소프트웨어 창조 가능 + +> 객체지향 설계자로서 목적은 현실 모방이 아님. +객체의 특성을 잘 표현할 수 있도록 현실 속 객체의 이름를 이용해 객체를 묘사하라. +그렇지 않다면 깔끔하게 현실을 무시하고 자유롭게 우리만의 새로운 세계를 창조하자. +> \ No newline at end of file diff --git "a/\354\240\225\354\206\214\353\257\274/chapter3.md" "b/\354\240\225\354\206\214\353\257\274/chapter3.md" new file mode 100644 index 0000000..35cb8d7 --- /dev/null +++ "b/\354\240\225\354\206\214\353\257\274/chapter3.md" @@ -0,0 +1,153 @@ +# 추상화를 통한 복잡성 극복 + + + +- 객체지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복함 + +## 객체지향과 추상화 + +### 개념 + +- 앨리스는 정원에 있는 인물들을 트럼프의 그룹과 토끼의 그룹으로 나눔 +- 앨리스는 인물들의 차이점을 의도적으로 무시하고 공통점만을 강조함으로써 ‘트럼프’라는 그룹에 속할 수 있는 인물들을 취사선택함 +- 인물들의 차이점을 무시하고 공통점만을 취해 트럼프라는 개념으로 단순화한 것은 추상화의 일종임 +- 공통점을 기반으로 객체들을 묶기 위한 그릇을 **개념**이라고 한다. +- 개념을 이용하면 객체를 여러 그룹으로 **분류**할 수 있음 +- 객체란 특정 개념을 적용할 수 있는 구체적인 사물을 의미함 +- 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 **인스턴스**라고 한다. + +### 개념의 세 가지 관점 + +- 심볼: 개념을 가리키는 간략한 이름이나 명칭 + + (트럼프, 토끼) + +- 내연: **개념의 완전한 정의**를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있음 + + (몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려있다는 트럼프에 대한 설명) + +- 외연: 개념에 속하는 모든 객체의 집합, 개념의 인스턴스들이 모여 이뤄진 집합 + + (정원사, 병사, 신하, 왕자와 공주, 하겍으로 참석한 왕과 왕비들, 하트잭, 하트왕과 하트왕비) + +- 개념이 심볼, 내연, 외연으로 구성돼 있다는 사실보다는 개념을 이용해 객체를 분류할 수 있다는 사실이 더 중요함 + +### 객체를 분류하기 위한 틀 + +- 분류란 객체에 특정한 개념을 적용하는 작업 +- 객체에 어떤 개념을 적용할 것인지를 결정하는 것은 결국 객체들을 개념에 따라 분류하는 것과 동일함 +- **객체를 적절한 개념에 따라 분류**한 애플리케이션은 유지보수가 용이하고 변경에 유연하게 대처 가능 + +### 분류는 추상화를 위한 도구다 + +- 정원사, 병사, 신하, 왕자와 공주, 하겍으로 참석한 왕과 왕비들, 하트잭, 하트왕과 하트왕비를 트럼프라는 개념으로 묶은 것은 개별 객체 간의 차이점은 무시하고 공통점은 취한 결과다 +- 따라서 **개념은 추상화의 첫 번째 차원인 일반화를 적용한 결과**다 +- **개념은 객체들의 복잡성을 극복하기 위한 추상화 도구**다 + +## 타입 + +### 타입은 개념이다 + +- 타입은 개념과 동일하다 +- 타입이란 객체에 적용할 수 있는 아이디어나 관념을 의미한다 +- 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다. + +### 객체와 타입 + +- 객체가 협력을 위해 어떤 책임을 지녀야 하는지를 결정하는 것이 객체지향 설계의 핵심이다. +- 다음 두 가지 조언으로부터 객체지향 설계에 대한 중요한 원칙을 이끌어 낼 수 있음 + 1. **어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다** + 1. 어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다 + 2. **객체의 내부적인 표현은 외부로부터 철저하게 감춰진다** + 1. 객체의 행동을 가장 효과적으로 수행할 수만 있다면 객체 내부의 상태를 어떤 방식으로 표현하더라도 무방하다 + +### 행동이 우선이다 + +- **객체의 타입을 결정하는 것은 객체의 행동뿐**이다 +- 동일한 타입에 속한 객체는 내부의 표현 방식이 다르기 때문에 동일한 메시지를 처리하는 방식은 서로 다를 수밖에 없음 → **다형성** +- 다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력임 +- 다형적인 객체들은 동일한 타입에 속함 + +--- + +- 객체의 타입을 결정하는 것은 객체의 행동뿐이므로 외부로부터 데이터를 감춰야 함 +- 훌륭한 객체지향 설계는 외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야 한다 → **캡슐화** +- 캡슐화는 객체를 행동에 따라 분류하기 위해 지켜야 하는 기본적인 원칙이다. + +--- + +- 객체가 외부에 제공해야 하는 책임을 먼저 결정하고 그 책임을 수행하는 데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 캡슐화 해야한다 +- 데이터를 먼저 결정하고 객체의 책임을 결정하는 방법은 유연하지 못한 설계임 +- **책임-주도 설계**라는 객체지향 설계 방법은 데이터-주도 설계 방법의 단점을 개선하기 위해 고안됨 + +> 객체를 결정하는 것은 행동이다. 데이터는 단지 행동을 따를 뿐이다 +> + +## 타입의 계층 + +- 트럼프는 트럼프 인간을 포괄하는 좀 더 일반적인 개념이다. +- 트럼프 인간은 트럼프보다 좀 더 특화된 행동을 하는 특수한 개념이다 +- 두 개념 사이의 관계를 일반화/특수화 관계라고 한다 + +### 일반화/특수화 관계 + +- 객체지향에서 일반화/특수화 관계를 결정하는 것은 객체의 상태를 표현하는 데이터가 아니라 행동임 +- 일반화/특수화 관계가 성립하려면 한 타입이 다른 타입보다 더 특수하게 행동해야 하고, 반대로 한 타입은 다른 타입보다 더 일반적으로 행동해야 함 +- 특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행할 수 있어야 함 +- 일반화/특수화 관계에서 일반적인 타입은 특수한 타입보다 더 적은 수의 행동을 가지지만 더 큰 크기의 외연 집합을 가진다 + +![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/4bad1fe2-f73e-41d3-b5e9-0072cd6b7716/98812349-edd9-4af9-9405-123c7e02d73f/image.png) + +### 슈퍼타입과 서브타입 + +- 일반적인 타입을 슈퍼타입, 특수한 타입을 서브타입이라 함 +- 서브타입은 슈퍼타입의 행위와 호환되기 때문에 서브타입은 슈퍼타입을 대체할 수 있어야 함 +- 서브타입은 슈퍼타입의 행위에 추가적으로 특수한 자신만의 행동을 추가하는 것이므로 슈퍼타입의 행동은 서브타입에게 자동으로 상속된다 + +![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/4bad1fe2-f73e-41d3-b5e9-0072cd6b7716/a25ecce5-d820-414f-a173-2c623e5e65f5/image.png) + +### 일반화는 추상화를 위한 도구다 + +- 정원에 있던 인물들의 차이점은 무시하고 공통점은 취함으로써 공통의 타입인 트럼프 인간으로 분류함 +- 트럼프 인간을 단순한 관점에서 바라보기 위해 불필요한 특성을 배제하고 더 포괄적인 의미를 지닌 트럼프로 일반화함 +- **일반화/특수화 계층은 객체지향 패러다임에서 추상화의 두 번째 차원을 적절하게 활용하는 대표적인 예**임 + +## 정적 모델 + +### 타입의 목적 + +- 타입을 사용하는 이유는 인간의 인지 능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기가 너무 어렵기 때문 +- 타입은 시간에 따라 동적으로 변하는 앨리스의 상태를 시간과 독립적인 정적인 모습으로 다룰 수 있게 해줌 +- 시간이라는 복잡성 제거함 + +![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/4bad1fe2-f73e-41d3-b5e9-0072cd6b7716/caddb4d5-c7d9-471b-9668-1b1bd653c476/image.png) + +### 타입은 추상화다 + +- 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다 +- 타입은 시간에 따른 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법임 + +### 동적 모델과 정적 모델 + +- 객체지향 모델링을 위한 표준 언어인 UML에서 스냅샷은 객체 다이어그램(object diagram)[Fowler 2003]이라고도 불린다. 스냅샷처럼 실제로 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 포착하는 것을 ***동적 모델(***dynamic model)이라고 한다. +- 다른 하나는 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 것이다. 일반적으로 이런 모델을 타입 모델(type diagram)이라고한다.이 모델은 동적으로 변하는 객체의 상태가 아니라 객체가 속한 타입의 정적인 모습을 표현하기 때문에 ***정적 모델***(static mod이)이라고도 한다. +- 객체지향 애플리케이션을 설계하고 구현하기 위해 객체 관점의 동적 모델과 객체를 추상화한 타입 관점의 정적 모델을 적절히 혼용해야 한다 + +### 클래스 + +- ***객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이라는 사실이 중요하다.*** +- 객체를 분류하기 위해 타입을 결정한 후 프로그래밍 언어를 이용해 타입을 구현할 수 있는 한 가지 방법이 클래스일 뿐인 것이다. +- **객체지향에서 중요한 것은 동적으로 변하는 객체의 ‘상태’와 상태를 변경하는 ‘행위’**다. \ No newline at end of file