[리뷰] 객체지향의 사실과 오해

2023. 7. 23. 14:09경험

 

이 책을 처음 알게된 것은 작년 여름이다. 인프런에서 김영한님 강의를 듣고 있는데, 영한님이 불쑥 이 책을 꺼내시더니 추천하셨다.
"주니어라면 반드시 읽어야 하는~" 이런 뉘앙스로 말씀하셨던게 기억나서, 지난 주 일요일에 알라딘 가서 구매했다.

갑자기 왜 책을 샀냐면, 요즘 월~금에는 지하철을 왕복 80분을 타는데.. 이 시간을 잘 활용해보고 싶어서다. 
유튜브 쇼츠를 보는 시간이 늘어날수록 점점 장문의 글을 읽지 못하는 사람이 되는 것 같았다. 
참고로 책이 지하철에서 읽기 딱 좋은 핸디한 사이즈다.


저자가 책의 제목은 한 줄로 정리가능하다. 객체지향은 클래스도, 현실 세계의 모방도 아니다. 새로운 세계를 창조하는 것이다.

책은 이상한 나라의 엘리스의 장면을 토대로 '객체', '역할과 책임', '메시지' 등의 개념을 풀어낸다.  

내용 중에서 중요하다고 생각한 부분은 추후에 리마인드 할 겸 따로 정리를 해보았다.

 

[35P] 객체는 자율적이어야 한다.

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

  • 객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다.

  • 상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.

 

[64P] 행동이 상태를 결정한다.

  • 객체는 다른 객체와 협력하기 위해 존재한다. 객체의 행동은 객체가 협력에 참여하는 유일한 방법이다. 따라서 객체가 적합한지를 결정하는 것은 그 객체의 상태가 아니라 행동이다.

  • 어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태를 결정한다.

 

[76P] 추상화를 통한 복잡성 극복 - 영국의 지하철 노선도

  • 초기 영국의 지하철 노선도를 보면, '이동'이라는 본래 목적과 무관한 사실적인 지형 정보가 혼재되어있어서 역 사이의 연결성이라는 중요한 정보를 파악하기 힘들었다고 한다.

  • 하지만 사실적인 지형과 축척은 무시하고 역 사이의 연결성에만 집중한 노선도가 탄생했고, 이는 오늘날 전 세계 지하철 노선도에 적용되고 있다.

  • 즉, 추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것이다.

 

[114P] 역할

  • 객체가 특정한 요청을 받아들일 수 있는 이유는 그 요청에 대해 적절한 방식으로 응답하는 데 필요한 지식과 행동 방식을 가지고 있기 때문이다. 그리고 요청과 응답은 협력에 참겨하는 객체가 수행할 책임을 정의한다.

  • 동일한 역할을 수행할 수 있다는 것은 해당 객체들이 협력 내에서 동일한 책임의 집합을 수행할 수 있다는 것을 의미한다.

  • 역할의 개념을 사용하면 유사한 협력을 추상화해서 인지 과부하를 줄일 수 있다. 또한 다양한 객체들이 협력에 참여할 수 있기 때문에 협력이 좀 더 유연해지며 다양한 객체들이 협력에 참여할 수 있기 때문에 재사용성이 높아진다.

 

[114P] 책임

  • 객체지향의 세계에서는 어떤 객체가 특정 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 한다.

  • 객체의 책임은 '객체가 무엇을 알고 있는가'와 '무엇을 할 수 있는가'로 구성된다. 책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것)와 외부에 제공해 줄 수 있는 서비스(하는 것)의 목록이다. 따라서 책임은 객체의 공용 인터페이스를 구성한다.

  • 어떤 클래스가 필요하고 어떤 메서드를 포함해야 하는지를 결정하는 것은 책임과 메시지에 대한 개략적인 윤곽을 잡은 후에 시작해도 늦지 않다.

 

[131P] 테스트 주도 개발

  • 이름에서 풍기는 뉘앙스와 달리 테스트 주도 개발은 테스트가 아니라 설계를 위한 기법이다. 핵심은 테스트 작성이 아니다.

  • 테스트는 단지 테스트-주도 개발을 통해 얻을 수 있는 별도의 보너스 같은 것이다.

  • 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성하는 것이다.

 

[140P] 자율적인 책임

  • 자율적인 객체란 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체를 의미한다.

  • 추상적이고 포괄적인 책임은 협력을 좀 더 다양한 환경에서 재사용할 수 있도록 유연성이라는 축복을 내려준다.

  • 자율적인 책임의 특징은 객체가 '어떻게' 해야 하는가가 아니라 '무엇을' 해야 하는가를 설명한다는 것이다.
    • '증언하라'  vs '목격한 장면을 떠올리고 시간 순으로 재구성하여 말로 간결하게 증언하라'

 

[154P] 객체지향의 핵심, 메시지

  • 다른 객체와 협력할 필요가 있는 객체는 메시지를 전송하고, 메시지를 수신한 객체는 미리 정의된 방법에 따라 수신된 메시지를 처리한다.

  • 메시지를 결정하는 시점에서는 어떤 객체가 메시지를 수신할 지 알 수 없으므로, 메시지 송신자는 메시지를 수신할 객체의 내부 상태를 볼 수 없다. 따라서 송신자와 수신자가 느슨하게 결합된다. 

  • 송신자는 수신자가 어떤 객체인지 모르지만 자신이 전송한 메시지를 잘 처리할 것이라는 것을 믿고 메시지를 전송할 수 밖에 없다.

 

[177P] 유일하게 변하지 않는 것은 모든 것이 변한다는 사실이다.

  • 미래에 대비하는 가장 좋은 방법은 변경을 예측하는 것이 아니라 변경을 수용할 수 있는 선택의 여지를 설계에 마련해 놓는 것이다.

  • 지도가 범용적인 이유는 기능에 비해 상대적으로 잘 변하지 않는 안정적인 지형 정보를 기반으로 하고 있기 때문이다.
    • 따라서 지도를 사용하는 사람들의 요구사항은 계속 바뀌더라도(마을, 기차역, 병원, 서점 등) 지도는 이 모든 요구사항을 수용할 수 있다.

  • 불안정한 기능을 안정적인 구조에 담음으로써 변경에 대한 파급효과를 최소화하는 것은 훌륭한 객체지향 설계자가 갖춰야 할 기본적인 설계 능력이다.

자주 언급되는 내용을 일부 발췌했다. 위의 내용을 읽으면서 고개를 끄덕일 수 있거나 얼추 이해가 된다면 큰 무리없이 책을 읽을 수 있을 것이다.

이 책은 소스코드가 거의 없다. 따라서 누구나 읽을 수 있는 범용적인 책이라고 생각한다. 하지만 객체지향의 개념을 처음 접한다면 어려움이 많을 것으로 예상된다. Java를 입문했을 때 내가 이 책을 접했다면 중도 하차했을 것 같다.  

책을 읽으면서 그동안 작성한 코드에 대입하며 읽으려고 노력했다. 너무 당연하다고 느껴지는 부분도 있었고, 새롭게 배운 내용도 많았다(테스트 주도 개발에서 테스트는 보너스일 뿐이다.. 등) 

책의 가독성은 좋아서 쉽게 읽을 수 있었지만, 앞으로 작성할 코드에 어떻게 적용해야 할까?? 싶은 막연함도 남아있다.
아무래도 코드없이 줄글로만 객체지향의 개념을 주입하는 것은 쉽지 않은 것 같다. 그래서인지 저자님은 비슷한 문장을 반복하시는 초필살기를 쓰셨는데 그 덕분에 몇몇 개념은 기억에 남는다.

객체지향에 대해 더 알고싶다면 한 번 읽어보자~!