Book - 객체지향의 사실과 오해 (feat. 강식당)

|

2021.7.6

객체지향의 사실과 오해

IMG_9841

 도서관에서 프로그래밍 관련 책을 찾아보다가 발견했다. 도서관에서 조금 읽어보니 소장하고 싶어져서 알라딘에서 구입까지 해버렸다. 부트 캠프에서 객체지향에 대해 흥미롭게 고민해본 적이 있어서 제목을 보자마자 끌렸던 것 같다. 그리고 프로그래밍 책이지만 코드가 쓰이지 않아서 부담없이 읽을 수 있었다.

 책은 전반적으로 몇 가지 키워드로 객체지향에 대해서 관통하고 있다. 그 키워드는 역할, 책임, 메세지, 협력, 추상화 정도이다. 아마 객체지향에서 가장 중요한 키워드들일 것이다. (물론 객체지향에 대해서는 다른 다양한 내용도 많았다!) 또한 객체지향에서 더 나아가 좋은 소프트웨어 에 대해서도 자주 언급하고 있다.


🍗 강식당으로 객체지향 이해하기

스크린샷 2021-07-06 오후 5 05 35

나는 객체지향하면 **나영석 PD의 <강식당>** 이라는 예능 프로그램이 생각난다. 멤버들의 손발이 맞지 않아 티격태격하는 모습이 정말 재밌는데 (이맛에 내가 강식당을 재밌게 본다 ㅋㅋ) 하지만 강식당을 소프트웨어로 본다면, 강식당이라는 소프트웨어는 객체지향의 관점에서 설계가 잘못되었다!

스크린샷 2021-07-06 오후 5 03 52

주방을 맡은 강호동은 주문서를 볼 줄 몰라서 항상 홀서빙을 담당하는 은지원과 송민호에게 무엇을 해야할지 물어본다. 객체지향의 관점에서 본다면 강호동이라는 객체는 자신의 역할과 책임을 다하지 않는 것이다. 따라서 홀서빙 멤버들에게 에게 메세지를 보내고 강호동이 할 일을 홀서빙 멤버들이 주문서를 다시 확인하는, 번거롭고 비효율적인 프로세스로 작업이 이루어진다.

스크린샷 2021-07-06 오후 5 04 19

스크린샷 2021-07-06 오후 5 04 29

또한 홀서빙을 하는 이수근이 서빙한 내용을 다른 홀서빙 멤버인 은지원과 송민호에게 제대로 전달하지 못해서 새로나온 음식이 어디로 가야할지 찾지 못하는 상황이 발생하기도 했다. 객체지향 관점에서 보면 객체끼리 메세지를 주고 받지 않아서 발생하는 문제이다. 메세지를 주고 받는 문제는 객체의 역할과 책임의 문제로 직결된다.

스크린샷 2021-07-06 오후 5 11 20

스크린샷 2021-07-06 오후 5 11 33

이후 직원 회의 때 은지원이 이 문제를 정확하게 지적하면서 멤버들의 호흡을 다시 맞추어간다. 또 강호동은 주문서를 읽는 방법을 숙지하면서 효율적인 프로세스를 만들어간다. 이제 각 멤버들의 역할과 책임이 명확해지고, 서로 메세지를 정확하게 주고 받게 된다!

스크린샷 2021-07-06 오후 5 07 58


🛠 인터페이스와 구현의 분리 원칙 

위에서 언급한 몇 가지 키워드 외에 인상깊었던 것이 인터페이스와 구현의 분리 원칙 이다. 예전에 보았을때는 무슨 말인지 이해를 못했는데 이번에 이해하게 되어서 더 인상깊은 모양이다.

인터페이스와 구현의 분리 원칙이 왜 중요한가? 그것은 소프트웨어는 항상 변경되기 때문이다. 수많은 객체들이 물고 물리며 돌아가는 객체지향 공동체에서 어떤 객체를 수정했을 때 어떤 객체가 영향을 받는지를 판단하는 것은 거의 곡예에 가깝다. 객체의 모든 것이 외부에 공개되어 있다면 아무리 작은 부분을 수정하더라도 변경에 의한 파급효과가 객체 공동체의 구석구석까지 파고들 것이다. - 책 내용 중에서 (p.169)

인터페이스란 객체의 외부, 구현은 객체의 내부라고 할 수 있다. Swift로 이야기하자면 접근 제한(private, internal, file private, public, open)에 대한 이야기이다. 이는 캡슐화(은닉화)로 객체에서 드러내야할 부분과 감추어야할 부분을 철저하게 구분하여야 한다는 것이다. 그 이유는 발췌한 부분에서 언급하였듯이 불필요한 코드가 외부로 드러나있다면 어떤 작은 변경사항이 아주 복잡한 문제로 연결될 수 있기 때문이다. 그렇기 때문에 접근제한을 설정하여 서로 영향을 미치는 영역을 철저하게 구분할 필요가 있다.


📱 좋은 소프트웨어란?

모든 소프트웨어 제품의 설계에는 두 가지 측면이 존재한다. 하나는 ‘기능(function)’ 측면의 설계, 다른 하나는 ‘구조(structure)’ 측면의 설계다. 훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라면 훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건이다. - 책 내용 중에서

훌륭한 소프트웨어란 훌륭한 기능을 제공하면서 새로운 기능을 빠르고 안정적으로 추가, 수정할 수 있도록 설계된 소프트웨어이다. 소프트웨어는 사용자로 하여금 어떤 목적을 달성하기 위한 도구이며 아주 빠르게 변화한다. 그렇기 때문에 좋은 기능은 물론이고 사용자의 니즈에 빠르게 대응하기 위해서는 수정 및 기능 추가에 용이한 설계가 필요한 것이다.



마무리

  • 전반적으로 쉽고 재밌게 객체지향에 대해서 설명하고 있어서 가볍게 읽기 좋았다. 늘 코드를 작성할 때 유지/보수에 유리한 코드를 염두해두고 작성하는데 그 의미에 대해서 더 깊게 이해해볼 수 있는 시간이었다.

  • 그리고 추가적으로 POP에 대해서도 궁금해져서 찾아보게 되었고, 다중 패러다임 프로그래밍 언어인 Swift에 대해서 좀 더 이해할 수 있었던 것 같다.