'객체지향의 사실과 오해'를 읽고

eora21·2022년 12월 15일
0

프로그래밍을 배웠으나 객체지향은 무엇인가요?라는 질문에 대답을 못하신다면, 무조건 읽어야 할 책이라 생각합니다.

왜 읽게 되었나요?

객체지향이라는 단어를 처음 접한건 전자공학과 C, C++ 전공수업 때였습니다.
아무래도 하드웨어를 더 중요하게 생각하는 곳이라 그런지 클래스를 쓰는 것이라고만 배웠던 기억이 나네요.
그래서 누군가가 객체지향이란 무엇인가요?하면 클래스의 장점을 한바탕 늘어놓고선 코드짜기 좋아요라고 끝맺음을 하였습니다.

시간이 지나고, 꾸준히 프로그래밍을 하면서 개발자의 꿈을 위해 노력하던 며칠 전이었습니다.
한 과제에서 객체를 객체답게 사용하라는 말을 보게 되었어요.
음.. 이게 무슨 뜻이지? 객체는 클래스인데, 클래스를 클래스답게 사용하라는 건가?
네, 제게 있어 클래스란 단지 자료를 묶어 사용하는 것이었고, 쓰는 이유는 그저 코드짜기 좋아서였어요.
자료를 제대로 잘 묶으란건가 싶어 여기저기 방황하다가, 제가 객체지향을 잘못 이해하고 있다는 것을 깨달았습니다.

해당 과제를 끝낸 후, 객체지향에 대해 제대로 이해해보고 싶어 읽게 되었어요.

어떤 책인가요?

아마 많은 분들이 저처럼 객체지향의 중심을 클래스로 생각하고 계실 것 같습니다. 자료를 잘 정리하기 위해 클래스를 사용하고, 이게 곧 객체지향이다!

이 책은 이러한 생각을 잘게 깨부숴줍니다. 그리고 객체지향 프로그래밍이 과연 무엇인지, 어떻게 접근하고 어떠한 방식으로 구성해야 하는지를 일깨워줍니다.

누구에게 추천하나요?

부트코스 등으로 프로그래밍을 접했으나 객체지향이 무엇인지 아예 모르는 분들부터, 실력은 있으나 객체지향을 생각하지 않았던 분들, 객체지향적으로 생각하려 하지만 그 과정이 힘드신 분들이 읽으시면 좋을 것 같습니다.

코드적인 조언보다는 객체지향에 대해 탐구하듯 구성되어 있기 때문에, 디테일한 도움을 받고 싶은 분들은 다른 책을 보면 좋을 것 같아요.

어떤 것을 배울 수 있나요?

협력하는 객체들의 공동체

현실에서 커피를 구매할 때를 생각해봅시다.
카페에 들어가 점원에게 커피를 주문합니다. 점원은 주문받은 커피를 바리스타에게 전달합니다. 바리스타는 커피를 만들고 점원에게 건넵니다. 점원은 완성된 커피를 손님에게 전달합니다.
현실에서 사람들은 서로 협력하며 주어진 역할을 수행합니다. 프로그래밍에서도 서로 협력하며 프로그램을 구성할 수 있어요. 객체지향을 통해 만들어봅시다.

이상한 나라의 객체

현실을 반영하여 객체지향적인 프로그래밍을 한다 해도, 둘은 엄연히 다른 세계이기 때문에 차이가 있습니다.
현실에서 우리가 음식을 먹을 때를 생각해볼까요? 음식은 가만히 있습니다. 우리가 움직여서 음식을 씹고, 삼키고, 소화시키죠.
그러나 객체지향의 세계에서는 다릅니다. 음식에게 먹겠다는 신호를 보내면 음식이 스스로 본인의 양을 줄이고, 줄어든 양만큼 사람에게 전달합니다. 사람은 해당하는 양만큼 본인의 에너지를 상승시키죠.

사람이 모든 걸 다 하면 안되냐구요? 물론 그렇게 할 수는 있죠. 그러나 밥을 먹을 때, 치킨을 먹을 때, 수정과를 먹을 때에 대해 사람 객체가 모두 처리하게 된다면 이는 서로 협력하는 형태가 아닙니다. 코드도 복잡해지고, 객체지향을 벗어난 순차지향입니다.

명령과 행동을 통해 움직이며 협력하는 것. 이렇게나 이상한 나라를 우리는 지향해야 합니다.

타입과 추상화

객체를 나타낼 수 있는 방법 중 하나는 클래스를 사용하는 것입니다. 클래스란 classification(분류)를 말합니다. 비슷한 형태를 지닌 것끼리 분류하여 묶는 것이죠.
이 때 분류 기준은 추상화되어야 합니다.

제가 생긴 건 사람같지 않아 보여도, 엄연한 사람입니다.
이것은 글을 읽는 잘생긴 당신도 마찬가지이죠. 우리는 사람이라는 분류로 묶일 수 있습니다.
너무 자세한 사항(외모)들은 버리고, 공통적으로 묶을 수 있는 특징을 기준으로 분류하는 것이죠.

이 때의 특징은 행동을 기준으로 합니다.
사자는 두 발로 걷지 못 합니다. 얼룩말은 블로그에 작성된 글을 읽지 못 해요. 우리는 어디까지나 프로그래밍의 세계에서, 해당 객체가 어떻게 행동할 수 있을지를 기준으로 분류하도록 합시다.

역할, 책임, 협력

인생은 누군가의 독단적인 행동으로 돌아가지 않습니다. 선생님은 우리에게 숙제를 내고, 우리는 숙제를 수행하고, 부모님은 그런 우리를 학교로 보냅니다.
즉, 인생은 모두의 협력에 의해 진행됩니다.

선생님은 우리를 가르칠 책임이 있습니다. 우리는 숙제를 할 책임이, 부모님은 우리를 학교로 보낼 책임이 있습니다.

역할은 이러한 책임이 모여 내 자신을 대변하며 이루는 겁니다. 선생님에게 우리는 학생이고, 부모님에게는 학교로 보내야 할 소중한 아이입니다. 나는 곧 학생의 역할을 맡고 있는 것입니다.

책임과 메시지

내가 숙제를 해야 할 책임이 있다면, 이는 메시지를 통해 이루어지게 됩니다.
내일까지 수학익힘책 82~83페이지 풀어오세요처럼 말이죠.

선생님은 메시지를 단지 던질 뿐 입니다. 어떻게 풀어오라고는 하지 않죠. 구체적인 내용까지는 선생님이 알 필요가 없습니다.

숙제는 학생마다 하는 방법이 다를 수 있습니다. 부모님의 도움을 받을 수도 있고, 스스로 해결할 수도 있고, 인터넷에서 답을 베껴 적을 수도 있죠.
여기서 중요한 건, 어디까지나 책임을 수행할 때에는 해당 객체마다 자율적으로 처리한다는 것입니다.

객체 지도

우리가 길을 찾아가야 한다고 가정해봅시다. 누군가에게 물어보고 가는 방법과, 지도를 보며 찾아가는 방법이 있습니다.

길을 물어 가는 방법은 간단할 수 있습니다. '거친 산을 건너고, 강을 건너고, 깊은 골짜기를 넘어서 큰 건물 앞에서 좌회전' 이라고 한다면, 우리는 그대로 행하면 됩니다.
그러나 큰 건물이 산사태로 인해 무너지거나, 설명이 살짝이라도 틀어진다면 찾아가기 쉽지 않을 겁니다.

지도를 보며 찾아가는 방법은 직접 물어보고 가는 방법보다 덜 구체적이지만 구조적입니다. 보다 추상적인 지도를 보며 현재 자신의 위치를 파악하고 다음으로 향할 방향을 판단하면 됩니다.

프로그램을 설계할 때, 우리는 이해하기 쉬운 구조를 통해 해당하는 기능을 설계하여야 합니다. 안정적인 구조 내에 불안정한 기능을 담고, 답을 찾아나가야 합니다.

함께 모으기

앞서 배웠던 개념들을 개념, 명세, 구현 관점에서 하나로 모아 구성합니다. 전체적인 그림을 다시 그려보며, 객체지향에 대해 정리합니다.

무엇을 느꼈나요?

어떻게 생각하며 접근해야 객체지향적인 코드를 작성할 수 있는지를 스스로 생각할 수 있게 된 것 같습니다. 또한 누군가가 객체지향이란 무엇인가요? 하고 물었을 때, 프로그래밍을 통해 새로운 세상을 창조할 때, 객체의 역할과 책임에 따른 메시징과 그로 인한 협력을 구성하는 것이라 말할 수 있을 것 같습니다.

profile
나누며 타오르는 프로그래머, 타프입니다.

0개의 댓글