최근 프로그래밍을 공부하면서 단순히 '코딩'을 잘하는 것이 중요한 것이 아니라는 사실을 많이 느끼고 있다.
컴퓨터 구조, 운영체제, 자료구조와 알고리즘 같이 Computer Science에 대한 기본적인 지식이 기반이 되면서 동시에 코드를 잘 짜는, 프로그래밍을 잘하는 사람이 회사에 필요한 인재이며 소위 말하는 몸값 높은 개발자가 될 수 있는 길이라고 생각한다.
주말마다 CS 스터디를 하고, 원서 읽기 스터디를 하고 있지만 별개로 어떤 책을 읽으면 개발자로써 한걸을 더 나아갈 수 있을까 고민하던 차에 싸피에서 같이 공부하는 상필이가 이 책을 추천해주었다.
책을 한 번 읽어보자!
객체 지향의 핵심은 협력, 역할, 책임 이다.
대부분의 사람들은 "객체지향이란, 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임" 이라고 한다 (나도 이렇게 배운 것 같다).
즉 객체 지향이란, 현실세계에 존재하는 사물에 대한 추상화. 라는 것이 대부분 사람들이 객체 지향을 정리하는 한 문장이다. 사실 나도 이 얘기를 들으면서, 이게 뭔소리인지 의아했었다.
물론 위 문장이 틀린 말은 아니다. 객체 지향이라는 개념을 이해하기 위해서는 실세계를 비유로 들고, 실세계를 모방으로 한다는 말 자체가 효과적이라고 한다.
저자는 실세계의 예시를 통해 객체지향을 설명한다.
이른 아침 출근해서 사내 카페에서 커피를 주문하는 사람과 주문을 받는 캐셔 그리고 커피를 제조하는 바리스타 예시를 통해서 객체지향의 핵심을 이해할 수 있다.
커피를 주문하는 사람과 캐셔 그리고 바리스타는 각자의 역할(role)과 책임(responsibility) 속에서 커피를 주문하고 제조하는 협력(collaboration)의 과정을 이루어 간다.
이 때, 요청(request)과 응답(response)을 통해서 협력이 이루어지고 이를 통해서 인간은 거대하면서 복잡한 문제를 해결할 수 있는 공동체를 형성할 수 있다.
시스템은 역할과 책임을 수행하는 객체로 분할되고 시스템의 기능은 객체 간 연쇄적인 요청-응답의 흐름으로 구성된 협력으로 구현된다.
객체의 역할은 다음과 같은 특징을 지닌다.
대체 가능한 역할과 책임은 객체지향 패러다임의 중요한 기반을 제공하는 다형성과도 깊이 연관되어 있다.
객체지향 애플리케이션의 윤곽을 결정하는 것은 역할, 책임, 협력 이지만 실제로 협력에 참여하는 주체는 객체 이다.
객체 는 두 가지 덕목을 갖추어야 한다.
객체는 상태(state) 와 행동(behavior) 을 함께 지닌 실체이다.
객체는 행동을 위해 필요한 상태를 포함하면서 동시에 특정한 행동을 수행하는 방법으로 스스로 결정할 수 있어야 함.
→ 바리스타는 커피 제조방법을 기억하고 있으며, 자신이 알고 있는 방법에 따라 스스로 커피를 제조한다.
"자율적인 객체로 구성된 공동체는 유지보수가 쉽고, 재사용이 용이하다."
객체지향의 세계에서는 메세지(message) 를 통해서 요청-응답을 주고 받는다.
수신된 메시지를 처리하는 방법 > 메서드(method)
외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이며, 캡슐화(encapsulation)라는 개념과 관련되어 있다.
저자는 다음과 같이 객체지향의 개념을 정리하고 있다.
객체지향 세계에서 클래스(class)와 클래스 사이의 상속이라는 개념도 마찬가지로 중요하지만, 결국 객체지향의 핵심은 객체이다.
클래스는 객체들의 협력관계를 코드로 옮기는 도구에 불과하다..