📗 BOOK/객체지향의 사실과 오해

객체지향의 사실과 오해 - 1장 정리

미미누 2022. 2. 22. 21:55

 

본 글은 스터디 내에서 객체지향의 사실과 오해 - 역할, 책임, 협력 관점에서 본 객체지향을 읽고 정리한 글입니다.


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

 

우리는 객체지향에 처음 다가가면, 객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임이라는 설명을 마주하게 된다. 하지만 실세계의 모방이라는 개념은 객체지향의 기반을 이루는 개념을 설명하는데 적합하지만, 실용적인 관점에서 분석, 설계를 설명하기에는 적합하지 않는다.

 

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

 

왜 많은 사람들이 실세계 객체와 소프트웨어 객체 간의 대응이라는 유산을 계속해서 재생산하는가?

그건 바로 객체를 상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명하는데 효과적이기 때문이다.

즉 객체지향 설계의 핵심 사상인 연결완전성(seamlessness)를 설명하는데 적합한 틀을 제공한다.

 

2. 협력하는 사람들

 

손님을 커피를 주문하고, 캐시어는 주문을 받고, 바리스타는 커피를 제조하는 과정을 거쳐 손님에게 커피를 제공한다.

이러한 커피를 주문하고 제조하는 과정은 역할, 책임, 협력이 조화를 이루어 만들어낸다.

암묵적인 협력 관계가 존재한다.

 

손님, 캐시어, 바리스타는 각각 역할과 책임이 존재한다. 즉 커피 주문이라는 협력에 참여하는 모든 사람은 맡은 바 역할과 책임을 다하고 있는 것이다.

 

객체지향의 가장 중요한 개념은 역할, 책임, 협력이다. 

 

 

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

 

일상의 대부분의 문제는 복잡하기 때문에, 사람들은 다른 사람에게 요청(request) 한다.

요청은 연쇄적으로 발생한다.

 

요청을 받은 사람은 책임을 다하여 지식이나, 서비스를 제공하여 응답(response)한다.

응답 또한 요청의 반대 방향으로 연쇄적으로 전달한다.

 

요청과 응답으로 이루어진 협력은 복잡한 문제를 해결할 수 있는 공동체를 형성할 수 있게 만든다.

 

4. 역할과 책임

 

사람들은 다른 사람과 협력하는 과정에서 특정한 역할(role)을 부여받는다.

역할이라는 단어는 의미적으로 책임이라는 개념을 내포한다.

특정한 역할은 특정한 책임을 암시한다.

 

역할에 적합한 책임을 수행한다는 사실은 4가지 개념을 내포한다.

 

1. 여러 사람이 동일한 역할을 수행할 수 있다.

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

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

-> 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 다형성이라고 한다.

4. 한 사람이 동시에 여러 역할을 수행할 수 있다.

 

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

 

객체 공동체 안에서 살고 있는 객체 시민은 자신에게 주어진 역할과 책임을 다하는 동시에 시스템의

더 큰 목적을 이루기 위해 다른 객체와도 적극적으로 협력한다.

 

애플리케이션의 기능은 더 작은 책임으로 분할되고 책임은 적절한 역할을 수행할 수 있는 객체에 의해

수행된다. 

즉 시스템은 역할과 책임을 수행하는 객체로 분할되고, 객체 간의 요청과 응답의 흐름으로 구성된 협력으로

구현된다.

역할은 책임의 집합이며, 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소이다.

 

6. 협력 속에 사는 객체

 

객체지향 애플리케이션의 윤곽을 결정하는 것은 -> 역할, 책임, 협력

실제로 협력에 참여하는 주체는 객체이다.

객체지향을 객체지향이라고 부르는 이유 -> 패러다임의 중심에 객체가 존재하기 때문이다.

 

협력의 품질을 결정하는 것이 객체의 품질이다.

 

[객체는 협력 공동체의 일원으로 두가지 덕목을 갖춰야 함]

1. 객체는 충분히 협력적이어야 한다. (열린마음)

2. 객체는 충분히 자율적이어야 한다. (자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제 하는 것)

 

객체는 협력에 참여하지만, 스스로의 결정과 판단에 따라 행동하는 자율적인 존재이다.

 

 

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

 

객체는 상태(state)와 행동(behavior)를 함께 지닌 실체이다.

객체는 다른 객체가 무엇(what)을 수행하는지는 알 수 있지만, 어떻게(how) 수행하는지에 대해 알 수 없다.

객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다.

 

8. 협력과 메시지

한 객체가 다른 객체에게 요청하는 것을 메시지를 전송한다고 말하고, 다른 객체로부터 요청 받는 것을

메시지를 수신한다고 말한다.

객체는 협력을 위해 다른 객체에게 메시지를 전송하고, 다른 객체로부터 메시지를 수신한다.

 

메시지를 전송하는 객체를 송신자(sender), 메시지를 수신하는 객체를 수신자(receiver)라고 부른다.

 

9. 메서드와 자율성

 

객체가 수신된 메시지를 처리하는 방법을 메서드(method)라고 부른다.

객체지향 프로그래밍 언어에서 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.

어떤 객체에게 메시지를 전송하면 -> 메시지에 대응하는 특정 메서드가 실행된다.

 

메시지와 메서드의 분리는 객체의 협력에 참여하는 객체들 간의 자율성을 증진시킨다.

 

캡슐화(encapsulation) : 외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인

메서드를 분리하여 객체의 자율성을 높인다.

 

10. 객체지향의 본질

 

1. 자율적인 객체들의 공동체로 바라보고 객체를 이용해 분할한다.

2. 객체는 상태와 행위를 함께 지닌다.

3. 객체는 협력하면서, 역할을 수행하며, 역할은 여러 책임을 갖는다.

4. 메시지를 수신한 객체는 적합한 메서드를 선택한다.

 

11. 객체를 지향하라

클래스가 객체지향의 핵심을 이루는 중심 개념이 아니다.

클래스를 강조하는 프로그래밍 관점은 객체의 캡슐화를 저해하고, 클래스를 강하게 결합시킨다.

객체지향에서는 클래스의 구조와 메서드가 아니라, 객체의 역할, 책임, 협력에 집중해야 한다.