리뷰
💡 이제 객체 지향이 무엇인지 알겠나요? Yes
면접에서 객체지향이 무엇인가요? 라는 질문이 들어왔을 때 답변할 만한 명쾌한 이야기는 책에 없다.
애초에 책 설명이 엄청 길고 반복되기 때문에 내가 딱 정의할 수 힘든 부분도 있다.
그런데 관점을 설명하는 건 생각만 해도 힘든 과정 아닌가? 저자가 정말 최선을 다해 비유하고 은유해서 떠먹여주고 있기 때문에 마음을 열고 보면 분명 깨닫는 점이 생긴다!
객체지향이 뭔지 잘 모르겠어서 혼자 고민하고 있는 사람에게 추천하고 싶다.
객체, 클래스에 대한 객체지향적 관점으로 어떻게 이해해야 하는지 바로 잡아주는 느낌이었다.
객체지향이 무엇인지 개념적으로, 철학적으로 이해하기엔 좋은 책이라고 말할 수 있다.
그러나 코딩 책은 아니기에 그 패러다임을 이용해서 이렇게 코딩해야겠구나를 깨닫는건 온전히 자기 몫이다.
개인적으로 외국책을 번역한거 같은 구구절절함이 조금 있어서 읽기 힘든 부분도 있었다. (근데 저자는 한국인이다..)
머릿속에서 그럼 코드를 어떻게 짜는게 비객체지향이고 어떤게 객체지향이지? 라는 의문이 계속 떠올랐는데 그런 비교 예시가 코드로 딱 하나만 있었으면 좋았을 것 같다.
객체지향이란?
이 책은 객체지향의 패러다임의 가치, 왜 이런 패러다임이 필요한지 알려주는 책이었다.
아래의 큰 가치를 소개하고 왜 그런지 설명하는 것이 책의 내용이다.
- 객체지향의 핵심은 역할, 책임, 협력이다.
- 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.
- 객체지향은 클래스를 지향하는 것이 아니라 객체를 지향하는 것이다. 클래스는 단지 구현 메커니즘일 뿐이다.
- 자율적인 책임이 자율적인 객체와 유연한 설계를 낳는다.
- 객체지향은 안정적인 도메인 구조에 불안정한 기능을 통합한 것이다.
- 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다.
이걸 이 포스팅에서 설명하기엔 너무 장황하고 .. 괜히 작가님이 책으로 낸게 아니기에 읽으면서 중요하다고 생각한 부분만 이야기하겠다.
이 책의 핵심은 2장, 3장인 것 같다.
도움이 됐던 부분은 3장이었다. 앞장까지는 그냥 주입식으로 저자는 이렇게 생각하고 있구나 : ) 라는 마인드로 읽고 있었다.
이 파트에서 타입에 대한 정의를 다시 배우면서 저자가 왜 객체지향의 주인공이 클래스가 아니라 객체라고 했는지 이해가 대번에 됐다.
클래스는 타입이 아니라, 타입을 구현하는 매커니즘의 하나다.
객체를 분류하는 기준은 타입이다.
어떤 객체가 어떤 타입인지 결정하는 것은 객체가 수행하는 행동이다.
동일한 행동을 한다는 것은 동일한 메세지를 수신할 수 있다는 것이다.
이것은 동일한 타입을 가질 수 있다는 것을 의미한다.
이 내용 이후에 다형성 이야기가 나오는데 여기서 다형성의 정의가 아래와 같다,
다형성은 동일한 요청에 대해 서로 다른 방식으로 응답을 주는 능력
나는 이 잘 정리된 문장 하나로 다형성이 싹 정리가 되는 것 같았다.
animal, cat, dog 이나 붕어빵틀과 붕어빵.. 뭐 이해 안되는 전공 서적... 온갖 비유로 배웠던 클래스, 상속, 다형성 개념을 한 문장으로 정리한게 너무 좋았다. 애초에 현실세계랑 소프트웨어에 있는 객체랑 매치가 안 됐기 때문에 나는 이런 설명이 확 와 닿았다.
또 객체는 다른 객체와 협력하기 위해 자신의 역할이 있고, 그것을 이행할 책임이 있는 것으로 정의한 것. 이게 정말 맞는 말이다..!
어휘력 부족해서 표현을 못 하겠다!
다른 객체가 또 다른 객체에게 메세지 (요청)을 줬을 때 -> 협력 요청
어떤 방법으로 수행하는지는 관심 없고 객체는 요청을 받으면 -> 외부와 내부 분리 (인터페이스와 캡슐화)
자신이 처리할 수 있는 역할 -> 내 역할 = 내 기능이 저 요청을 실행할 수 있는지는 타입에 달렸다. (다형성)
을 수행해주는 것 -> 내 역할에 대한 책임을 짊 -> 협력 관계 완성
이 관점을 확장 시키면 TDD도 이해가 된다.
객체 지향적 프로그래밍은 클래스를 정의하는 것이 먼저가 아니다.
객체들의 속성과 행위를 식별하는 것이 먼저다.
객체지향의 패러다임은 시스템을 정적인 클래스의 집합이 아니라
메세지를 주고 받는 동적인 객체들의 집합으로 바라보는 것에서 시작한다.
내가 이해한 대로 설명을 해보자면 아래 두 문장 중 [문장2]가 객체지향적 사고라는 거다.
- 어떤 클래스가 a, b라는 속성을 가졌기 때문에 이런 메서드를 정의해야겠다.
- 특정 요청이 왔을 때 특정 결과가 나오도록 클래스를 구성해야 겠다. 이 요청을 처리하려면 특정 속성이 필요하구나~
책을 읽지 않고 내 후기를 보면 내가 무슨 소리를 하는지 이해 못할 것이다. 🥹
객체 지향을 제대로 이해한다면 위 예시가 단순히 순서가 순서가 바뀐게 아니라 클래스를, 객체를 어떻게 구성할지에 대한 차이라는 걸 알것이다.
2를 수행하기 위해 하는게 TDD고, 핵심이고 본질이다. 객체지향을 제대로 이해하지 못 하면 TDD가 의미가 없는 개발 시간 늘리기 뿐아닐까...라는 생각이 들었다. TDD는 기능이 제대로 되는지 확인하면서 개발해라! 가 아니었다. 어떤 기능을 어떤 객체가 맡아야 하는지 고민하는 과정이 필요하기 때문에 더 어렵고, 시간도 많이 걸리고 그래서 더 중요하다고 많은 개발자들이 입을 모아서 이야기하는 거구나 !..
그냥 이것저것 음 진정한 객체지향이란.. 나는 클래스의 속성을 정하고 행동을 정의하지 않았나? 라는 반성도 좀 하게 되는 책이었다!