본문 바로가기

JAVA/JAVA 객체지향

[ 객체지향의 사실과 오해] 02 / 이상한 나라의 객체

해당 포스트는  객체지향의 사실과 오해를 공부하기 위해 정리해놓은 글입니다.

자세한 내용은 해당 책을 참조해주세요.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788998139766

 

객체지향의 사실과 오해 - 교보문고

역할, 책임, 협력 관점에서 본 객체지향 | 현재의 소프트웨어 개발에 있어 가장 중요한 패러다임이 객체지향이라는 사실에 대부분 이견이 없을 것이다. 절차형 패러다임을 접목한 C++나 함수형

www.kyobobook.co.kr


객체지향과 인지 능력

  • 객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것.
  • 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것

객체, 그리고 소프트웨어 나라

객체란 식별 가능한 개체 또는 사물.

객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수 도 있다.

객체를 상태(state), 행동(behavior), 식별자(identity)를 이용해 구분한다.

상태

특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다. 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다. 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.

  • 프로퍼티(property) - 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다.
    프로퍼티 값(property value)은 시간이 흐름에 따라 변경되기 때문에 ‘동적’이다.
    프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가지 종류의 조합으로 표현할 수 있다.
    앨리스의 경우 키, 위치, 음료가 앨리스의 프로퍼티이며 프로퍼티는 ‘정적’이다.
  • 링크(link) - 객체와 객체 사이에는 링크가 존재해야만 요청을 보내고 받을 수 있다. (앨리스와 음료의 관계)
  • 속성(attribute) - 객체 간의 선으로 표현되는 링크와 달리 객체를 구성하는 단순한 값은 속성이라고 한다. 앨리스의 키와 위치는 속성이다.

행동

  • 상태와 행동
    • 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적(눈에 보임)이어야 한다.
    상태와 행동 사이에는 다음과 같은 관계가 있음을 알 수 있다.
    • 객체의 행동은 상태에 영향을 받는다.
    • 객체의 행동은 상태를 변경시킨다.
    상태라는 개념을 이용해 행동을 다음의 두 가지 관점에서 서술할 수 있음을 의미한다.
    • 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
    • 상호작용이 어떻게 현재의 상태를 변경시키는가
  • 협력과 행동
    • 객체 자신의 상태 변경
    • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
  • 객체의 행동으로 인해 발생하는 결과는 두 가지 관점에서 설명할 수 있다.
  • 상태 캡슐화
    • 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 방법 역시 행동뿐이다.
    • 객체의 행동을 유발하는 것은 외부로부터 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정한다.
    • 상태를 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.

식별자

객체를 구별할 수 있는 프로퍼티를 식별자라고 하며, 모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.

  • 값(value) - 숫자, 문자열, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 모델링, 불변 상태(immutable state)를 가진다. 값 객체(value object)는 식별자를 가지지 않는 값을 가리킨다.
  • 객체 - 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다. 가변 상태(mutable state)를 가진다. 참조 객체(reference object), 엔티티(entity)라고도 한다.

값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 하며, 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.

  • 동등성(equality) - 상태를 이용해 두 값이 같은지 판단해야 한다. 값은 불변 상태 이기 때문에
  • 동일성(identical) - 식별자를 기반으로 객체가 같은지를 판단해야 한다.
  1. 값과 객체의 차이점

객체의 특성

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

기계로서의 객체

객체가 외부에 제공하는 행동의 대부분은 쿼리와 명령으로 구성된다.

  • 쿼리(query) - 객체의 상태를 조회하는 작업
  • 명령(commend) - 객체의 상태를 변경하는 작업

기계의 부품은 단단한 금속 외피 안에 감춰져 있기 때문에 기계를 분해하지 않는 한 내부를 직접 볼 수 없으며, 기계 외부에 부착된 버튼으로 기계와 상호작용할 수 있다.

보일러를 예로 들면, 보일러의 온도를 확인하기 위해 보일러를 분해하지 않고 온도 확인 버튼만 클릭하면 보일러의 온도 상태를 알 수 있다. → 쿼리

보일러의 온도를 높이고 낮추기 위해 온도 버튼을 클릭하여 변경한다. → 명령

기계의 금속 외피는 객체의 캡슐화를 비유한다.

행동이 상태를 결정한다

상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.

  • 상태를 먼저 결정할 경우 캡슐화가 저해된다.
  • 객체를 협력자가 아닌 고립된 섬으로 만든다.
  • 객체의 재사용성이 저하된다.

객체를 상태가 아니라 행동에 초점을 맞춰 설계해야 한다.

“행동이 상태를 결정한다.”

협력 → 행동 → 상태 단계로 고려해야 한다.

은유와 객체

객체지향을 현실 세계를 모방해야 한다고 보는 관점은 잘못되었다.

소프트웨어 상품은 실제 세계의 상품이 하지 못하는 가격 계산과 같은 행동을 스스로 수행할 수 있다.

의인화

현실 속 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다.

현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화(anthropomorphism)라고 부른다.

객체지향 세계는 현실을 모방한 것이 아니라 현실의 모습을 참조하여 새로운 세계를 창조하는 것이다.

객체지향의 세계에 객체는 현실 속 객체의 추상화가 아니다. 현실 속의 객체보다 더 많은 특징과 능력을 보유한다.

은유

현실 속의 객체의 의미 일부가 소프트웨어 객체로 전달되기 때문에 프로그램 내의 객체는 현실 속의 객체에 대한 은유다.

현실의 전화기 객체가 소프트웨어 객체와 완전히 똑같지는 않지만 현실의 전화기라는 개념을 이용해 소프트웨어 객체를 묘사하면 전화를 걸 수 있다는 사실을 쉽게 이해하고 기억할 수 있다.