본문 바로가기
CS (Computer Science)/독후감 : 객체지향의 사실과 오해

4일차(5장) - 책임의 자율성이 객체지향 프로그래밍에 미치는 영향

by 우인입니다 2023. 11. 18.


 

5장을 읽은 직 후

책임, 협력, 자율성, 객체의 상태가 아닌 행동이 중요하다. 메시지가 먼저이고 그 다음 적절한 객체이다.

위와 같은 말들을 굉장히 집요할 정도로 반복하며 강조한다.

그만큼 객체지향을 바라보는 관점에서 중요한 부분인 듯 싶다.

 

객체라는 점이 아닌 객체를 잇는 화살표에 더 집중하라는 느낌.

인터페이스와 구현을 구분함으로써 각 객체들을 1장에서 출근길 카페의 주문과정에 비유한 이유를 더 알 듯 했다.

 

캐셔는 주문 프로그램을 이용해 주문을 받고 바리스타에게 또 다른 요청을 넘긴다.

캐셔는 바리스타에게 요청할 때 필요한 최소한의 정보만 알고 있어도 된다.

바리스타는 본인의 로스팅 기법을 본인의 기준에 맞게 적용해도 캐셔는 이를 상관하지 않고 관심도 갖지 않는다.

 

그리고 이러한 것들은 객체지향 프로그래밍의 재사용성이 높다는 특징을 갖게된 배경을 보여준다.

 

 

 


아래는 읽으며 정리한 구절들이다.

 

 

객체가 어떤 행동을 하는 유일한 이유는 다른 객체로부터 요청을 수신했기 때문이다.

객체지향 설계의 아름다움은 적절한 책임을 적절한 객체에게 할당하는 과정속에서 드러난다.

 

 

증언하라 vs  '장면을 떠올려라. 시간 순서대로 재구성하라. 말로 간결하게 표현하라.'

전자와 달리 후자에서는 증언의 자유를 크게 제한하고 있다.

그래서 후자의 경우 요청받은 메시지를 수행하기 위해 명령에 의존할 수밖에 없다.

이는 자율적으로 책임을 수행할 수 없음을 의미한다.

 

 

메시지로 초점을 이동

메시지는 객체로 하여금 자신의 책임, 즉 행동을 수행하게 만드는 유일한 방법이다. 

5장에 와서야 이 메시지의 개념에 도달했고, 이 메시지의 모습이 내가 익숙했던 메소드의 하나로 드러났다.

 

모자장수.증언하라(어제, 왕국)
 >> 수신자, 메시지 이름, 인자의 조합.

 

 

다형성

다형성이란 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미한다.

 

 자바 초기에 접했던 다형성이라는 개념이 굉장히 모호하면서 알듯 말듯했다만, 5장에 와서 메시지와 메소드의 차이를 언급하며 위와같은 한 줄로 다형성을 책에서 정의하니 이해가 한번에 됐다.

 같은 메시지를 보내도 그 메시지를 어떻게 처리할지는 각자 객체에 달렸고 이를 자율성이 보장된다 했으며, 그 내부의 동작은 각 객체만 알면 되는데 이는 또 캡슐화와도 연결이 되는듯하다.

 

 

What/Who 사이클

어떤 행위(What)를 수행할 것인지를 결정한 수에 누가(Who) 그행위를 수행할 것인지를 결정해야 한다는 것이다.

책임-주도 설계방법에서는 이에 따라 협력에 참여할 객체를 결정하기 전에 협력에 필요한 메시지를 먼저 결정한다.

 

 

객체가 점이고, 그 점들을 잇는 메시지가 화살표라고 했을때, 출발점에 집착는 것이 아니라 화살표에 집중하라고 계속하여 강조하는 느낌이다.

 

 

묻지 말고 시켜라

객체는 다른 객체의 상태를 묻지 말아야 한다. 객체가 다른 객체의 상태를 묻는다는 것은 메시지를 전송하기 이전에 객체가 가져야 하는 상태에 관해 너무 많이 고민하고 있었다는 증거다.

 

인터페이스

객체가 책임을 수행하기 위해 외부로부터 메시지를 받기 위한 통로인 인터페이스.

실제로 객체의 공용 인터페이스를 구성하는 것은 객체가 외부로부터 수신할 수 있는 메시지의 목록이다.

 

 

다음은 객체지향적인 사고방식을 이해하기 위해서 중요한 세가지 원칙, 모두 인터페이스와 관련있다.

  • 좀 더 추상적인 인터페이스
  • 최소 인터페이스
  • 인터페이스와 구현간에 차이가 있다는 점을 인식

 

구현

여기서 구현에 대하여 정의한다.

내부 구조와 작동 방식을 가리키는 용어가 구현이다.

객체를 구성하지만 공용 인터페이스에 포함되지 않는 모든 것이 구현에 포함된다.

 

훌륭한 객체로의 의미 확장

구현을 모른 채 인터페이스만 알면 쉽게 상호작용할 수 있는 객체를 의미한다.

이는 객체를 설계할 때 객체 외부에 노출되는 인터페이스와 객체의 내부에 숨겨지는 구현을 명확하게 분리해서 고려해야 한다는 것을 의미한다.

이를 인터페이스와 구현의 분리원칙이라고 한다.

이것이 중요한 이유는 소프트웨어는 항상 변경되기 때문이다.

 

캡슐화

객체의 자율성을 보존하기 위해 구현을 외부로부터 감추는 것.

 

 

책임의 자율성의 중요성

책임이 자율적일수록 적절하게 '추상화'되며, '응집도'가 높아지고, '결합도'가 낮아지며, '캡슐화'가 증진되고, '인터페이스와 구현이 명확하게 분리'되며, 설계의 '유연성'과 '재사용성'이 향상된다.

 

위 문장이 5장을 총망라해주는 문장이 아닐까 싶다.

 

책임을 자율적으로 만드는 것이 객체지향의 강력함을 누리기 위한 출발점이다.