본문 바로가기
혼자 공부하는 것들/독서

[객체지향의 사실과 오해]를 읽고 🐇

by applepick 2022. 2. 1.
반응형

많은 개발자분들이 추천해주신 도서라 한 번쯤 읽어보고 싶었습니다. 완독 한지는 오래됐지만 기억에 오래 남아서 기억 남았던 부분을 정리해보려고 합니다. 

 

이 책에서 중점적으로 설명한 것들은 바로 역할과 책임, 책임관계에서 바라본 객체지향입니다. 지금까지 객체지향이라 하면 공통적인 객체를 분리해서 재사용성을 높이고, 퍼즐 조각 맞추듯이 설계했습니다. 책을 읽고 나서 객체지향을 바라보는 시각이 조금 달라졌습니다.

대략 3가지 정도 기억에 남았었습니다. 

 

객체지향 애플리케이션의 윤곽을 정하는 것은 역할, 책임, 협력입니다. 하지만 실제로 협력에 참여하는 주체는 객체입니다. 

각각 사람마다 역할이라는 것이 있습니다. 예를 들어 스타벅스에 입장한 고객과 응대하는 캐셔, 바리스타의 역할은 다릅니다. 다른 역할 속에서 각각 책임을 가지고 있습니다. 고객은 커피를 주문하고 값을 지불해야 하는 책임을 가지고 있고, 캐셔는 주문받은 오더를 바리스타에게 전달해줄 책임을, 바리스타는 고객이 주문한 커피를 제작할 책임을 가지고 있습니다. 이렇게 각각의 책임을 가지고 서로 협력해서 하나의 상황을 해결합니다. 이게 바로 협력 관계입니다. 이것을 객체지향에 대입하여 생각할 수 있습니다. 

 

객체는 충분히 "협력적"이여야 합니다. 객체는 다른 객체의 요청에 열심히 귀 기울이고 다른 객체에게 도움을 요청할 정도로 열려있어야 합니다. 만약 고객의 주문이 밀렸다면 바리스타는 다른 바리스타에게 요청할 수 있어야 합니다. 객체는 수동적으로 존재하는 것이 아닙니다. 객체 스스로 판단하고 결정해야 합니다. 심지어 요청에 응할지 여부도 객체 스스로 결정할 수 있어야 합니다. 

 

객체는 충분히 "자율적"이여야 합니다. 여기서 자율적이란 자기 스스로의 원칙에 따라 어떠한 일을 하거나 자기 스스로를 통제하여 절제하는 것을 의미합니다.  캐셔는 고객이 주문하면 행동을 시작하지만 고객에게 음료를 주문하는 절차나 바리스타에게 접수 내역을 전달하는 방법은 스스로 결정합니다. 이처럼 각각의 객체들이 스스로 협력관계를 통해 요청을 해결해야 합니다.

 

객체지향의 본질

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체입니다.
  • 자율적인 객체란 상태행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미합니다. 
  • 객체는 시스템의 해위를 구현하기 위해 다른 객체와 협력합니다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합입니다.
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택합니다.

 

객체는 데이터인가?

그렇지 않습니다. 객체에서 중요한 것은 객체의 행동입니다. 객체를 만들어낼 때 가장 중요한 것은 이웃하는 객체와 협력하기 위해 어떤 행동을 해야 할지를 결정하는 것이 객체지향 설계의 핵심입니다. 타입이 데이터가 아닌 행동에 의해 결정되는 사실은 중요한 의미를 부여합니다. 예를 들어 같은 타입에 속한 객체는 행동만 동일하다면 서로 다른 데이터를 가질 수 있습니다. 여기서 동일한 행동이란 동일한 책임을 의미하며, 동일한 타입에 속한 객체는 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신하고 처리할 수 있습니다. 이것은 다형성에 의미를 부여합니다. 다형성이란 객체지향에서 중요한 부분 중 하나입니다. 동일한 요청에 대해 서로 다른 방식으로 응답해주는 것을 뜻합니다. 

 

인터페이스와 구현을 분리하자!

마틴 파울러는 개념적인 관점과 명세 관점 사이는 그렇게 중요하지 않은 경우가 많지만 명세 관점과 구현 관점을 분리하는 것은 매우 중요하다고 주장했습니다. 프로그래머의 입장에서 가장 많이 접하는 부분이 구현 관점입니다. 실제로 훌륭한 설계를 결정하는 측면은 명세 관점인 객체의 인터페이스입니다. 명세 관점이 설계를 주도하게 하면 설계의 품질이 향상될 수 있다는 사실을 기억하자!

 

중요한 것은 클래스를 봤을 때 클래스를 명세 관점과 구현 관점으로 나눠 볼 수 있어야 합니다. 캡슐화를 위반해서 구현을 인터페이스 밖으로 노출해서도 안되고, 인터페이스와 구현을 명확하게 분리하지 않고 흐릿하게 섞어놓아서도 안됩니다. 결국 세 가지 관점 모두에서 클래스를 바라볼 수 있도록 연습하면 좋을 것 같습니다. 

 

 

결론

책을 읽어보면서 객체지향을 어떤 관점으로 바라봐야 할지 흐릿하게나마 느껴졌습니다. 이것을 이제 실무에서 어떻게 잘 적용해야 할지 남은 숙제인 것 같습니다. 인터페이스를 어떻게 설계해야 할지, 객체의 책임은 어떻게 위임을 해야할지, 직접 부딪쳐보면서 최대한 책에서 느꼈던 객체지향을 적용하고 싶습니다. 한 번 읽어보면 객체지향에 대해 다시 한번 생각해보게 해주는 것 같습니다. 감사합니다.

 

 

반응형

댓글