오늘은 최근에 읽고 있는 객체지향의 사실과 오해라는 책에 대한 내용에 대해서 포스팅해보려고 한다.
해당 책을 읽으면서 "내가 정말 객체지향이라는 것을 잘 못 이해하고 있었구나." 라는 것을 깨달을 수 있는 좋은 책 인 것 같다.
실제로 시작은 우리가 객체지향을 공부하는 데에 있어서, 현실 세계를 모방하는 것으로 배우는 것으로 시작한다.
대부분의 객체지향을 입문하는 사람들은 객체에 대한 정의를 다음과 같이 배우게 될 것이다.
실세계에 존재하거나 생각할 수 있는 것
책은 과연 이 말이 맞는 말인가? 로 시작을 하면서도, 현실에 빗대어서 객체를 설명하는 이유에 대해서 알려준다.
객체를 현실에 비유하는 이유
1. 스스로 생각하고 스스로 결정한다는 특징 -> 이 자체는 상태와 행위를 캡슐화 하는 것에 대한 설명하기 용이하다.
2. 암묵적인 약속과 명시적인 계약을 기반으로 협력 -> 메시지를 주고받으며 공동의 목표를 달성하기 위해 협력을 설명하기 용이하다.
3. 소프트웨어 객체를 식별하고 구현 -> 연결 완전성에 대해 설명하기 용이하다.
위의 3가지 특징때문에 현실에 빗대어서 설명하는 것이다.
하지만 우리는 소프트웨어에 다음과 같은 것도 객체로 취급할 수 있다.
그 중 가장 이해하기 쉬운 것이 시간이다. 실제로 시간이 스스로 생각하고 스스로 결정한다는 것은 좀 이해하기 어려운 부분이다. 그럼에도 불구하고 우리는 시간이라는 것을 객체로 인식할 수 있다.
여기서 객체지향의 목표를 분명하게 한다.
객체 지향의 목표는 실세계를 모방하는 것이 아니라, 오히려 새로운 세계를 창조하는 것이다.
객체에서 가장 중요한 개념들이 있다.
- 역할
- 책임
- 협력
역할을 갖는다는 것은 해당 역할에 대한 책임을 가지고 있는 것이기 때문에 역할과 책임을 묶어서 설명하기도 한다.
객체는 어떠한 역할을 가지고 있고, 그 역할에 대한 책임을 수행하며, 다른 객체와 협력을 위해 요청하고 요청받은 객체는 응답하여 행동한다. 라는 사실이 제일 중요한 개념이다.
책에서는 캐셔, 바리스타, 손님을 통해 설명을 해주는데, 캐셔라는 역할, 바리스타라는 역할, 손님이라는 역할 모두 각각의 책임이 있다.
간단하게 설명하자면 손님이 주문을 하고, 캐셔가 주문을 받고, 주문을 바리스타에게 전달하고, 바리스타는 전달 받은 주문을 처리하고, 다시 캐셔에게 전달하고, 손님이 캐셔로 부터 커피를 받는다.
이 일련의 과정 역할과 책임 협력이 모두 분명하게 드러나는 것을 볼 수 있다.
역할과 책임의 관점에서의 객체
그리고 여기서 또 한 가지 알 수 있는 사실이 있다. 바로 역할과 책임에 대한 내용인데
1. 여러 사람이 동일한 역할을 수행할 수 있다. (캐셔가 여러 명)
2. 역할은 대체 가능성을 의미한다. (캐셔가 없다면 다른 사람이 캐셔를 할 수도 있다.)
3. 책임을 수행하는 방법은 자율적으로 선택 할 수 있다. (바리스타는 주문받은 내용을 바탕으로 자기의 방식대로 커피를 제작할 수 있다.)
4. 한 사람이 동시에 여러 역할을 수행 할 수 있다. (바리스타가 캐셔도 할 수 있다.)
읽을 때 가장 중요한 내용은 3번이라고 생각한다. 객체지향에 대해서 공부를 하면서 처음으로 의문이 드는 점은 캡슐화에 대한 부분일 것이다. 어떠한 상태와 그 행위를 메서드에 숨기는 것. 그렇게 하면 해당 정보가 은닉된다고 한다.
처음 볼 때는 다음과 같은 생각 때문에 저게 진짜 무슨 말인지 이해가 되질 않는다.
아니, 코드에 드러나있는데 도대체 왜 모른다는 거야?
이제 우리는 관점을 코드에서 벗어나 각 객체의 입장에서 쳐다봐야 한다는 것이다. 캡슐화를 통해 메서드로 만들었을 때, 다른 객체가 그 메서드를 수행하는데 있어서, 그 메서드를 수행 한 객체가 해당 로직이 어떻게 돌아가는지 이해 할 수가 있는가?
실 세계에 모방하는 것이 좋지는 않지만,
동생에게 라면을 끓이라고 요청을 하였는데, 동생이 스프부터 넣고 면을 넣을지, 면부터 넣고 스프를 넣을지 본인이 알 수가 있는가? 직접 해당 상황이 발생하기 전까지는 알 방법이 없다.
이와 같은 상황이 객체의 특징 중에 자율성에 해당한다.
협력의 관점에서의 객체
여기서 객체의 중요한 특징을 협력에 관하여 설명한다.
1. 객체는 충분히 협력적이여야 한다. -> 협력적이라고 해서 객체가 수동적이라는 것은 아니다. 객체는 스스로 판단하고 행동할 수 있어야 한다.
2. 객체가 충분히 자율적이여야 한다.
이러한 협력은 메시지를 통해 해결이 되고, 메시지를 송신하는 객체를 보통 송신자, 수신하는 객체를 수신자라고 하는데 이러한 수신된 메시지를 처리하는 것이 바로 메서드이다.
즉, 객체지향언어는 객체를 이용해 메시지를 전달하는것이 객체지향 언어의 주된 관점인 것이다.
클래스에 대한 오해
마지막으로 도시 전설에 대한 이야기로 1장이 마무리가 된다.
객체지향언어는 클래스를 사용해 상태와 행위를 명시하여 객체를 생성해서 사용하는 것이다. 란 도시 전설같은 얘기를 전한다.
위에서 부터 쭉 이야기 해왔지만 객체지향언어의 목적에서 크게 벗어난 얘기이다. 하지만 우리는 객체지향언어라면 저렇게 해야 하는 것 아닌가? 또, 공부를 하다보면 객체지향언어에서 가장 먼저 만나는 것이 클래스다 보니까. "아 클래스가 있다면 객체지향언어구나" 라고 오해를 하게 되는 것이다. 따라서 지금부터라도 생각을 바꿔야 한다.
객체의 역할, 책임, 협력에 집중하고 객체지향 언어란 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.
책에 글이 되게 많지만, 이해 할 수 있게 자세하게 서술되어있어서 그런 것 같다. 2장부터는 이상한 나라의 앨리스를 사용하여 객체에 대해서 설명을 해주는데, 예시가 나름 이해하기도 쉽고 저자분이 집필을 너무 잘해주셔서 재미있게 읽어 나갈 수 있는 것 같다.
프록시 패턴과 데코레이터 패턴을 구현하는 것을 쓸까 하다가, 책의 내용이 너무 매력적이라서 한 번 포스팅을 써보고 싶었다. 해당 내용은 TIL과 별개로 모든 내용을 따로 포스팅에 정리해볼까 한다.
'도서 > 객체 지향의 사실과 오해' 카테고리의 다른 글
[객체지향의 사실과 오해] 4. 역할, 책임, 협력 (0) | 2023.04.25 |
---|---|
[객체지향의 사실과 오해] 3. 타입과 추상화 (0) | 2023.04.23 |
[객체지향의 사실과 오해] 2. 이상한 나라의 객체 (0) | 2023.04.22 |