본문 바로가기

책을 읽어요!

객체 지향의 사실과 오해 - 조영호

2022.12

 

한 달에 한 번씩 책 읽어야 하는데 이번 달에 할게 좀 있어서 계속 우선 순위가 밀리던 와중이었다. 해당 책을 같이 읽고 대화를 나누는 스터디가 열려서 딱 좋다 싶어서 들어갔다. 책 읽기 스터디는 처음 해봤는데도 장단점을 명확하게 느꼈다. 일단 장점은 책을 더 꼼꼼하게 읽을 수 있었다. 나는 책을 굉장히 속독하는 편이라서 읽긴 읽는데 다 읽고 나면 머릿속에 남는게 없었는데 스터디원과 함께 템포를 맞춰서 읽고 읽은 내용에 대해 이야기를 나누어야 하니 한줄 한줄 정성을 기울여서 읽게 되었다. 또 같은 내용을 읽고 다른 사람과 이야기를 나누다보니 생각의 폭도 넓어지고 커뮤니케이션 스킬도 상승되었다(이런 부분들은 기대하고 스터디에 참여한 거긴 했다) 또 같은 과제를 진행했다 보니 이야기를 나눌때 과제에 빗대서 할 때도 있었는데 그럼으로써 과제에 대해서 한번 더 생각해볼 수 있는 기회가 되었던 것 같다. 가장 큰 단점은 시간을 많이 투자해야 한다는 것이다. 하루에 2시간 씩 2챕터씩 읽는 방식이었는데 사실 하루에 2시간은 좀 길긴 하다.. 혼자 읽었으면 3시간 내외로 끝날 얇은 책인데 8시간 정도를 투자해야 해서 다른 할 일들이 많은 상태에선 시간 소모가 크다고 느꼈다. 아무튼 다음달에도 한권 읽어야 하는데 또 참여할지는 그때 생각을 해봐야겠다.

 

2달전에 자바로 처음 객체지향의 프로그래밍을 접하면서 객체라는 단어는 정말 많이 듣고 말을 했다. 이 책을 읽기로 선택한 이유는 책 제목에 있는 '오해'라는 단어에 끌려서 내가 객체 지향에 대해서 어떤 오해를 하고 있는지와 또 저자는 객체지향에 대해서 어떻게 바라보고 있는지 궁금해서였다. 읽으면서 느낀점은 우테코 프리코스에서 객체 지향적으로 코드 짜기에 대해서 굉장히 잘 가르쳐주고 있다는 점..?(ㅎㅎ) 저자가 이야기하는 말을 프리코스 진행하면서 굉장히 많이 들었었다. '객체들이 해야 할 일을 기능목록화 하고, 할 일들을 객체들에게 분배해주고, 또 객체들에게 메세지를 보내서 일을 하게 시켜야 한다'가 객체지향적으로 코드를 짜는거라고 배웠는데 책에서 똑같은 말을 하고 있어서 한달간 잘 배웠구나 싶은 생각이 들었다. 

 

이 책을 읽으면서 가장 크게 얻은 점은 확실하게 머릿속에서 정의가 안되던 여러 단어들에 대해서 어떤 의미인지 이해를 했다는 것이다.
우선 '추상화'란 단어를 이야기해보겠다. 프로그래밍을 공부하면서 가장 자주 들은 단어 탑 3 안에 들거 같은 단어였는데도 확실히 어떤 걸 뜻하는지 이해가 가지 않았었다. 추상화란 단어가 정말 머릿속에서 추상화되어서 둥둥 떠있는 느낌이랄까.. 이 책에서는 추상화를 '컴퓨터를 조작하는 것은 추상화를 구축하고 조작하고 추론하는 것에 대한 모든 것이고 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이다' 라는 키스 데블린의 말을 인용하면서 이야기를 시작한다. 그리고 결론적으로 추상화는 복잡성을 극복하여 본질을 더 명확하게 드러나게 하는 것이다 하고 한다. 그러기 위해 사물들 간의 공통점은 취하고 차이점을 버리는 일반화를 하고 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거한다. 객체 지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다. 공통점을 기반으로 객체들을 묶기 위해 '개념'을 정의하고 그 개념을 바탕으로 객체를 '분류'하며 개념이 객체에 적용되었을 때 객체를 개념의 인스턴스라고 한다. 개념을 type 이라는 말로 치환해보자. 데이터 타입은 저장된 데이터를 분류하는데 사용하는 메모리 집합에 대한 메타데이터이고 데이터에 대한 분류는 어떤 종류의 연산이 해당 데이터에 대해 수행될 수 있는지를 정한다. 객체의 타입을 정하는 것은 객체의 '행동' 이다. 객체가 어떤 데이터를 보유하고 있는지는 타입을 결정하는데 영향을 미치지 않는다. 데이터의 행동 만이 고려대상이라는 말은 외부에 데이터를 감춰야 한다는 것을 의미하고 훌륭한 객체 지향 설계는 외부에 행동만을 노출하고 데이터는 행동 뒤로 감춘다(캡슐화). 결론적으로 객체를 결정하는 것은 행동이라고 계속해서 이야기되고 있다. 

 

두 번째는 '인터페이스'이다. 인터페이스도 프로그래밍 세계에서 정말 많이 언급되는 단어인데 확실하게 뭔지 이해가 잘 안갔다. 운영체제도 하드웨어와 사용자 간의 인터페이스 역할을 한다고 배우긴 했는데 그래서 인터페이스가 정확히 뭘 뜻하는 건데..? 싶었으니까. 인터페이스의 정의는 어떤 두 사물의 경계지점에서 서로 상호작용할 수 있게이어주는 방법이나 장치이다. 이 책에서 자동차를 예시로 들어서 설명하는 것을 읽고 인터페이스를 이해했다. 자동차는 핸들, 변속기, 계기판 등으로 된 인터페이스를 사용자에게 제공한다. 자동차가 내부적으로 어떻게 움직이는지 몰라도 자동차를 움직이는데 문제가 없다. 또 인터페이스가 변경되지 않고 내부 구성이나 작동 방식이 변경되어도 사용자에게는 영향을 미치지 않는다. 또 인터페이스가 동일하다면 다른 브랜드의 자동차도 운전 가능하다.
협력에 참여하는 객체도 인터페이스를 통해 다른 객체와 상호작용을 한다. 객체는 서로 메세지 전송을 통해 상호작용하므로 인터페이스는 수신할 수 있는 메세지의 목록이다. 인터페이스는 외부 공개된 인터페이스(공용 인터페이스)와 내부 접근만 가능한 인터페이스(사적 인터페이스)로 구분된다. 사적 인터페이스는 자기 스스로에게 요청하는 메세지 전송을 할때 사용된다.
외부에서 사용할 필요가 없는 인터페이스는 최대한 노출하지 않는다. 내부 구조와 작동 방식은 '구현' 이다. 객체의 외부와 내부를 분리하기 위해 인터페이스와 구현을 명확하게 분리하자. 소프트웨어는 항상 변경되기 때문에 자율적인 객체를 만드려면 적절한 구현을 선택하고 인터페이스 뒤로 감춰야 한다.

 

객체 지향 설계에서 가장 중요한 것은 (서로 협력하며 메세지를 주고받는) 객체이다. 클래스가 아니다. 이 책을 읽기 전에는 둘이 같은 말이 아닌가 헷갈렸었다. 하지만 자바 스크립트는 클래스 문법이 없지만 객체는 존재한다.
안정적인 객체 구조를 바탕으로 기능을 책임으로 분배해서 객체에 적당한 책임을 분배하자. 협력을 선택할때는 메세지가 객체를 선택하게 하자. 메세지를 수신할 객체는 메세지를 처리할 책임을 갖게 되고 객체가 수신하는 메세지는 객체가 외부에 제공하는 인터페이스가 된다. 

얇지만 읽고 머릿속에서 떠다니기만 했던 개념들을 이해하고 정리할 내용도 많았다는 점에서 알찬 내용을 담고 있는 책이었다. 객체지향을 공부한지 두달이 되어가는 지금 읽기 적절했던 책이라 생각한다. 사담으로 책 표지 앞에 토끼가 그려져있는데 이상한나라의 앨리스 토끼다. 책에서 예시를 앨리스를 토대로 많이 드는데 역시 디자인도 다 이유가 있어서 그렇게 디자인이 되는구나라는 생각도 했다!!