본문 바로가기

기술 서적/객체지향의 사실과 오해

[객체지향의 사실과 오해] ch1. 협력하는 객체들의 공동체/ 협력-역할-책임

 

 

목차

1. 서론

2. 기존의 객체지향 묘사

3. 객체의 3요소 : 협력, 역할, 책임

4. 협력 속에 사는 객체

5. 객체지향의 본질(핵심)


 

1.  서론

 객체지향이란 무엇인가?

 

=> 이 질문에 대한 자신만의 견해를 가지는 것이 중요하다

=> 그러나, 많은 개발자는 객체지향을 여전히 클래스나 상속을 중심으로 바라본다.

 

다음 책에서는 총 3가지 관점의 변화를 유도한다.

첫째, 클래스 중심 => 객체 중심 관점

둘째, 객체를 독립적 존재 => 협력적 존재로 바라보는 것

셋째, 객체에게 얼마나 적절한 역할과 책임을 부여하는가

=> 궁극적으로 이 3가지 관점으로 프로그래밍 언어라는 틀에 어떻게 담아내는지가 중요하다

 


2. 기존의 객체지향 묘사

- 객체지향은 현실세계 사물의 추상화로 묘사되는 경우가 많다.

- 그러나, 실제 현실과 소프트웨어 객체 사이의 연관성은 사실 희미하다.

- 객체지향의 목표는 실세계 모방 보다는 새로운 세계를 창조하는 것이다.

 

- 그럼에도 현실세계 비유가 자주 등장하는 이유는?

=> 현실세계의 사람들이 악묵적인 약속과 명시적 계약을 기반으로 목표를 달성해나가는 과정

=== 메시지를 주고받으며 공동의 목표를 달성하기 위해 협력하는 객체를 설명하기에 적합하기 때문

 


3. 객체의 3요소 : 협력, 역할, 책임

 

1) 협력은 요청과 응답으로 구성된다.

 

[커피 주문의 과정]

             커피주문                     커피 제조
손님 ------------------> 캐시어 --------------------> 바리스타
        <-----------------              <--------------------
             커피 완성                    커피 완성

 

커피 주문의 과정으로 보는 협력의 과정

 

[요청]

-- 손님 => 캐시어 : 커피를 주문한다.

-- 캐시어 => 바리스타 : 주문한 커피를 바리스타에게 제조 요청한다.

 

[응답]

--캐시어 <= 바리스타 : 커피가 제조되면 캐시어에게 알려준다.

-- 손님   <= 캐시어     : 진동벨로 커피가 준비되었음을 알린다.

 

- 객체는 자신에게 주어진 역할과 책임을 다하며 적극적으로 협력한다.

 

2) 역할과 책임

: 역할은 책임을 내포한다. -- 역할은 객체가 협력에서 차지하는 책임이나 의무를 뜻한다.

: 역할 == 관련성 높은 책임의 집합

2-1) 여러 사람이 동일한 역할을 수행할 수 있다.
- 캐시어가 누구더라도 같은 역할을 수행할 수 있는 다른 이를 고용하면 된다.

2-2) 역할을 대체가능성을 의미한다.
- 캐시어가 두명이라면 어떤 사람이 역할을 수행해도 문제가 되지 않는다.

2-3) 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
- 요청을 받은 사람들은 요청 처리방법을 자유롭게 선택이 가능하다
- 다형성 : 동일 요청에 대해 다른 방식으로 응답가능한 능력

2-4) 한 사람이 동시에 여러 역할을 수행할 수 있다.
- 바리스타가 없다면 캐시어가 주문받기+ 커피제조 까지 할수도 있다.


4. 협력 속에 사는 객체

 

- 협력 : 객체지향 애플리케이션의 아름다움을 결정

- 객체 : 그 협력이 얼마나 조화를 이루는지 결정하는 것

[객체의 2덕목]

1. 객체는 충분히 협력적이어야 한다.
- 객체는 다른 객체 명령에 복종하는 것이 아니라 응답하는 것 뿐이다.

2. 객체는 충분히 자율적이어야 한다.
- 응답의 방식으로 객체 스스로 판단하고 결정한다

== 객체는 공동의 목표를 달성하기 위해 협력하며 +) 스스로의 판단에 따라 행동하는 자율적 존재

 

 

4-1)  객체는 상태와 행동을 함께 지녔다.

 

-객체는 특정 행동을 하기 위해 필요한 상태도 함께 지녀야 한다.

 

ex) 상태== member 변수 / 행동== method로 놓는다면

=> 어떤 method 수행을 위해 필요한 member변수라는 상태가 있어야 함

 

- 객체의 자율성은 외부/내부를 구분하는 것에서 나온다.

-- 사적인 부분은 스스로 관리하고 일체 간섭할 수 없도록 차단해야 한다.(private)

-- 외부에서 접근이 허락된 수단을 통해서만 의사소통해야 한다.(setter/getter)

 

- 객체의 자율성은 데이터와 프로세스를 묶음에서 나온다.

-- 과거, 전통 개발 방법은 데이터와 프로세스를 엄격히 구분했다.

-- 그러나, 객체지향은 객체 안에 데이터+프로세스를 묶음으로써 자율성을 보장한다.

 


4-2)  객체는 메시지를 통해 소통한다.

- 객체는 '오직' 메시지를 통해 소통한다.

- 송신자 : 메시지를 전송하는 객체

- 수신자 : 메시지를 받는 객체


 

4-3) 객체는 메서드 처리 방식의 자율성을 지닌다.

- 메서드 : 객체가 수신된 메시지를 처리하는 방법

- 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.

 

절차지향 언어 객체지향 언어
컴파일 시간에 프로시저 호출에 대한 실행코드 결정
=> 정적이며 프로그램 흐름이 자유롭지 못함
런타임에 메시지에 따라 메서드를 선택할 수 있음
=> 객체들 간의 자율성을 증진시킴
=> 다형성 : 같은 요청에 대해 다른 처리를 하는 것도 가능

 

=> 결국, 객체지향은 메시지(외부 요청)과 메소드(요청의 처리방식)을 분리하여 자율성을 향상시킴

 


5. 객체 지향의 본질

1. 객체지향이란
: 시스템을 상호작용하는 자율적 객체들의 공동체로 바라봄
: 객체를 이용해 시스템을 분리

2. 자율적인 객체란
: 상태+ 행위를 지님
: 스스로 자기 자신을 책임지는 객체

3. 객체의 3요소 : 협력 + 역할 + 책임

4. 객체 의사소통 수단 : 메시지

5. 객체의 자율성
- 메시지와 메서드의 분리
- 메시지 처리 방식(메서드)의 자율성

 

- 객체지향의 본질은 클래스가 아닌 객체이다.

- 클래스는 객체 구현 메커니즘을 뿐, 협력 구조와 책임 식별이 더 중요

 

즉, 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하는 것이 중요하다