본문 바로가기

Dev Book Review

[객체지향의 사실과 오해] 1장 : 협력하는 객체들의 공동체

 

제가 하고있는 스터디에서 개발 서적을 읽기로 결정을해서

매주 정해진 양을 읽고, 서로 이해안되는 점, 신기한 점을 공유하기로 했습니다 :) 

저는 이렇게 책을 읽고 저의 생각, 헷갈렸던 점을 다른 박스로 구분하려합니다!

0. 개요

0-1. 객체지향 프로그래밍

객체지향 프로그래밍 = 현실 속에 존재하는 사물을 SW 내부로 옮겨온다.

 

SW : 실세계의 투영
객체 : 사물에 대한 추상화

 

[모방한 것] : 직접 대응되는 사물로 생각하지만 실제로는 X (철학적 의미로 생각)

But, 실제로 연관성은 희미하다 (사상 이해에 효과적으로 사용하는 통념)

 

객체지향 프로그래밍의 목적 = 새로운 세계의 창조

 

1. SW 객체의 자율성 (authonomous) : 상태와 행위를 캡슐화(encapsulation)

2. 객체는 협력한다 (collaboration) : 객체끼리 협력이 가능한 수단은 메세지(message)

2. 연결 완전성 (seamlessness) : 실세계 사물을 기반으로 SW 객체를 식별한 후 구현까지 이어나간다.

 

 

상태와 행위

상태는 JAVA의 member 변수
행위는 method를 의미 할 것 같다.

 

1. 협력하는 사람들

협력에 참여하는 모든 사람이 역할에 따른 책임을 완수해야한다.

협력에는 여러 객체들이 참여한다.

 

책임 - 객체가 가지는 모든 메서드

역할 - 협력 내에서 쓰이는 책임이 역할

 

협력 (collaboration) = 요청 (request) +응답 (response)

  • 요청이 요청을 연쇄한다 요청 -> 요청 -> 요청
  • 요청과 응답은 서로 반대 방향으로 이루어진다.
  • 역할이 있으면 책임도 주어진다.

 

1-1. 협력의 특징

  1. 여러사람이 동일 역할을 수행 가능하다
  2. 역할 = 대체가능성 (substitude)
  3. 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
    = 동일 요청에 대해 서로 다른 방식으로 응답이 가능하다 (다형성 : polymorphism)
  4. 한 사람이 동시에 여러 역할을 수행할 수 있다.

2. 역할, 책임, 협력

사람 -> 객체
에이전트의 요청 -> 메시지

에이전트의 요청 처리법 -> 메서드

 

협력 = 특정 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답으로 목표를 달성하는 것

목표 = 어플리케이션의 기능을 구현하는 것

  1. 목표를 책임으로 작게 분할하여 -> 역할을 지닌 객체가 적절하게 처리가능하게 한다.
  2. 적절한 역할을 가진 객체가 처리하게 한다.

기능 = 객체들간의 요청 응답을 주고받는 것

2-1. 객체의 역할

  1. 여러 객체가 동일 역할을 수행
  2. 역할 = 대체 가능성
  3. 각 객체는 책임 수행할 수 있는 방법을 자율적으로 수행 가능하다
  4. 하나의 객체가 동시에 여러 역할을 수행 가능하다

3. 협력속에 사는 객체

패러다임의 중심 = 객체

3-1. 객체란?

  • 협력에 참여하는 주체
  • 애플리케이션 기능 구현을 위해 존재 : 혼자서 어려우니 다른 객체와 협력

객체지향의 아름다움 = 협력

협력의 조화 = 객체의 품질이 좋다

[3단 논법에 의해!!]

객체지향의 아름다움 = 객체의 품질이 좋다는 것

3-2. 객체의 두가지 덕목

  1. 객체는 '협력적'이어야 한다.
    • 다른 객체에서 오는 요청 응답을 받는다
      god object: 도움을 무시하고 스스로 모든 것을 처리하는 객체 (안좋다)
    • 응답 방식 : 객체가 결정
    • 응답 여부 : 객체가 결정한다.
  2. 객체는 '자율적'이어야 한다.
    • 자신의 행동을 스스로 결정하고 책임진다.
    • 요청에 대해 스스로 판단하고 행동한다
    • ex ) 손님이 캐시어에게, 바리스타한테 어떤 방식으로 전달하라 명령하지 않음

3-3. 객체란

= 상태(state)와 행동(behavior)을 함께 지닌 실체

 

= 내부와 외부의 명확한 구분이 있다.

   내부 : 사적인 부분 스스로 관리
   외부 : 접근 허가된 수단으로만 의사소통 ( what O / How X )

 

= 프로세스의 틀 안에서 자율성을 보장한다

자율성 보장 > 유지보수 용이 > 재사용 용이한 시스템 구축

 

상태와 행동은 자율성의 핵심 이유인 듯

- 행동을 하려면 이 행동을 하는데 필요한 상태가 있어야 하므로

 

내부 : 자율성을 의미하는 것 같다. (private 보장)
외부 : 협력적을 의미하는 것 같다. (public하게 협력)

3-4. 메세지(message)

= 객체들의 유일한 의사소통 수단

 

3-5. 메서드(method)

= 객체가 수신된 메세지를 처리하는 방법

   메세지를 전송하면 메시지에 대응되는 메서드를 실행한다

 

처음에는 메세지가 내가 아는 메서드의 parameter이고 method를 이용해 행동을 처리해서 그 결과가 나오는 것이라고 메세지와 메서드를 이해했다. 아래와 같이!

message를 이용해서 요청이 들어오면 그 요청값을 알맞는 method가 받아서 실행한다고 생각했는데

public void method ( T message ){
   ..method의 수행내용
}

 

스터디원들하고 토론하다보니 메서드의 이름이 메세지라는 결론을 내렸다.

public void message (  ){
   message에 알맞는 행동을 한다 : method
}

우리가 코드를 짤 때, 자바 method의 네이밍을 우리가 알기쉽게 직관적으로 (예를들면 getName())과 같이 명령을 하니 method의 이름 자체가 message라고 판단을 하게 되었다.
또한 해당 method는 들어온 param에 따라 message가 전달한 수행하라는 행동을 자율적으로 결정한다.

 

4. 객체 지향의 본질

  1. 객체 지향 : 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분별하는 방법
  2. 자율적인 객체 : 상태행위를 함께 지니며 스스로 자기 자신을 책임지는 객체
  3. 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다.
    각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다
  4. 객체는 다른 객체와 협력하기 위해 메시지를 전송하고 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택한다

 

4-1. 객체와 클래스

통념 : 클래스의 중요성 > 객체의 중요성

BUT : 클래스의 중요성 < 객체의 중요성

 

객체지향의 중심인 객체가 우선이 되어야한다!
class는 객체지향의 구성요소일 뿐이다!

 

prototype 기반 객체 지향언어 = javascript

 

  • class 개념 X 인데도 객체 O
  • 상속도 class가 아닌 객체간 위임(delegation) 기반이다.