객체지향의 사실과 오해

컴공생의 코딩 일기·2023년 6월 14일
0

객체지향의 사실과 오해

협력하는 객체들의 공동체

  • 객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임이다.
  • 객체란 현실 세계에 존재하는 사물에 대한 추상화이다.
  • 객체지향의 목표는 실세계를 모방 하는 것이 아니라 오히려 새로운 세계를 창조하는 것이다.
  • 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이다.
  • 객체지향에서 가장 중요한 개념 세가지: 역할, 책임 협력
  • 요청과 응답은 연쇄적으로 일어난다.

역할과 책임

  • 역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미한다.
  • 역할이라는 단어는 의미적으로 책임이라는 개념을 내포한다.
  1. 여러 사람이 동일한 역할을 수행할 수 있다.
  2. 역할은 대체 가능성을 의미한다. : 두 명이 동일한 역할을 수행할 수 있다면 요청자 입장에서 둘 중 어떤 사람이 역할을 수행하더라도 문제가 되지 않는다.
  3. 책임을 수행하는 방법은 자율적으로 선택할 수 있다. : 요청을 받은 사람들은 요청을 처리하는 방법을 자유롭게 선택할 수있다.
  4. 한 사람이 동시에 여러 역할을 수행할 수 있다. : 한 사람이 바리스타의 역할을 동시에 수행하는 것도 가능하다. 따라서 한 사람이 동시에 둘 이상의 역할을 수행하는 것도 가능하다.
  • 사람 -> 객체, 에이전트의 요청 -> 메시지, 에이전트가 요청을 처리하는 방법 -> 메서드
  • 객체의 역할
    • 여러 객체가 동일한 역할을 수행할 수 있다.
    • 역할은 대체 가능성을 의미한다.
    • 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
    • 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
  • 객체는 충분히 ’협력적’이어야 한다.
  • 객체는 충분히 ’자율적’이어야 한다.

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

  • 객체를 상태(state), 행동(behavior)을 함께 지닌 실체라고 정의한다.
  • 객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다.
    • 객체의 사적인 부분은 스스로 관리하고 외부에서 일체 간섭할 수 없도록 차단해야 하며,
    • 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통해야 한다.
    • 객체는 다른 객체가 무엇(what), 을 수행하는지는 알 수 있지만 어떻게(how) 수행하는지에 대해서는 알 수 없다.

협력과 메시지

  • 풍부한 메커니즘을 이용해 요청하고 응답할 수 있는 인간들의 세계와 달리 객체지향의 세계에서는 오직 한가지 의사소통 수단만이 존재한다. 이를 메시지라고 한다.

메서드와 자율성

  • 객체가 수신된 메시지를 처리하는 방법을 메서드(method)라고 부른다.
  • 외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다. 이것은 캡슐화(encapsulation)라는 개념과도 깊이 관련돼 있다.

객체지향의 본질

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

객체를 지향하라

  • 클래스가 객체지향 프로그래밍 언어의 관점에서 매우 중요한 구성요소(construct)인 것은 분명하지만 객체지향의 핵심을 중심 개념이라고 말하기에는 무리가 있다.
  • 애플리케이션을 협력하는 객체들의 공동체가 아닌 클래스로 구성된 설계도로 보는 관점은 유연하고 확장 가능한 애플리케이션의 구축을 방해한다.
  • 훌륭한 객체지향 설계자가 되기 위해 거쳐야 할 첫 번째 도전은 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하는 것이다.
  • 중요한 것은 어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고 받으며 협력하는가다.
  • 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다. 클래스는 객체지향 세계의 도시전설이다.
  • 객체지향의 핵심은 클래스가 아니다. 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.
  • 클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘일 뿐이다.
  • 객체지향의 중심에는 클래스가 아니라 객체가 위치하며, 중요한 것은 클래스들의 정적인 관계가 아니라 메시지를 주고받는 객체들의 동적인 관계다.

이상한 나라의 객체

객체지향과 인지 능력

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

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

  • 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다.
  • 객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수 도 있다.
  • 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.

상태

  • 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.

상태와 프로퍼티

  • 숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓과 같은 단순한 값들은 객체가 아니다.
  • 단순한 값들은 그 자체로 독립적인 의미를 가지기보다는 다른 객체의 특성을 표현하는 데 사용된다. 다시 말해 다른 객체의 상태를 표현하기 위해 사용된다.
  • 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
  • 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다. (앨리스의 경우 키,위치 음료(객체 안에 객체)가 앨리스의 프로퍼티가 된다.)
  • 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 ’정적’이다. 반면 프로퍼티 값(property value)은 시간이 흐름에 따라 변경되기 때문에 ’동적’이다. (앨리스의 키는 음료를 마시면 작아질 것이고, 문을 통과하면 위치가 정원으로 바뀔 것이며, 음료를 다 마신 후에는 현재 가지고 있는 음료을 버릴게 될 것이다. )
  • 객체와 객체 사이의 의미 있는 연결을 링크(link)라고 한다.
  • 객체와 객체 사이에는 링크가 존재해야만 요청을 보내고 받을 수 있다.
  • 객체의 링크를 통해서만 메시지를 주고 받을 수 있다.
  • 객체를 구성하는 단순한 값은 속성(attribute) 이라고 한다.
  • 객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가지 종류의 조합으로 표현할 수 있다.
  • 객체의 상태 정의
    • 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
    • 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다.
    • 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
  • 객체는 자율적인 존재이다.
  • 객체지향의 세계에서 객체는 다른 객체의 상태에 직접적으로 접근할 수도, 상태를 변경할 수도 없다.

행동

상태와 행동

  • 객체의 행동은 객체의 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이다.
  • 상태와 행동 사이에 관계
    • 객체의 행동은 상태에 영향을 받는다.
    • 객체의 행동은 상태를 변경시킨다.
  • 상태라는 개념을 이용한 행동의 관점
    • 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
    • 상호작용이 어떻게 현재의 상태를 변경시키는가

협력과 행동

  • 객체는 다른 객체와 적근걱으로 상호작용하며 ’협력하는 객체들의 공동체’에 참여하기 위해 노력한다.
  • 객체는 다른 객체와 메시지를 통해서만 의사소통이 가능하다.
  • 객체는 협력에 참여하는 과정에서 자기 자신의 상태뿐만 아니라 다른 객체의 상태 변경을 유발할 수도 있다.
  • 객체의 행동으로 인해 발생하는 결과 두 가지 관점
    • 객체 자신의 상태 변경
    • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
  • 행동 정의
    • 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.

상태 캡슐화

  • 객체지향의 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재다. 다른 객체에게 메시지만 전달 할 수 있을 뿐 모든 객체는 다른 객체를 관리할 수 없다.
  • 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
  • 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
  • 객체의 행동을 유발하는 것은 외부로부터 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정한다.

식별자

  • 객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미한다. 이 프로퍼티를 식별자라고 한다. 모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.
  • 상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)이라고 한다.
    • 값의 상태는 결코 변하지 않기 때문에 어떤 시점에 동일한 타입의 두 값이 같다면 언제까지라도 두 값은 동등한 상태를 유지할 것이다. 값은 오직 상태만을 이용해 동등성을 판단하기 때문에 인스턴스를 구별하기 위한 별도의 식별자를 필요로 하지 않는다.
    • 객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다. 따라서 객체는 가변 상태(mutable state)를 가진다고 말한다.
  • 식별자란
    • 식별자란 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다. 값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다. 객체는 상태가 변경될 수 있기 때문에 식별자를 이용해 동등성 검사를 통해 두 인스턴스를 비교할 수 있다.

객체의 특성 요약

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

0개의 댓글