2023. 6. 15. 21:49ㆍBook
최근 회사 일과 개인 공부 등으로 바빠 약 3개월간 블로그의 글을 올리지 못했다.
핑계를 대보자면 올리고싶었던 주제의 글은 많았지만 짬(?)이 나지 않았던 것 같다.
이 책은 최근 스터디를 하면서 읽었던 책인데 내용이 굉장히 좋은 것 같아 블로그의 글을 작성하기로 마음을 먹었다.
그리하여 초보 개발자의 시선에서 조영호님이 쓰신 '객체지향의 사실과 오해' 를 리뷰해보고자 한다.
어떠한 객체도 섬이 아니다.
책의 인용 문구중 '어떠한 객체도 섬이 아니다.' 라는 말이 나오는데
처음에 읽었을 때는 무슨 의미인지 한참 생각했던 것 같다.
내가 느낀 이 글의 의미는 '객체지향 세계에서 객체들은 서로 동떨어진 문자 그대로의 '객체'가 아닌 서로 협력하기 위해서 존재하는 협력을 위한 객체이다' 라는 뜻으로 받아들였다.
객체는 그 자체로 자율적이여야 하지만 역설적으로는 협력이 없으면 객체가 아니다 라는 뜻을 내포하고 있는 것 같았다.
객체들은 책임이 있고 그 책임들의 집합이 역할이고 역할은 특정 객체만의 고유 역할이 아닌 여러 객체들이 공유할 수 있는 대체 가능성을 의미한다.
그리고 그것이 객체지향 패러다임의 중요한 기반을 제공하는 다형성과도 깊이 연관이 있다는 것을 알 수 있다.
이 책에서는 '객체지향의 핵심은 클래스가 아니다. 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.' 라고 한다. 즉 중요한 것은 클래스들의 정적인 관계가 아닌 메시지를 주고받는 객체들의 동적인 관계라고 설명한다.
흔히 Java를 처음 배울 때 클래스가 곧 객체이며, 중요한 것은 클래스를 설계하는 것이라고 배우는데, 클래스는 객체를 설계하기 위한 도구일 뿐 중요한 것은 소프트웨어의 객체들이 서로 협력하는 관계를 구축하는 것이라고 느꼈다.
이 책에서는 '이상한 나라의 엘리스' 의 스토리를 이용하여 객체지향을 설명한다. 모두가 아는 동화의 내용으로 객체지향의 세계를 이해하는 것이 객체지향 패러다임을 받아들이는 것에는 훨씬 거부감이 적었지만, 아쉬웠던 점은 굉장히 추상적이라 받아들이는 개념이 모호했다는 점이다.
나에게 가장 인상깊었던 파트는 바로 이 파트였던 것 같다. 지금까지 개발을 해오면서 클래스 설계를 할 때 나는 항상 상태를 우선 구현했던 것 같다. 나중에 협력 관계를 구현하면서 초기에 구축했던 상태들로 인해 혼란이 많았었던 것 같다.
객체 간의 협력 관계를 고려하여 행동을 적절한 객체에 분배하고 협력에 맞는 상태를 결정하는 것이 올바른 순서라는 것을 깨달았다. 이 책에서 소프트웨어 객체로 구현에 있어 '의인화'라는 개념을 제시하는데 굉장히 와닿았던 것 같다.
현실 세계에서의 메뉴판은 메뉴를 직접 골라주지 않는다. 하지만 소프트웨어 객체를 구현할 때는 메뉴라는 객체가 자율적으로 메뉴를 초이스한다. 즉 객체지향 패러다임 세계의 소프트웨어 객체는 현실 세계를 단순히 모방한 것이 아닌 소프트웨어 안에서 제 기능을 할 수 있도록 창조하는 것이다.
트럼프에 대입해보면
객체가 어떤 행동을 하느냐에 따라 객체의 타입이 결정된다. 객체의 타입은 객체의 내부 표현과는 아무런 상관이 없다. 따라서 객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다.
객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다. 결과적으로 동일한 책임을 수행하는 일련의 객체는 동일한 타입에 속한다고 말할 수 있다.
그 객체가 어떤 데이터를 가지고 있는지는 우리의 관심사가 아니다. 그 객체가 다른 객체와 동일한 데이터를 가지고 있더라도 다른 행동을 한다면 그 객체들은 서로 다른 타입으로 분류돼야한다.
결론적으로 객체의 타입을 결정하는 것은 객체의 행동일 뿐이다. 객체가 어떤 데이터를 보유하고 있는지는 타입을 결정하는데 아무런 영향도 미치지 않는다.
훌륭한 객체지향 설계는 외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야한다. 이 원칙을 흔히 캡슐화라고 한다.
처음 Java와 OOP에 대해서 배울 때 캡슐화의 중요성도 함께 배운다. 사실 이 책을 읽기 전까지 캡슐화를 꼭 해야하는 이유에 대해서 항상 물음표가 있었다. 기껏해야 보안 문제, 유지보수성 정도로 이해했던 것 같다.
캡슐화가 잘 될수록 객체는 더 자율적이게되고 자율적일수록 변경에 용이하다.
나 또한 이 책처럼 객체에 대해 비유해보자면, 객체는 '어른'이다.(자율적으로 책임을 지기 때문에..ㅎ)
어떤 등장인물들이 특정한 요청을 받아들일 수 있는 이유는 그 요청에 대한 적절한 방식으로 응답하는데 필요한 지식과 행동 방식을 가지고 있기 때문이다. 그리고 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.
객체지향의 세계에서는 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 말한다. 객체지향에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에게 할당하는 것이라고 도 말한다. 이책에서는 객체의 책임을 크게 '하는 것' 과 '아는 것' 으로 분류하고 있다.
하는 것(doing)
아는 것(knowing)
역할이 답이다
재판이라는 협력 과정 속에서 하트 왕고 하트 여왕은 판사의 역할을 수행한다. 모자 장수와 요리사, 그리고 엘리스는 증인의 역할을 수행한다. 따라서 판사와 증인이라는 역할을 사용하면 세 가지 협력을 모두 포괄할 수 있는 하나의 협력으로 추상회된다.
역할은 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식이다. 협력안에서 역할은 "이 자리는 해당 역할을 수핼할 수 있는 어떤 객체라도" 대신할 수 있습니다. 라고 말하는 것과 같다.
협력과 추상화
역할의 가장 큰 가치는 하나의 협력 안에서 여려 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화할 수 있다는 것이다. 역할을 이용하면 협력을 추상화함으로써 단순화할 수 있다.
자율적인 책임의 특징은 객체가 어떻게게 해야하는가가 아니라 무엇을 해야하는가를 설명한다.
하나의 객체는 메세지를 전송함으로써 다른 객체에 접근한다. 왕이 모자 장수에게 전송하라는 메세지를 가리키는 '증언하라'라는 메세지를 전송한다. 하얀 토끼 역시 메시지를 전송하는 방법 이외의 다른 방법으로 모자 장수에게 접근할 수 없다. 이 경우에는 하얀 토끼는 송신자 모자 장수는 수신자가 된다.
왕이 모자 장수에게 전송하라는 메시지를 가리키는 '증언하라'라는 부분을 메시지이름 이라고한다. 메시지를 전송할 때 추가적인 정보가 필요한 경우 메시지 아규먼트를 통해 추가 정보를 제공할 수 있다.
다형성이란 서로 다른 유형의 객체가 동일한 메시지에 대해서 사로 다르게 반응하는 것을 의미한다. 좀 더 추가적으로 말해 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리 할 수 있다는 메커니즘을 가리킨다.
다형성은 역할, 책임, 협력과 깉은 관련이 있다. 서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는 것을 의미한다.
다형성에서 중요한것은 메시지 송신자의 관점이다. 메시지 송신자의 관점에서 이 객체들이 동일한 책임을 수행한다는 것이다. 즉 송신자의 관점에서 다형적인 수신자들을 구별할 필요가 없으며 자신의 요청을 수행할 책임을 지닌다는 점에 모두 동일하다.
휼륭한 객체란 구현을 모른 채 인터페이스만 알면 쉽게 상호작용할 수 있는 객체를 의미한다. 이 것은 객체를 설계할 때 객체 외부에 노출되는 인터페이스와 객체의 내부에 숨겨지는 구현을 명학하게 분리해서 고려해야 한다는 것을 의미한다.
인터페이스와 구현의 분리 원칙이 왜 중요한가? 그것은 소프트웨어는 항상 변경되기 때문이다. 수 많은 객체들이 물고 물리며 돌아가는 객체지향 공동체에서 어떤 객체를 수정했을 때 어떤 객체가 영향을 받는지 판단하는 것은 거의 곡예에 가깝다.
객체가 가져야 할 상태와 메서드 구현은 객체 내부에 속한다. 이 부분은 수정하더라도 갹체 외부에 영향을 미쳐서는 안된다. 객체 외부에 영향을 미치는 변경은 객체의 공용 인터페이스를 수정할 때 뿐이다.
객체지향적인 사고 방식을 이해하기 위해서는 다음의 세 가지 원칙이 중요하닥 주장한다. 이 것은 모두 인터페이스에 관련된 것이다.
이 책을 통해 객체지향의 본질적인 의미에 대해 좀 더 근접하게 다가갈 수 있었다. 그리고 이 책은 한번이 끝이 아니라 두고두고 봐야될 것 같다. 연차가 쌓일수록 아는게 늘어날수록 느끼는 바가 매번 다를 것 같다.
Chapter1. 모던 자바 인 액션 (0) | 2023.07.07 |
---|