IT, 기술 도서

이해하기 쉽고 재밌게 읽었던 '객체지향의 사실과 오해' - 조영호

희랍인 조르바 2019. 3. 31. 23:32

개발책을 이렇게 재미있고 쉽게 읽은 건 처음이다. 이제까지 읽은 책들(클린코드, 리팩토링, 테스트 주도 개발 등)은 내게 개념적으로 이해하기 어렵고 코드를 봐도 머릿속으로 바로 들어오지 않았는데 이 책은 책 내용 중 실제 코드는 나오지 않고, 객체 지향에 대한 원론적인 내용을 설명한다.

 

그렇다고 딱딱하게 설명하는게 아니라 '이상한 나라의 앨리스' , '카페에서 커피를 주문할 때' 와 같은 은유, 예시를 들어서 설명한다.

 

객체의 개념 에 대해서는 카페에서 커피를 주문할 때 의 예시가 가장 이해가 쉬웠다. 손님, 메뉴판, 주문받는 직원, 바리스타 가 있는데 이들은 각각의 객체이고 각자 자율적인 행동과 의지를 가졌다고 말한다. '메뉴판' 같은 경우는 현실 세계에서는 수동적이고 정적인 하나의 물체일 뿐이지만, 프로그래밍 세계에서는 스스로 판단하고 결정할 수 있는 살아숨쉬는 하나의 '객체' 가 되는 것이다. 이 말이 다시 한번 내게 프로그래밍의 매력적인 세계를 느끼게 해주었다. 현실에서는 있을 순 없지만 프로그래밍 세계니까 가능하니 말이다.

 

'이상한 나라의 앨리스' 예시는 객체의 행동에 대해 이해하기 쉽게 설명해주었다. 객체의 행동 중에서 가장 중요한 것은 '메세지' 라고 했다. 그 일을 할 수 있는 또는 그 일에 대한 책임을 가지고 있는 객체에 메세지 를 날리면 되는 것이다. 앨리스에서의 예는 앨리스가 간 이상한 세계의 '왕'이 재판장에서 증인들을 불러세워 각 증인들에게 증언을 하라고 말하는데 여기서 객체의 행동 에 대해 설명한다.

 

'왕'이라는 객체가 각 '증인'이라는 객체에 '증언하라'는 메세지를 보낸 것이다. '증언하는 것'은 각 증인들이 할 수 있는 행동이고 책임 이다.

 

'카페에서 커피를 주문할 때' 예시에서도 커피를 주문하는 책임과 일을 가진 사람은 '손님'이고, 어떤 음료와 가격이 있는지 알려주는 책임과 일을 하는 것은 '메뉴판', 주문을 받는 책임과 일을 해야하는 사람은 '주문받는 직원'이며, 커피를 만드는 책임과 일을 해야하는 사람은 '바리스타'이다. 이렇듯 '손님'은 '메뉴판'에게 어떤 메뉴가 있는지 메세지를 보내고 그 받은 메세지로 다시 '주문받는 직원'에게 음료를 주문한다. '주문받은 직원'은 다시 받은 주문의 음료를 '바리스타'에게 그 책임(음료를 만드는)을 맡기고 메세지를 보낸다. 그러면 '바리스타'가 음료를 만들어 '손님'에게 서빙을 하거나 '주문받는 직원'에게 음료를 다 만들었으니 음료를 가져가라고 메세지를 보내야한다. 그리고 이 모든 프로세스가 흘러가는 동안 서로는 서로할 수 있는 일에 대해 협력을 하고 있다. 이렇듯 객체끼리는 서로 협력한다.

 

프로그램 설계를 할 때 현실과 설계를 잘 반영할 수 있도록 추상화해야하고, 객체에서 중요한 점은 협력, 책임, 메세지이다.

 

저자가 말하길, 우리가 흔히 하는 착각이 객체지향에서 객체가 클래스(객체 == 클래스)와 같다고 생각하는데 실은 그건 큰 착각이란다. 객체라는 큰 범주 안에서 클래스는 그 객체를 구현해주는 하나의 수단일 뿐이란다.

 

 

위키피디아에서 검색한 객체의 개념은 다음과 같다.

 

컴퓨터 과학에서 객체 또는 오브젝트(object) 는 저장공간에서 할당되어 값을 가지거나 식별자에 의해 참조되는 공간 을 의미하며, 변수, 자료 구조, 함수 또는 메소드가 될 수 있다. 프로그래밍 언어는 변수를 이용해 객체에 접근하므로 객체와 변수라는 용어는 종종 함께 사용된다. 그러나 메모리가 할당되기 전까지 객체는 존재하지 않는다.

 

객체지향 프로그래밍에서 객체는 클래스의 인스턴스이다. 클래스 객체는 자료와 그 자료를 다루는 명령의 조합을 포함하여 객체가 메시지를 받고 자료를 처리하며 메시지를 다른 객체로 보낼 수 있도록 한다. 실세계의 유추로 설명하자면, 만약 어떤 사람이 집에서 살기를 원할 때, 그 집의 청사진(집의 사진)이나 축소 모형 따위는 전혀 필요가 없다. 필요한 것은 설계에 맞는 실제 집이다. 이 유추에서 청사진은 클래스를 나타내고 실제 집은 객체를 나타낸다.

 

*인스턴스는 해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미한다.

 

 

객체지향, 객체지향해서 사실 '객체가 뭔데?' 라는 궁금증이 들었고, 내가 객체지향언어라고 하는 언어인 java를 쓰면서 객체가 뭔지 잘 알고 있는가라고 물어봤을 때 아는게 없었다. 그래서 '객체'를 다룬 책을 찾다가 객체지향의 사실과 오해를 발견하고 구입했는데 읽길 잘했다는 생각이 든다. 이제는 어렴풋하나마 객체지향이 어떤건지 알 것 같다. 물어보면 '객체'란 어떻고 어떻게 행동해야 한다고 정확하진 않더라도 대답할 수 있는 수준이 된 듯하다.