개인 생각

[독서] 객체지향의 사실과 오해

hongyb 2024. 4. 12. 14:46

객체지향의 사실과 오해

객체지향 사실과 오해

책을 선택하고 읽은 이유

Java로 프로젝트를 하면서 내가 설계한 내용이 올바른 객체 지향인가?라는 의문이 들었다. 이전까지는 구현에 급급해 좋은 설계를 고민하지 않았다면, 최근 들어 확장성 가능한 설계를 고민하기 시작했다. 하나의 로직을 메서드로 빼야 할지, 새로운 클래스로 만들어야 할지, 내가 과연 solid 원칙을 지키는 것인지 아니 애초에 객체지향 프로그래밍을 하고 있는 것인지 의문이 들었고, 기본기를 잃고 있는 것이 아닌가 라는 의문이 들기 시작했다. 좋은 객체지향이 무엇인지 해답을 알고 싶어 '객체지향의 사실과 오해'라는 책을 읽기 시작했다.

 

책 내용 요약

객체란 우리가 인식할 수 있는 단위를 이야기 한다. 여기서 인식할 수 있는 것은 현실에 존재하는 실체뿐만 아니라 관념 속에서도 존재하는 것을 포함한다. 책에서는 객체가 협력을 위해 자율적으로 행동할 수 있어야 한다는 점을 강조한다. 다른 요소에 의해 영향을 받는 것이 아닌 자율적인 상태와 행위를 지니며, 자기 자신을 책임지는 객체를 지향해야 한다고 말하고 있다. 

객체를 처음 설계할 때 상태가 아닌 행동을 먼저 결정해야 한다. 객체의 행동을 먼저 결정하면 객체가 협력에 참여하면서 완수해야 하는 책임을 정리할 수 있게 된다. 상태는 그 후에 정리해도 된다.

 

객체지향이란 이런 자율적인 객체들이 시스템의 행위를 구현하기 위해 협력하는 것을 의미한다. 책에서 계속해서 강조하는 부분이 협력, 책임, 역할이다. 책 시작부터 끝까지 3가지를 계속해서 강조하고 있다. 

 

협력의 본질은 요청과 응답으로 연결되는 네트워크이다. 한 객체가 다른 객체에게 요청을 보내면 요청을 받은 객체는 내부적인 논리(로직)에 따라 일을 처리한 후 응답을 보낸다. 객체 간의 협력을 통해 요청과 응답이 연쇄적으로 발생하게 된다. 협력을 이야기하다 보면 자연스럽게 객체의 책임과 이어진다.

책임이란 협력에 참여하는 객체가 수행해야 하는 일을 의미한다. 요청에 대답을 해주거나, 적절한 행도을 할 의무를 객채의 책임이라고 한다. 책에서 책임을 하는 것과 아는 것 2가지로 설정했다. 처음 책을 읽었을 때 이해가 되지 않았다. 책임을 '객체가 마땅히 해야 하는 일'로 정의하기로 했다. 책에서는 객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것을 메시지 전송이라고 했다. 메시지 전송이라는 개념 또한 책에서 중요하게 다루는데 객체를 메시지 중심으로 설계해야 한다고 강조한다. 객체가 다른 객체에게 어떤 메시지를 전송할 수 있는지를 고민해야 하고, 어떤 객체가 어떤 메시지를 이해할 수 있는지를 중심으로 객체 사이의 협력 관계를 구성해야 한다고 말한다. 다시 말해 객체가 메시지를 선택하는 것이 아닌 메시지가 객체를 선택하게 해야 한다.

역할이란 위에서 말한 책임의 집합이 무엇을 의미하는지를 나타낸다. 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 의미한다. 역할이 중요한 이유는 협력 안에서 다른 객체로 대체될 수 있으며, 객체가 역할에 주어진 책임 외에 다른 책임을 수행할 수도 있기 때문이다. 

 

책의 마지막 부분에서 기능을 중심으로 설계하면 기능이 바뀔 때마다 설계를 다시해야 한다고 말한다. 따라서 변하지 않는 구조 설계가 확장 가능한 설계라고 한다. 구조 설계를 위해 도메인 모델을 설정해야 한다. 도메인 모델이란 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태를 의미한다.

처음에 이해하기 힘든 개념이었고, 책에서는 도메인모델을 분리하여 설명하였다. 도메인이란 소프트웨어로 해결하고자 하는 문제 영역(대상)을 의미하고, 모델이란 대상을 단순화하고 의식적으로 구조화한 형태를 의미한다. 따라서 도메인 모델은 도메인에 대한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태이다. 객체지향은 도메인의 구조와 유사하게 구조화하는 프로그래밍 기법을 말한다.