최근 자바를 공부하기 시작하면서 점차 좋은 코드를 작성하는 것에 관심이 생겼다!
좋은 Java 프로그램 코드를 적기 위해서는 객체지향의 본질을 잘 이해하고,
이를 코드에 녹여낼 수 있어야 한다던데
대체 객체지향의 본질은 무엇이고, 객체지향의 올바른 설계는 어떻게 해야 하는지?
라는 물음에 답을 구하기 위해 객체지향의 사실과 오해 를 읽고 동료들과 스터디를 시작하게 되었다.
01. 협력하는 객체들의 공동체
객체지향이란 단순히 현실을 모방하는 것이 아니었다.
첫 페이지를 펼치고서 정말 놀랐던 점은,
- 객체지향의 목표는 실세계를 모방하는 것이 아니라, 오히려 새로운 세계를 창조하는 것이다. 21p
- 실세계의 모방이라는 객체지향의 개념은 훌륭한 프로그램을 설계하고 구현하는 실무적인 관점에서는 부적합하지만, 객체지향이라는 용어에 담긴 기본 사상을 이해하고 학습하는 데에는 매우 효과적이다. 22p
전공 수업 시간에 처음 객체지향이 무엇인지에 대해서 배울 때부터, 나는 객체지향이 단순히 실생활의 상호작용을 본뜬 것이라고 이해하고 있었다. 누군가에게 절차지향과 객체지향의 차이를 설명할 때면, 항상 실생활의 사례를 들어 설명했던 기억이 새록새록하다. 하지만, 그 본질은 단순히 실세계를 모방한 것이 아니었다는 점이다.
역할, 책임, 협력
작가는 객체지향의 핵심 키워드로, 역할, 책임, 협력을 제시한다.
- 객체들은 협력을 위해 자신에게 주어진 역할과 그에 따른 책임을 다한다.
- 역할의 개념 속에는 책임이 전제된다.
- 역할은 대체 가능성을 의미한다. 30p
- 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다. 30p
위에 적어둔 4가지 문장들이 중요하다고 생각했고, 특히 맨 마지막 항목을 통해 협력 관계에서의 객체들은
책임을 수행하는 방법보다는, 책임을 수행한다는 사실 그 자체에 초점을 두어야 함을 알 수 있었다.
객체가 협력 속에서 사는 법
협력 공동체의 일원으로서 객체는 다음과 같은 두 가지 덕목 사이에서 균형을 이루어야 한다.
- 객체는 충분히 협력적이어야 한다.
- 외부의 도움 없이 혼자 모든 것을 처리하려는 전지전능한 객체(god object)는 내부적인 복잡도에 의해 자멸하게 된다.
- 객체는 충분히 자율적이어야 한다.
- 객체의 자율성이란 자신의 상태를 직접 관리하고 상태를 기반으로 스스로 판단하고 행동할 수 있음을 의미. 33p
- 객체의 자율성은 캡슐화를 통해 보장된다.
- 객체의 외부에서는 접근이 허락된 수단을 통해서만 의사소통할 수 있다.
- 객체는 다른 객체가 무엇(what)을 수행하는지는 알 수 있지만, 어떻게(how) 수행하는지는 알 수 없다.
- 메세지(request)와 수신된 메세지를 처리하는 방법인 메서드의 분리는 자율성을 증진시킨다.
객체지향은 결국 객체를 지향하는 것이다.
작가는 클래스를 지향하는 것은 객체지향의 본질이 아니라고 말한다.
클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다고 한다.
결국 객체지향의 중심은 객체이며,
적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이
객체지향의 핵심이다. 38p
1장을 읽고..
객체지향을 실생활에 빗대어 설명하는것이 객체지향을 처음 이해하고 받아들이는 데에는 효과적이나
그것이 객체지향의 본질과는 같지 않다는 것을 깨닫게 되었다.
스터디를 마무리하며 느낀 점을 서로 공유하던 도중, 한 스터디원분이 말씀해 주신 게 참 공감이 됐다.
"여태껏 캡슐화를 해야 객체지향적으로 좋은 코드라고 배웠는데, 그 이유에 대해 알게 된 뜻깊은 시간이었다."
참 공감이 되는 만큼, 한편으로는 조금 씁쓸했다.
왜? 라는 질문에 답할 수 없다면, 그 학습은 밑빠진 독과 다를 게 없다는 것을 알았다.
때로는 번거롭고 조금 시간이 오래 걸리더라도,
내가 배우고 사용하는 모든 것에 대해
'잘 아는' 개발자가 되어야지.
'Books' 카테고리의 다른 글
객체지향의 사실과 오해 : 2장 (0) | 2022.08.03 |
---|