객체지향의 사실과 오해

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

Featured image

객체란, 현실 세계에 존재하는 사물에 대한 추상화

하지만, 객체지향은 철학적인 개념을 설명하기에는 적합하지만 실용적인 관점으로 접근하여 실세계의 모방이라는 개념으로 다가가기에는 무리가 있다.

그럼에도, 사람들이 실세계 객체와 소프트웨어 객체 사이를 연관을 짓는 이유는 이해하기에 효과적이기 때문이다.

실세계의 사물을 기반으로 소프트웨어 객체를 식별하고 구현까지 이어간다는 개념은 객체지향 설계의 핵심 사상인 연결완전성(seamlessness)을 설명하는 데 적합한 틀을 제공한다.

협력하는 사람

객체지향에서 가장 중요한 핵심 개념 세 가지는 바로 역할, 책임, 협력이다.

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

일반적으로 하나의 문제를 해결하기 위해 다수의 사람 혹은 역할이 필요하기 때문에 요청은 연쇄적으로 발생하게 된다.

이렇게 연쇄적으로 발생한 요청을 받은 응답 객체는 요청이 연이어 발생했기 때문에 응답도 요청의 반대 방향으로 연쇄적으로 전달된다.

요청응답을 통해 다른 사람과 협력하는 구조가 형성된다.

역할과 책임

역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미한다. 곧 특정한 역할은 특정한 책임을 암시한다.

협력을 위해 특정한 역할을 맡고 역할에 적합한 책임을 수행한다는 사실은 몇 가지 중요한 개념을 제사한다.

여러 사람이 동일한 역할을 수행할 수 있다. 이는 역할이란 대체 가능성을 나타낸다.

client 입장에서는 client의 요구 사항(메시지)만 들어주면 어떤 사람(객체)이 처리하더라도 상관 없다.

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

요청을 받은 사람은 어떤 독특한 방식(메서드)을 사용하던 상관없이(다형성) 동일한 결과물만 만들어 내면 된다.

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

한 사람이라도 회사에 출근하면 사원이되고, 가정에서는 아버지가 될 수 있다.

역할, 책임, 협력

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

협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표(애플리케이션 기능 구현)를 달성한다는 것이다.

역할은 책임의 집합이다. 객체의 역할은 다음과 같다.

협력 속에 사는 객체

객체지향 애플리케이션은 역할, 책임, 협력의 구성체이지만 주체는 객체이다. 객체는 다음과 같은 특징을 갖고 있어야 한다.

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

객체는 상태(state)행동(behavior)을 함께 지닌 실체라고 정의한다. 상태와 행동을 지니고 있어야 객체의 자율성을 활용할 수 있다.

이는 객체가 협력에 참여하기 위해 어떤 행동을 해야 한다면, 그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 한다는 것을 의미한다.

객체의 자율성은 내부(private)와 외부(public)의 명확한 구분에서 나온다.

객체의 자율성이란, 자신의 상태를 직접 관리하고 상태를 기반으로 스스로 판단하고 행동할 수 있음을 의미한다.

전통적인 개발 방법과 객체지향의 가장 큰 차이점은 데이터와 프로세스를 구분 짓냐(전통), 짓지 않느냐(객체지향)에서 나온다.
객체지향은 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다.

협력과 메시지

객체지향에서 메시지란 객체간 요청과 응답을 지칭한다.

객체지향에서 협력은 메시지를 전송하는 객체와 메시지를 수신하는 객체 사이의 관계로 구성된다.

메서드와 자율성

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

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

외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법(메서드)을 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다. 이는 캡슐화(encapsulation)라는 개념과 연관된다.

객체지향의 본질

객체를 지향하라

지나친 클래스를 강조하는 프로그래밍 언어적인 관점은 객체의 캡슐화를 저해하고 클래스를 서로 강하게 결합시킨다.

훌륭한 객체지향 설계자가 되려면 클래스 관점이 아닌 객체 관점의 사고로 바라봐야 한다.

객체지향의 핵심은 클래스가 아닌, 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.

클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘일 뿐이다.