본문 바로가기

Book Review

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

Chapter 01 협력하는 객체들의 공동체

객체

객체지향 애플리케이션의 윤곽을 결정하는 것은 역할, 책임, 협력이지만 실제로 협력에 참여하는 주체는 객체다.

객체지향 프로그램의 아름다움을 결정하는 것이 협력이라면 협력이 조화를 이루는지 결정하는 것은 객체다.

협력 공동체의 일원으로서

  1. 객체는 충분히 “협력적”이여야 한다.

객체는 다른 객체에게 적극적으로 도움을 요청할 정도로 열린 마음을 지녀야 한다. 모든 것을 스스로 처리하려고 하는 전지전능한 객체는 존재하지 않는다.

  1. 객체는 충분히 “자율적”이여야 한다.

객체 공동체에 속한 객체들은 공동의 목표를 달성하기 위해 협력에 참여하지만 스스로의 결정과 판단에 따라 행동하는 자율적인 존재다.

객체지향 설계의 묘미는 다른 객체와 조화롭게 협력할 수 있을 만큼 충분히 개방적인 동시에 협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적인 객체들의 공동체를 설계하는데 있다.

객체를 상태state와 행동behavior을 함께 지닌 실체라고 정의한다.

즉, 객체가 협력에 참여하기 위해 어떤 행동을 해야 한다면 그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 한다는 것을 의미한다.

 

상태와 행동을 함께 지닌 자율적인 객체

객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다. 객체의 사적인 부분은 객체 스스로가 관리하고 외부에서 일체 간섭할 수 없도록 차단해야 하며, 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 소통해야 한다.

객체가 무엇을 수행하는지는 알 수 있지만 어떻게 실행하는지애 대해서는 알 수 없다.

정리하자면 객체는 상태와 행위를 하나의 단위로 묶는 자율적인 존재다.

 

💡전통적인 개발 방법과 객체지향을 구분 짓는 가장 핵심적인 차이

기존 절차지향은 데이터와 프로세스를 업격하게 구분하지만, 객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 놓음으로써 객체의 자율성을 보장한다. 자율적인 객체로 구성된 공동체는 유지보수가 쉽고, 재사용이 용이한 시스템을 구축할 수 있다.

 

협력과 메세지

객체지향 세계에서는 “메세지”라는 오직 한 가지 의사소통 수단만이 존재한다. 요청하는 것을 “메세지를 전송한다”고 하고/ 요청을 받는 것을 “메세지를 수신한다”고 한다.

메세지를 전송하는 객체를 송신자sender라고 하고, 메세지를 수신하는 객체를 수신자receiver라고 한다.

 

메서드와 자율성

수신자는 수신된 메세지를 처리할 수 있는지 여부를 판단한 후 미리 정해진 자신만의 방법을 따라 메세지를 처리한다. 객체가 메세지를 처리하는 방법을 메서드method라고 한다.

객체지향 프로그래밍 언어에서 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.

 

💡다른 프로그래밍 언어와 객체지향 프로그래밍 언어를 구분 짓는 핵심

어떤 객체에 메세지를 전송하면 결과적으로 메세지에 대응되는 특정 메서드가 실행된다. 메세지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있다.

외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 매커니즘이다. (캡슐화의 개념과도 깊이 연관되어 있다.)

객체를 지향하라

사람들은 객체지향 프로그래밍이라 하면 클래스를 정의하는 방법과 클래스 사이의 상속에 초점을 맞춘다. 하지만 객체지향의 분석/설계의 목적은 훌룡한 클래스를 식별하는 것이다.

자바스크립트 같은 프로토타입 기반 객체지향 언어에서는 클래스가 존재하지 않고 오직 객체만이 존재하기 때문에, 클래스가 객체지향의 핵심을 이루는 요소라고 말하기는 무리가 있다.

 

👩🏻‍💻훌륭한 객체지향 설계자가 되기 위해 해야하는 것

  1. 코드를 담는 클래스의 관점에서 메세지를 주고받는 객체의 관점으로 사고의 중심을 전환하는 것

어떠한 클래스가 필요한가가 아니라!! 어떤 객체들이 어떤 메세지를 주고받으며 협력하는가다!!

클래스는 그저 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다. 객체들 간의 동적인 관계가 중요한 부분이다. 객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.

 

 

 


📌 느낀점:)

저번 학기에 자바 전공 수업을 들으면서 객체지향 설계를 이용해 미니 프로젝트를 만들었다. 프로젝트 첫 시간에는 객체지향적인 사고로 생각해서 UML를 만드는 것도 힘들었다. 절차지향적인 사고로 프로그래밍 분야를 접해서 그런지 객체지향적인 사고로 완전히 생각을 바꾸는 게 어색했다. C++을 배울 때에도 코딩 테스트 같은 느낌의 문제들만 풀었지, 이런 프로젝트를 설계해 볼 경험이 없었다. 어찌어찌 저번 학기에 프로젝트를 잘 완성하고 점수도 어찌어찌 잘 받았지만! 학기가 끝나고 느낀 점은 난 아직 객체지향 사고가 부족하다는 것이었다. 그래서 방학 동안 객체지향 사고를 더 집중해서 공부하고 이번 학기에 자바 프로젝트를 위해 나의 뇌를 객체지향으로 바꾸고 싶었다.

객체지향의 본질을 클래스라고 생각하고 있었다. 이번 첫 챕터를 읽으면서 “이름 자체가 객체지향인데 왜 객체를 주인공으로 생각을 안 하고 있었을까?”라는 생각이 들면서 나의 사고를 다시 돌아보게 되었다. 자바도 클래스를 중심으로 생각하지 말고 객체들의 상호작용으로 이해하면 좀 더 이해하기가 수월할 것 같다.

객체지향을 인간의 세계와 비교하면서 이해하니까 이해가 쉬웠다. 객체들의 세계를 내가 만드는 것이 객체지향 설계의 핵심인 것 같았다. 프로젝트를 설계하는 게 마치 게임을 만드는 것 같이 이해돼서 흥미로웠다. 객체들이 메세지를 주고받으면서 내가 원하는 방향을 하나하나 설계하기 시작하면, 처음에 아주 작은 기능들을 나눠놓은 것처럼 보이지만 결국에는 내가 원하는 대로 프로그래밍할 수 있고, 작게 나눔으로써 유지 보수도 쉽고 이해도 쉬워진다는 것을 느꼈다!

 


같이 스터디를 진행하는 Devocean Young 1기 동기인 경욱님의 글도 참고하면 좋을 것 같다

역시 여러사람과 의견을 나누면 더 지식이 풍부해진다 🙌

https://velog.io/@kimku1018/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B4-Study-1

반응형