ch.01 협력하는 객체들의 공동체


오해 : 객체지향의 핵심은 클래스이다.

사실 : 객체지향의 핵심은 객체, 그리고 메시지를 주고받는 객체들의 동적인 관계이다.


조용호 저, 『객체지향의 사실과 오해』 위키북스(2015) 를 읽고,

'ch.01 협력하는 객체들의 공동체'를 정리한 내용이다.

해당 챕터에서는 '객체지향의 핵심은 클래스이다'라는 명제가 오해이며,

'객체지향의 핵심은 객체와 객체들의 협력'이 사실이라 설명하고 있다.

이러한 오해와 사실을 통해 다음의 정의를 잘 이해할 수 있었다.

 

"객체지향이란, 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고,

객체를 이용해 시스템을 분할하는 방법이다."

 

객체지향의 개념은 1960년대에 발표된 프로그래밍 언어인 시뮬라67(Simula67)에서 출발했으며,

스몰토크(smalltalk)와 C++, 자바로 대표되는 클래스 기반 프로그래밍 언어의 유행이 객체지향의 인기를 주도했다.

초기 객체지향 프로그래밍 언어의 초점은 클래스(새로운 개념의 데이터 추상화를 제공하는)라는 빌딩 블록에 맞춰졌다.

그로인해 객체지향의 초기 의도와 달리, 많은 사람들이 객체지향이란 클래스를 지향하는 것으로 오해하고 있다.


오해와 달리, 객체지향의 지향점은 객체이다.

클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다.

중요한 것은 "어떤 객체들이 어떤 메시지를 주고받으며 협력하는가"다.

객체들은 적합한 역할을 갖고 적절한 책임을 수행해야 한다.

그러한 객체들 간에 유연하고 견고한 협력 관계를 구축해야 한다.

객체의 역할, 책임, 협력에 집중해라.


각 키워드들을 부연하면, 아래와 같다.


객체
- 애플리케이션의 기능을 구현하기 위해 존재한다.
- 아주 작은 기능조차 복잡하고 거대하기 때문에
  하나의 기능을 여러 객체로 나누어, 객체 간 협력을 통해 기능을 구현한다.
- 협력에 참여하는 주체이다
- 객체는 충분히 협력적이어야 한다.(협력적이지 않은 객체는 내부적인 복잡도에 의해 자멸한다)
- 객체는 충분히 자율적이어야 한다.(캡슐화를 통해 자율성을 확보한다. 자율적이지 않은 객체는 내부와 외부가 명확하게 구분되지 않으며, 애플리케이션을 복잡하게 만든다.)

책임
- 애플리케이션의 기능을 분할한 단위이다.
- 객체가 책임을 수행하는 방법은 자율적으로 선택할 수 있다.

역할
- 협력에 참여하는 객체가 협력 안에서 차지하는 책임이나 임무를 의미한다.
- 역할은 책임을 내포한다.(역할은 관련된 책임의 집합이다.)
- 여러 객체가 동일한 역할을 수행할 수 있다.
- 역할은 대체가능성을 의미한다
- 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

협력
- 복잡한 문제(기능)를 효율적으로 해결(구현)하기 위해 객체들 간의 협력관계(공동체)를 구축한다.
- 협력은 요청객체(메시지를 전송하는 객체 : sender)와 과 응답객체(요청에 답변하는 객체 : receiver)로 구성된다.
- 요청은 연쇄적이다(하나의 요청은 또 다른 객체에 대한 요청을 유발한다.)
- 응답 또한 요청의 방향과 반대 방향으로 연쇄적으로 전달된다.



참고

https://st-lab.tistory.com/151

 

객체지향(OOP)과 절차적 프로그래밍(PP)

오늘은 프로그래밍에서 중요한 개념 중 하나인 객체지향 프로그래밍(Object Oriented Programming)과 절차적 프로그래밍(Procedure Programming)에 대해 알아보고자 합니다. 대개 객체지향 프로그래밍 언어를

st-lab.tistory.com

https://iosdevlime.tistory.com/entry/CSBasic-%EB%84%88%EC%99%80-%EB%82%98-%EC%9A%B0%EB%A6%AC-%EB%AA%A8%EB%91%90-%EA%B0%9D%EC%B2%B4Object

 

[CS/Basic] 그래서, 객체(Object)가 무엇인가요?

프로그래밍의 패러다임 중, [목적/방식]에 따라 명령형 / 선언형 2가지 형태를 앞선 포스팅에서 살펴보았습니다. 좀 더 파고들어, 명령형에서 파생되는 절차적, 객체지향 프로그래밍을 이해하기

iosdevlime.tistory.com

https://iosdevlime.tistory.com/entry/CSBasic-%EB%A7%88%EC%B9%A8%EB%82%B4-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-OOP-Object-Oriented-Programming

 

[CS/Basic] 마침내, 객체지향 프로그래밍 (OOP, Object-Oriented Programming)

쉴새없이 달려온 프로그래밍 패러다임,, 마침내, 프로그래밍을 조금이라도 맛본 개발자들이라면 오다가다 자주 마주치는 '객제지향' 에 대해 다뤄보는 시간을 가져볼까 합니다. '객체(Object)' 란

iosdevlime.tistory.com

https://iosdevlime.tistory.com/entry/CSBasic-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%84%A4%EA%B3%84%EC%9B%90%EC%B9%99

 

[CS/Basic] 객체지향 프로그래밍의 특징과 설계원칙(SOLID)

자, 이번 포스팅은 지난번 객체지향 포스팅에서 미처 다루지 못했던 객체지향 프로그래밍의 4가지 특징 그리고 객체지향 설계 원칙(SOLID) 위 2가지 사항에 대하여 살펴볼 예정입니다. 이전에 다

iosdevlime.tistory.com

 

+ Recent posts