주녁, DevNote
article thumbnail

개요

이 글은 조영호님의 객체지향의 사실과 오해(위키북스)를 읽고 정리한 글입니다.

목표

객체지향의 목표는 실세계를 모방하는 것이 아니다.

오히려 새로운 세계를 창조하는 것이다.

 

클래스나 상속을 중점으로 바라보던 고정관념을 돌아보고

자신만의 견해를 만들 수 있도록 해보자!


여정

협력

시너지를 생각하라. 전체는 부분의 합보다 크다. - 스티븐 코비

협력 = 요청과 응답

  • 요청과 응답으로 이루어진 협력은 거대하고 복잡한 문제를 해결할수 있게 해준다.
  • 협력의 성공은 특정한 역할(Role)을 맡은 개인이 요청을 얼마나 성실히 이행하는가에 달려있다.

역할과 책임

  • 역할은 특정한 사람이 협력 안에서 차지하는 책임과 의무이다.
  • 여러 사람이 동일한 역할을 수행할 수 있다. (= 누가 커피를 서빙하던 상관 없다)
  • 역할은 대체 가능성을 의미한다. (= 서빙하는 사람이 두 명이면 누구든 상관 없다)
  • 책임을 수행하는 방법은 자율적으로 선택할 수 있다.(동일 요청에 다른 응답이 가능하다)
  • 책임은 하는 것(Doing)과 아는 것(Knowing)으로 나눌 수 있다.
  • 한 사람이 동시에 여러 역할을 수행할 수 있다.

객체를 지향하라

  • 중요한 것은 어떠한 클래스가 필요한가? 가 아니다.
  • 클래스는 협력관계를 코드로 옮기는 도구에 불과하다.
  • 중요한 것은 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가? 이다.
  • 객체는 충분히 협력적이여야 한다.
  • 협력적이라는 뜻은 무조건 응답하는 수동적인 존재가 아니라 자율적인 존재를 말한다.
  • 자율적이라는 뜻은 자신만의 원칙으로 응답여부, 행동방식을 스스로 결정하는 것을 말한다.
  • 전지전능한 객체는 자멸한다

객체

객체 = 상태 + 행동 + 식별자

  • 객체는 상태를 가지며 변경 가능하다.
  • 객체의 상태를 변경시키는 것은 행동이다.
  • 행동의 결과는 상태에 의존적이며, 상태를 이용해 서술할 수 있다.
  • 행동의 순서가 결과에 영향을 미친다.
  • 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.

좋은 객체가 되려면,

  • 협력적이고 자율적인 객체가 되기 위해서는 필요한 행동과 상태를 알고있어야 한다.
  • 필요한 행동과 상태를 알기 위해서는 객체의 내부와 외부를 명확하게 구분해야 한다.
  • 즉, 내부 간섭은 차단하고, 외부에는 허락된 수단으로만 의사소통해야 한다.
  • 이는 다른 객체가 무엇(What)을 하는지는 알 수 있지만 , 어떻게(How) 수행하는지는 알 수 없다는 것을 말한다.
  • 허락된 의사소통 수단은 메시지, 이를 전송하는 방법을 메서드라고 한다.
  •  메시지(외부의 요청이 무엇인지)와 메서드(요청을 처리)를 분리하는 것이 핵심이다.

추상화

현상은 복잡하다.
법칙은 단순하다.
버릴 게 무엇인지 알아내라.
- 리처드 파인만 -

모든 복잡성을 표현할 필요는 없다.

  • 객체지향은 추상화를 통해 현실의 복잡성을 극복한다.
  • 추상화는 어떤 양상, 구조 등을 이해하기 위해 어떤 특정 절차나 물체를 의도적으로 생략하는 것이다.
  • 추상화는 공통점을 취하는 일반화 + 중요한 부분을 강조하는 단순화로 이루어진다.

객체를 분류하는 개념

  • 공통점으로 묶을 수 있는 그릇을 개념이라고 하고, 이를 객체에 적용하면 개념의 인스턴스(Instance)가 된다.
  • 개념은 3가지 관점으로 볼 수 있다 = 심볼(명칭) / 내연(개념의 정의) / 외연(인스턴스의 집합)
  • 따라서, 개념을 가진 객체는 분류할 수 있다.
  • 컴퓨터 공학적으로 개념은 타입(Type)과 동일하다.
  • 객체를 타입으로 분류하는 기준은 행동이며, 내부 표현은 아무런 상관이 없다.
  • 즉, 동일한 책임을 수행하는 객체는 동일한 타입이다.
  • 동일한 타입의 객체이지만 서로 다른 데이터를 가질 수도 있다. 이것이 다형성이다.
  • 일반화된 타입(SuperType)은 특수화된 타입(SubType)으로 대체될 수 있다.

왜 추상화를 사용해야 하는가?

  • 추상화는 시간에 따라 동적으로 변하는 객체의 상태를 정적으로 다룰 수 있게 해준다.
  • 즉, 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법이기 때문이다.

인터페이스

메시지가 인터페이스를 결정한다.

  • 객체의 인터페이스만 알면, 객체의 내부나 작동방식을 몰라도 된다.
  • 객체가 다른 객체와 상호작용하는 유일한 방법은 메시지 전송이다.
  • 즉, 객체의 인터페이스는 메시지가 결정한다.
  • 인터페이스만 동일하다면 다른 객체로 대체할 수도 있다.

인터페이스의 세 가지 원칙

  • 인터페이스는 좀 더 추상적이어야 한다.
  • 외부로 노출되는 인터페이스는 최소화해야 한다.
  • 인터페이스와 구현 간에는 차이가 있음을 인식해야 한다.
  • = 객체가 가져야 할 상태와 메서드 구현은 객체 내부에 있어야 한다.

 

 


초보자들이 주로 하는 실수

객체지향 세계는 현실세계를 단순히 모방한 것으로 생각한다.

현실에서는 수동적인 존재(전화기, 자동차, 계좌 등)가 객체지향 세계에서는 능동적인 존재(의인화)로 변한다.

즉, 소프트웨어 객체는 현실세계의 수동적인 존재를 은유적으로 표현하여 창조한 것이다.

 

상태를 먼저 결정하고 행동을 나중에 결정한다. (행동이 아닌 클래스를 먼저 떠올린다)

상태를 노출시켜 캡슐화를 저해하고, 객체를 상태 위주로 고립시킨다.

객체에게 상태를 묻지말고, 시켜라 (Tell, Don't Ask)

 

재사용성을 위해 너무 넓은 범위를 추상화한다. (모호한 추상화를 한다)

추상화는 객체가 책임을 가지고 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준이어야 한다.


 

profile

주녁, DevNote

@junwork

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!