우당탕탕 우리네 개발생활

[oop] 책임과 추상화는 서로를 필요로할까? 본문

tech

[oop] 책임과 추상화는 서로를 필요로할까?

미스터카멜레온 2024. 7. 13. 23:25

최근 <클린코드>, <클린아키텍처>, <객체지향의 사실과 오해> 등의 책들을 공부하면서 '추상화', '책임' 이라는 단어들이 뇌리에 박혔다. 객체들의 의사소통은 명확히 분리되어 있는 각자의 책임하에 정해놓은 외부 인터페이스를 통해서만 이뤄지는 것을 원칙으로 한다. 규모가 좀 더 커져 컴포넌트간의 소통, 서비스들간의 소통 역시 마찬가지인 것 같다. 이러한 외부 인터페이스(메서드)의 input(인수)과 output(리턴값)이 구체적이지만 그 외부 인터페이스의 내부 과정(구현)이 어떤식으로 이뤄지는지는 구체적으로 드러내지 않는다. 예를 들어, 캐셔에게 아이스아메리카노를 주문한 고객이 있다고 하자. 고객은 돈을 지불했고 그에 대한 결과로 아이스아메리카노를 캐셔를 통해 받기만 하면 된다. 고객은 캐셔가 아이스아메리카노를 직접 만들든 캐셔가 바리스타에게 주문을 건네 바리스타가 아이스아메리카노를 만들든 그 구체적인 과정에 대해서는 알 필요가 없다. '커피를 주문한다' 라는 외부 인터페이스는 '돈'이라는 input과 '커피'라는 output으로 명료하게 정의된다. 이 과정에서 등장한 세 명의 역할들은 아래 책임들을 갖는다고 가정한다.

  • 고객: 커피를 주문한다.
  • 캐셔: 주문을 바리스타에게 전달한다
  • 바리스타: 커피를 제작한다

엄밀히 생각해봤을 때 '책임'에게 '추상화'는 반드시 필요한 요소가 아닌 것 같다. 하지만 추상화에게 책임은 반드시 필요한 요소이다. 위 처럼 책임이 분명하게 정의되어 있고 그에 따라 인터페이스가 분명하게 정해져 있다면 저 역할들을 대체할 수 있는 여지들이 생긴다. 고객은 커피를 좋아하는 남녀노소 모든 사람들이 될 수 있을 것이며, 캐셔 역시 캐셔 역할을 수행할 수 있는 모든 사람들이 될 수 있을 것이고, 바리스타는 아이스아메리카노를 제작할 수 있는 모든 사람들이 그 대체자가 될 수 있을 것이다. 중요한 점은 이 모든 대체자들은 책임이 갖는 행위들을 톳씨하나 틀리지않고 똑같이 이행해야 할 필요가 없다는 것이다. 정해진 인터페이스의 input과 output만 지키는 선에서 본인들만의 개성을 살려 어떠한 방법을 사용해도 된다는 것이 핵심이다. 알맞게 설명이 되었는지는 모르겠지만 위 설명들이 '추상화'에 대한 설명이다. '고객', '캐셔', '바리스타'라는 역할은 반드시 가져야 할 책임들을 가진 채 구체적인 구현은 열어놓은 추상적 대상이 된 것이다.