조각들

개요

이 책이 개발자들 사이에서 추천이 많이 되는 책 중 하나라고 한다.

최근에 당장 기술 한 두개 더 써보는 것보다 기본 지식을 잘 쌓고 넘어가는 게 더 중요하다고 느꼈다.

그래서 스터디원들하고 이 책을 같이 읽고 서로 나눠보고 싶은 얘기가 있으면 토론을 해보기로 했다.

 

 


내용

21pg, 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조해내는 것이다.

 

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

 

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

                                                                                  

29pg, 협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것이다.

 

30pg, 객체지향 설계라는 예술은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다. 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소다.

 

31pg,

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

협력 공동체의 일원으로서 객체는 다음과 같은 두 가지 덕목을 갖춰야 하며, 두 덕목 사이에서 균형을 유지해야 한다.

 

첫째, 객체는 충분히 협력적이어야 한다. 객체는 다른 객체의 요청에 충실히 귀 기울이고 다른 객체에게 적극적으로 도움을 요청할 정도로 열린 마음을 지녀야 한다. 여기서 충분히 협력적이라는 말은 수동적인 존재를 뜻하는 것이 아니다. 단지 요청에 응답할 뿐이고, 요청에 응할지, 응한다면 어떤 방식으로 응답할지는 객체 스스로 판단하고 결정한다.

이것이 객체의 두번째 덕목이다. 객체는 충분히 자율적이어야 한다.

 

32pg,

흔히 객체를 상태(state)와 행동(behavior)을 함께 지닌 실체라고 정의한다. 이 말은 객체가 협력에 참여하기 위해 어떤 행동을 해야 한다면 그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 한다는 것을 의미한다.

 

33pg,

객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다. 객체의 사적인 부분은 객체 스스로 관리하고 외부에서 간섭할 수 없도록 차단해야 하며, 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통해야 한다. 객체는 다른 객체가 '무엇(what)'을 수행하는지는 알 수 있지만 '어떻게(how)' 수행하는지에 대해서는 알 수 없다.

 

객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다. 이것이 전통적인 개발 방법과 객체지향을 구분 짓는 가장 핵심적인 차이다. 자율적인 객체로 구성된 공동체는 유지보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있는 가능성을 제시한다.

 

34pg,

객체지향의 세계에서는 (협력을 위한) 오직 한 가지 의사소통 수단만이 존재한다. 이를 메세지라고 한다.

메세지를 전송하는 객체는 송신자, 수신하는 객체는 수신자, 수신된 메세지를 처리하는 방법은 메서드라고 부른다.

 

어떤 객체에게 메세지를 전송하면 결과적으로 메세지에 대응되는 특정 메서드가 실행된다. 메세지를 수신한 객체가 런타임 때 메서드를 선택할 수 있다는 점은 실행 코드를 컴파일 시간에 결정하는 절차적인 언어와 객체지향 프로그래밍 언어를 구분 짓는 핵심적인 특징 중 하나다. 

 

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

 

37pg,

자바스크립트 같은 객체지향 언어에서는 클래스가 존재하지 않으며 오직 객체만이 존재한다. 상속 역시 클래스가 아닌 객체 간의 위임(delegation) 메커니즘을 기반으로 한다. 객체지향의 핵심은 클래스가 아니다. 클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘일 뿐이다. 객체지향의 중심은 클래스가 아니며 메세지를 주고받는 객체들의 동적인 관계이다.

 

훌륭한 객체지향 설계자가 되기 위해 거쳐야 할 첫 번째 도전은 코드를 담는 클래스의 관점에서 메세지를 주고받는 객체의 관점으로 사고의 중심을 전환하는 것이다. 


느낀점

객체지향의 목표는 실세계의 모방이 아닌 새로운 것의 창조라는 말이 잘 안 와닿는다.

객체지향은 그저 재활용이나 확장성에서 장점을 갖는 프로그래밍 방법 중 하나일 뿐이 아닌가?

목표라고 하면, 원하는 결과물을 효율적으로 구현해낼 수 있도록 객체 간의 협력을 잘 조성하는 것이라고 생각하는데 이런 맥락이 아니라 "실세계의 모방", "새로운 것의 창조" 이런 표현이 나오니까 잘 모르겠다.

당장의 나는 '모방이 될 수도 있지만 너무 여기에 시야를 좁혀서 보지 말고 새로운 것도 창조해낸다'는 정도로 받아들였다.

 

한편 객체 간의 협력이 정확히 어떤 거라고 설명을 잘 못하겠다. 당장은 아래처럼 답을 할 것 같다.

기본적으로 객체는 요청에 따라 자신이 맡은 역할을 수행하며, 필요에 따라서는 다른 객체에게 도움을 요청하고 응답을 받기도 하는 일련의 과정이 객체 간의 협력이고, 이것들의 종합이 객체지향 프로그래밍이다.