쾌락코딩

객체지향의 사실과 오해 리뷰

|

최근 자바를 다시 공부하게 되면서 자연스레 객체지향에도 초점이 맞춰졌다. 자바를 공부하기 위해 시중에서 자바 입문서 중 하나를 고르면 당연히 객체지향에 대한 이야기도 나온다. 그러나 자바 입문서에 나오는 객체지향에 대한 이야기는, 자바 하나만 가르치기에도 부족한 책 분량 때문인지 확실히 와닿는 책은 없었다. 캡슐화, 상속(확장), 추상화, 다형성 등등, 머릿속에 남아있는 키워드는 많지만 결국 드는 생각은, “그래서 객체지향이 뭔데? 어떻게 코드를 짜야 객체지향인건데?”

이 책은 책 한권 자체가 객체지향에 대한 내용이다. 코드도 별로없다. 7장[함께 모으기]에 자바코드가 일부분 나오지만 딱히 자바를 몰라도 문제가 없을 정도의 코드다. 객체지향 자체를 이해하기 위해서 일반 자바 입문서가 따라올 수 없는 깊이를 제공한다고 느꼈다.

객체지향의 사실과 오해

메시지를 주고받는 객체의 관점으로 사고의 중심 전환하자

훌륭한 객체지향 설계자가 되기 위해거쳐야 할 첫 번째 도전은 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하는 것이라고 말한다. 중요한 것은 어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가이다. 클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘일 뿐이다.

객체를 만들려면 클래스가 필요하니 객체보단 클래스를 먼저 공부하게 되고, 상속, 다형성, 추상화 등등의 내용이 모두 클래스를 기반으로 설명이 되어있다 보니 나도 모르게 객체지향을 클래스지향으로 인식하고 있었던 것 같다. 그러나 이 책은, 아니 객체지향을 정확히 이해한 고수들은 하나같이 객체를 사고의 중심에 두고 있다는 것을 알게되었다. 따라서 객체지향 설계를 위해서는 클래스보다 객체를 먼저, 더 나아가 필요한 객체를 파악하기 위해서 객체의 존재 이유, 즉 메시지를 먼저 파악하는 것이 중요하다.

흔한 오류!

객체지향에 대한 대표적인 선입견, 오류는 객체지향이 클래스와 클래스 간의 관계를 표현하는 시스템의 정적인 측면에 중점을 둔다는 것이다. 중요한 것은 정적인 클래스가 아니라 협력에 참여하는 동적인 객체이며, 클래스는 단지 시스템에 필요한 객체를 표현하고 생성하기 위해 프로그래밍 언어가 제공하는 구현 메커니즘이라는 사실을 기억해야 한다. 객체지향의 핵심은 클래스를 어떻게 구현할 것인가가 아니라 객체가 협력 안에서 어떤 책임과 역할을 수행할 것인지를 결정하는 것이다. 객체는, 절대 독립적인 존재로 바라보면 안된다. 꼭 협력속에서 역할을 수행하는 유동적인 존재로 봐야한다.

다형성

자바를 공부하면서 다형성이란 말을 많이 들어봤지만 늘 추상적으로만 머릿속에 들어있었다. 다형성.. 다형성 좋지… 다형성… 그런데 뭔가 확신을 가지기는 어려운 개념이였다. 이책에서 다형성이란, 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미하는 것이라고 한다. 좀 더 구체적으로 말해 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘이다.

다형성

책에서의 설명 방법을 빌리자면, 법정에서 재판장인 왕이 증언석에 “증언하라”라는 메시지를 던진다면, 모자장수는 “증언하라”라는 메시지를 수신했을 때 기억을 되집어가며 목격한 내용을 성실하게 답변할 수 있고, 요리사는 메모에 적힌 내용을 더듬더듬 읽어 내려가며 증언할 수 있으며, 앨리스는 누군가가 들려준 이야기를 바탕으로 증언할 수 있을 것이다. 어떤 방법을 사용하건 재판장 입장에서는 결과가 동일하다. 이들 모두 증언하고 있는 것이기 때문이다. 이것이 바로 다형성이다.

다형성은 역할, 책임, 협력과 깊은 관련이 있다. 서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는 것을 의미한다. 즉, 송신자의 관점에서 다형적인 수신자들을 구별할 필요가 없으며 자신의 요청을 수행할 책임을 지닌다는 점에서 모두 동일하다.

기본적으로 다형성은 동일한 역할을 수행할 수 있는 객체들 사이의 대체 가능성을 의미한다.

예를 들자면 ArrayListLinkedList가 있겠다.

List<String> list = new ArrayList();
//List<String> list = new LinkedList();

나는 list에 데이터를 담아서 저장하고 싶다. 그래서 나는 list.add("hi")처럼 사용할 것이다. 객체가 ArrayList이든, LinkedList이든 상관없다. 서로 다른 객체이지만 사용자 입장에서는 list를 사용하는데 이 listadd만 제공하면 되는 것이다. 즉, 어느날 ArrayList객체로 사용하던 것이 LinkedList로 바뀐다고 하더라도 상관없는 것이다. 이렇게 다형성을 사용하면 송신자가 수신자의 종류를 모르더라도 메시지를 전송할 수 있다. 다형성은 객체들의 개체 가능성을 이용해 설계를 유연하고 재사용 가능하게 만든다.

메시지를 고민하자!

이 책은 처음부터 끝까지, 메시지를 강조한다. 객체의 존재 이유는, 메시지를 받고, 자신의 역할을 수행하여 좋은 서비를 제공하는 것이기 때문이다.

객체를 이용하는 중요한 이유는 객체가 다른 객체가 필요로 하는 행위를 제공하기 때문이다. 협력 관계 속에서 다른 객체에게 무엇을 제공해야 하고 다른 객체로부터 무엇을 얻어야 하는가라는 관점에서 접근할 때만 훌륭한 책임을 수확할 수 있다. 독립된 객체의 상태와 행위에 대해 고민하지 말고 시스템의 기능을 구현하기 위해 객체가 다른 객체에게 제공해야 하는 메시지에 대해 고민하라!

훌륭한 객체지향 설계는 어떤 객체가 어떤 메시지를 전송할 수 있는가와 어떤 객체가 어떤 메시지를 이해할 수 있는가를 중심으로 객체 사이의 협력 관계를 구성하는 것이다.

그러니, 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다. 메시지를 결정하기 전까지는 객체에 관해 고민하지 말아야 한다고 말한다. 일단 메시지가 결정된 후에야 이 메시지를 처리할 객체를 선택하자.

마무리

저자께서 책을 참 쉽게 쓰신것 같다. 물론 정말 쉽게 쓰여졌지만 객체지향을 전혀 모르고 읽는 것과, 나처럼 어느정도 들어본 경험이 있는 수준, 그리고 자바를 조금은 다뤄본 경험을 가지고 읽는 것에는 큰 차이가 있을 것 같다. 객체지향을 처음 들어본 사람들에게는 조금 어려울 수 있다.

이 책은 아까도 말했듯이 메시지 결정 -> 객체 결정 순서를 강조하고 강조하고 강조하고 강조한다. 아무리 좋은 책을 읽어도 반복해서 읽지 않으면 금방 증발해버리는데, 이 책은 저자께서 강조하고 강조하고 강조하고 또 강조하기 때문에 한 번만 읽어도 다른 어느 책들 보다 머릿속에 깊히 남아있는 것 같다. 물론 그렇다고 한 번만 읽기에는 아까운 책이고, 한 번만 읽어서는 그 깊이를 다 알 수 없는 책이라고 생각한다.

꼭 기억하자. 메시지 결정 -> 객체 결정!

Comments