[우테코 스터디] 객체지향의 사실과 오해 (1)

2장 스터디

  • 프로퍼티와 프로퍼티 값의 차이
  • 정적 & 동적
  • 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현
  • 단순한 값과 다른 객체를 참조하는 링크로 구분
  • 객체가 취하는 행동은 객체 자신의 상태를 변경시킨다
  • 객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수 효과를 초래한다는 것을 의미 → Side effect
    • 객체의 행동은 상태에 영향을 받는다
    • 객체의 행동은 상태를 변경시킨다
  • 두 인스턴스의 상태가 같다면 값이 같다고 판단한다.
  • 값이 같은지 여부는 상태가 같은지로 판단한다.

식별자

  • 객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미하며, 이를 식별자라고 한다.
  • 즉 객체가 아닌 단순한 값은 식별자를 가지지 않는다.
  • 값은 숫자, 문자열, 날짜, 시간 등 변하지 않는 양을 모델링한다.
    • immutable state
  • 동등성 : 상태를 이용해 두 값이 같은지 판단할 수 있는 성질
  • 값은 오직 상태만을 이용해 동등성을 판단하기 때문에 별도의 식별자가 필요 없다.
  • 객체는 시간에 따라 변경되는 상태를 포함하며 행동을 통해 상태를 변경한다.
    • mutable state
  • 나라는 사람은 상태와 무관하게 동일한 사람으로 판단될 수 있는 일종의 식별자를 가지고 있는 객체이다.
  • 동일성 : 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질

요점 1>상태를 기반으로 객체의 동일성을 판단할 수 없는 이유는 시간의 흐름에 따라 객체의 상태가 변하기 때문이다.

요점 2>식별자란 어떤 객체를 다른 객체를 구분하는 데 사용하는 객체의 프로퍼티이다.

요점 3> 객체의 상태를 변경시키는 것은 객체의 행동이며, 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다. 또한 행동의 순서가 결과에 영향을 미친다.

행동이 상태를 결정한다.

  • 상태를 먼저 결정할 경우 설계에 나쁜 영향을 끼친다.
  1. 캡슐화가 저해된다.
    1. 공용 인터페이스에 그대로 노출 될 확률이 높아진다.
  2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
    1. 협력이라는 문맥에서 벗어난 채 객체를 설계한다.
  3. 객체의 재사용이 저하된다.
    1. 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어려움

책임 주도 설계 : 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.

은유와 객체

  • 추상화 : 실제의 사물에서 자신이 원하는 특성만 취하고 필요 없는 부분을 추려 핵심만 표현하는 행위
  • 소프트웨어 객체를 창조할 때 우리는 결코 현실 세계의 객체를 모방하지 않는다.

3장 스터디

추상화를 통한 복잡성 극복

  • 해리 백이 제안한 지하철 노선도는 불필요한 지형 정보를 제거함으로써 단순함을 달성한 추상화
  • 승객들이 지하철을 바라보는 모델과 일치했기 때문에 유용
  • 역의 위치가 아닌 역과 역 사이의 연결 관계가 중요하다.

추상화의 정의

  • 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법
  • 공통점을 취하고 차이점을 버리는 일반화
  • 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것

요약1>명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서 객체라고 한다.'

  • 앨리스는 인물들의 차이점을 의도적으로 무시하고 공톰점만을 강조함으로써 그룹에 속할 인물들을 선택했다.
  • 차이점을 무시하고 공통점만을 취해 트럼프라는 개념으로 단순화하는 것은 추상화의 일종이다.

요약2> 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스라고 한다.

  • 즉 객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다.
  • 개념이 객체에에 적용됐을 대 객체를 개념의 인스턴스라고 한다.
  • 개념 : 공통점을 기반으로 객체들을 묶기 위한 그릇
    • 일반적으로 우리가 인식하고 있는 다양한 사물이나 아이디어, 관념
    • 개념을 이용해서 객체를 여러 그룹으로 분류 할 수 있다.

개념의 3가지 관점

  • 개념은 특정한 객체가 어떤 그룹에 속할 것인지를 결정한다.
  • 어떤 객체에 어떤 개념이 적용됐다고 할 때는 그 개념이 부가하는 의미를 만족시킴으로써 다른 객체와 함께 해당 개념의 일원이 됐다는 것을 의미한다.
  • 심볼 : 개념을 가리키는 간략한 이름이나 명칭
    • 앨리스 이이야기에서의 트럼프
  • 내연 : 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인
    • 앨리스 이야기에서의 트럼프에 대한 설명
    • 몸이 납작하고,,, 두 손과 두 발은 네모 귀퉁이…
  • 외연 : 개념에 속하는 모든 객체의 집합 > set
    • 개념에 속하는 객체들, 개념의 인스턴스들이 모여 이뤄낸 집합
    • 정원사 그룹, 병사 그룹, 왕자와 공주 등

분류

  • 분류란 객체에 특정한 개념을 적용하는 작업이다.
  • 객체에 특정한 개념을 적용하기로 결심했을 때 우리는 분류를 하고 있다.
  • 적절한 개념에 따라 분류하지 못한 애플리케이션은 유지보수가 어렵고 변화에 대처할 수 없다.

요약 1> 분류는 추상화를 위한 도구이다.

  1. 구체적인 사물 간의 공통점을 취하고 차이점을 버리는 일반화
  2. 중요한 부분을 강조하기 위해 불피요한 세부 사항을 제거해 단순화

요약2> 개념은 객체들의 복잡성을 극복하기 위한 추상화의 도구이다.

  • 매 순간 사물들을 개념의 틀로 걸러가며 세상을 추상화하고 있다.

타입

  • 타입은 개념이다.
  • 공통점을 기반으로 객체들을 묶기 위한 틀
  • 객체 역시 타입의 인스턴스이다.

데이터 타입 : 타입이 없는 경우 무질서가 발생한다. 데이터의 분류의 필요성 증가로 생겨난 개념

타입 시스템 : 타입 시스템의 목적은 메모리 안의 모든 데이터가 비트열로 보임으로써 야기되는 혼란을 방지하는 것이다.

  • 데이터가 잘못 사용되지 않도록 제약사항을 부과하는 것
    • 타입은 데이터가 어떻게 사용되느냐에 관한 것이다.

요약1> 데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터이다.

첫째, 어떤 객체가 어떤 타입에 속하는지 결정하는 것은 객체가 수행하는 행동이다.

어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다.

→ 객체가 어떤 데이터를 보유하고 있는지는 타입을 결정하는 데 아무런 영향도 미치지 않는다. (p93)

책임 주도 설계 : 데이터를 먼저 생각하는 데이터 - 주도 설계 방법의 단점을 개선한다.

  • 데이터보다 행동을 먼저 결정하라
  • 협력이라는 문맥 안에서 책임을 결정하라
  • 객체가 메시지를 선택하는 것이 아닌 메시지가 객체를 선택하게 해야한다.

요약2> 데이터 주도 설계는 설계를 시작하는 처음부터 데이터에 관해 결정하도록 강요하기 때문에 너무 이른 시기에 내부 구현에 초점을 맞추게 한다.

  • 캡슐화를 위반하고 객체의 내부 구현을 인터페이스의 일부로 만든다.

요약3>책임 중심의 설계는 객체의 내부 구현을 안정적인 인터페이스 뒤로 캡슐화한다.

일반화와 특수화 관계

  • 타입과 타입 사이에는 일반화, 특수화 관계가 존재할 수 있다.
  • 일반화와 특수화는 동시에 일어난다.
  • 특수하다는 것은 일반적인 개념보다 범위가 더 좁다는 것을 의미
  • 일반화, 특수화는 행동에 관한 것이다.
  • 일반적인 타입은 특수한 타입에 비해 더 적은 수의 행동을 가지며, 특수한 타입은 일반적인 타입에 비해 더 많은 행동을 가진다.

요약 > 특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행할 수 있어야 한다.

슈퍼타입과 서브타입

  • 슈퍼타입 : 일반적인 타입
  • 서브타입 : 특수한 타입
  • 두 타입 간의 관계가 행동에 의해 결정된다는 점
  • 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족시켜야한다.
  • 서브타입은 슈퍼타입의 행위와 호환되기 때문에 서브타입은 슈퍼타입을 대체할 수 있어야 한다.

요약 > 일반화는 추상화를 위한 도구이다.

정적타입과 동적타입

  • 타입은 추상화이다.
  • 정적인 관점에서 앨리스의 모습을 묘사할 수 있다.
  • 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다.
  • 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법이다.
  • 동적모델 : 객체가 살아 움직이는 동안 상태가 어떻게 변하고 행동하는지 포착하는 것
  • 정적모델 (타입모델) : 객체가 속한 타입의 정적인 모습을 표현

클래스

  • 정적인 모델은 클래스를 이용해 구현된다.
  • 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것이다.
  • 클래스와 타입을 동일한 개념이라고 생각
  • 객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.

요약> 동적으로 변하는 객체의 상태와 상태를 변경하는 행위가 중요하며, 클래스는 타입을 구현하기 위해 프로그램이 언어에서 제공하는 구현 메커니즘