flagtags / OOP-study

0 stars 0 forks source link

2장. 이상한 나라의 객체 #2

Open j03y14 opened 6 months ago

j03y14 commented 6 months ago

아기가 가림판에 가려져 일부만 보이는 두 막대가 함께 움직일 때 같은 물체로 인지한다는 실험을 통해서 사람은 어렸을 때부터 뚜렷한 경계를 가지고 함께 해동하는 물체를 하나의 개념으로 인지한다는 사실을 알 수 있다.

객체지향과 인지능력

인간은 타고난 인지능력을 이용해 세상의 다양한 객체를 식별하고 분류함으로써 세상을 이해한다.

객체지향은 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 인지능력에 기반을 두고 있다.

인간은 물리적인 사물 뿐만 아니라 개념적이고 추상적인 것까지 객체로 인식할 수 있다. 동일한 계좌로 동일한 금액을 두 번 이체하더라도 별개의 구분 가능한 것이 그 예이다.

세상을 더 작은 객체로 분해하는 것은 세상의 복잡성을 극복하기 위한 인간의 노력이다. 객체는 인간이 인지하고 구별할 수 있는 경계를 지닌 어떤 것이다.

객체, 그리고 이상한 나라

이상한 나라의 앨리스

앨리스는 정원으로 통하는 문을 통과하기에 적당한 상태로 자신의 키를 변화시켰다. 앨리스의 키가 이유없이 변하는 것은 아니고, 앨리스의 행동에 따라 상태가 변한다.

앨리스의 상태를 결정하는 것은 행동이지만, 행동의 결과를 결정하는 것은 상태이다. 핼리스가 한 행동의 결과는 앨리스의 상태에 의존적이다. 결과가 상태에 의존적이기 때문에 행동간의 순서가 중요하다.

행동에 의해 상태가 변경되더라도 앨리스가 앨리스라는 사실은 변하지 않는다.

요약

객체, 소프트웨어 나라

개별적인 실체로 식별 가능한 사물은 어떤것이라도 객체가 될 수 있다. 객체의 특성을 설명하기 위해서 객체를

  1. 상태
  2. 행동
  3. 식별자 를 지닌 실체로 보는것이 효과적이다.

상태

객체가 어떻게 행동하는지는 그 시점까지 어떤 일이 발생했었는지에 따라 좌우된다. 과거 행동의 이력을 통해서 현재 행동의 결과를 판단하는 것은 복잡하기 때문에 행동의 결과를 단순하게 기술하기 위해서 상태라는 개념을 고안했다. 상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 행동방식을 이해할 수 있다.

상태와 프로퍼티

단순한 값들은 객체가 아니라 다른 객체의 상태를 표현하기 위해 사용된다.

하지만 때로는 객체를 사용해 다른 객체의 상태를 표현해야 할 때가 있다. 앨리스가 음료를 들고 있는 상태는 앨리스의 상태 일부를 음료라는 객체를 이용해 표현하는 것이다.

객체와 객체 사이의 의미있는 연결을 링크라고 한다. 객체는 링크를 통해서만 메세지를 주고받을 수 있다.

객체를 구성하는 단순한 값은 속성이라고 한다.

객체의 프로퍼티 = 링크 + 속성

객체는 자율적인 존재이기 때문에 다른 객체의 상태에 직접적으로 접근하거나 수정할 수 없다. 객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 자율성을 유지한다.

행동

상태와 행동

객체의 행동은 자신의 상태를 변경시키는 부수효과를 초래한다.

협력과 행동

객체는 협력하기 위해 다른 객체에게 요청을 보내고, 요청을 수신한 객체는 행동한다. 객체가 행동하도록 만드는 것은 외부로부터 수신한 메세지이다.

객체의 행동은 두가지 관점의 부수효과를 발생시킨다.

상태 캡슐화

객체지향의 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재이기 때문에 앨리스가 음료를 마실 때 음료 객체의 양을 줄이는 것은 음료 객체 자신이어야 한다.

메세지를 전송하는 송신자는 수신자의 상태변경에 대해서는 전혀 알지 못한다. 객체는 외부에 행동만 노출한다.

상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 객체의 자율성을 높인다.

식별자

객체가 식별 가능한 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미한다. 객체의 상태는 변할 수 있기 때문에 동일성을 판단하기 위해서는 식별자를 이용할 수 밖에 없다.

객체 식별자는 다른 객체지향 개념과 비교해 간과하기 쉽지만 객체지향 패러다임의 표현력을 높이는데 중요한 역할을 한다.

행동이 상태를 결정한다.

객체지향 초보들은 상태를 중심으로 객체를 바라본다. 초보자들은 필요한 상태를 결정하고 상태에 필요한 행동을 결정한다.

상태를 먼저 결정하는 것의 단점

  1. 상태가 캡슐화되지 못하고 인터페이스에 노출될 가능성이 존재
  2. 객체는 다른 객체와 협력하기 위해서 존재하는데 협력을 고려하지 않고 객체를 설계하게 된다.
  3. 협력에 참여할 수 있는 능력에 초점을 맞추지 않기 때문에 재사용성이 저하된다.

행동이 협력에 참여하는 유일한 방법이기 때문에 객체가 적합한지를 판단하는 것은 행동이다.

객체지향 설계는 어플리케이션에 필요한 협력을 생각하고 협력에 필요한 행동을 생각한 후 수행할 객체를 선택하는 방식으로 수행된다.

은유와 객체

객체지향은 현실세계의 모방이 아니다.

소프트웨어에서는 모든 객체가 능동적으로 변한다. 현실의 객체보다 더 많은 특징을 가지게 된다.


정리

객체가 무엇인지에 대해서 설명하고 있음

복잡성을 극복하기 위해서 인지하고 구분할 수 있는 독립적인 객체들로 분해한다.

객체는 식별자, 행동, 상태 측면에서 설명할 수 있다.

객체의 행동은 객체의 상태에 따라서 좌우된다. 따라서 상태는 중요하다.

상태

  1. 어떻게 표현하는지? => 프로퍼티. 링크와 속성
  2. 어떻게 접근하는지? => 행동
  3. 어떻게 수정하는지? => 행동

행동

  1. 외부적인 관점 => 협력
  2. 내부적인 관점 => 상태 변경

상태 접근, 변경은 행동으로만 접근 가능 => 자율성

식별자

행동이 상태를 결정한다.

왜? ~~

kkirico commented 6 months ago

2장

사람은 태어난 지 얼마 안 된 시기부터 뚜렷한 경계를 가지고 함께 행동하는 물체를 하나의 개념으로 인지한다.

객체지향과 인지 능력

인간은 좀 더 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력한다.

객체지향 패러다임은 인간이 인지할 수 있는 다양한 객체들이 모여 현실 세계를 이루는 것처럼 소프트웨어의 세계 역시 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음에서 출발한다.

다만, 현실세계와 객체지향의 유사점은 여기까지이고, 객체지향 패러다임의 목적은 현실세계의 모방이 아니라 현실세계를 기반으로 새로운 세계를 창조하는 것이다.

객체, 그리고 이상한 나라

앨리스 객체

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

객체는 상태, 행동, 식별자를 지닌 실체로 보자.

상태

상태가 없다면 어떤 행동의 결과는 ‘과거에 어떤 행동이 있었느냐’에 의존하게 된다.

상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

상태와 프로퍼티

단순한 값들은 객체가 아니다. 이들은 자체로 독립적인 의미를 지닌다기 보다 다른 객체의 특성을 표현하는데 사용된다.

객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.

프로퍼티

객체의 상태를 구성하는 모든 특징을 통틀어 프로퍼티 라고한다.

프로퍼티는 정적이다.(앨리스의 키, 위치, 음료)

프로퍼티 값은 동적이다.(앨리스의 키의 값, 등)

링크

객체와 객체사이의 의미있는 연결을 링크라고한다.

객체와 객체는 링크를 통해서만 메시지를 주고 받을 수 있다.

링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미하며, 일반적으로 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다.

속성

객체를 구성하는 단순한 값을 속성이라고 한다.

프로퍼티 = 속성 + 링크

상태 는 프로퍼티 인가?

자율적인 객체는 스스로 자신의 상태를 책임져야한다. 외부의 객체가 직접적으로 객체의 상태를 주무를 수 없다.

행동

객체의 상태를 변경하는 것은 객체의 자발적인 행동 뿐이다.

협력과 행동

객체의 행동으로 인해 발생하는 결과는

객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이여야 한다.

상태의 캡슐화

앨리스는 직접적으로 음료의 상태를 변경할 수 없다. 단지 음료를 마셨다는 메시지를 전달할 뿐이다.

메시지 송신자는 수신자의 상태 변경에 대해서는 전혀 알지 못한다.

객체가 외부에 노출하는 것은 행동 뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법은 역시 행동 뿐이다.

식별자

값이 같은지 여부는 상태가 같은지를 이용해 판단한다.(동등성)

타입이 같은 두 객체의 상태가 완전히 똑같더라도 두 객체는 독립적인 별개의 객체로 다뤄야한다.

두 객체의 상태가 다르더라도 식별자가 같다면 같은 객체로 판단할 수 있다.(동일성)

행동이 상태를 결정한다.

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

  1. 상태를 먼저 결정할 경우 캡슐화가 저해된다?
    • 상태가 깔끔하게 캡슐화 되지 못하고 공용 인터페이스에 노출될 확률이 높아진다?
  2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
    • 다른 객체와의 협력을 고려하지 못하기 때문이다.
  3. 객체의 재사용성이 저해된다.
    • 위와 동

객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다.

질문

1장에서 말한 역할(책임?)이 2장에서 말한 행동인가

상태는 프로퍼티인가?

링크: 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다.

식별자는 어떻게 표현되는가.

상태를 먼저 결정할 경우 캡슐화가 저해된다?

kkirico commented 6 months ago

재윤의 정리

객체란 무엇인가

복잡성을 극복하기 위해서 인지하고 구분할 수 있는 독립적인 객체들로 분해한다. -> 이 개념이 모호하기 때문에 객체에 대해 더 자세히 설명한다.

객체는 식별자, 행동, 상태 측면에서 설명할 수 있다.

상태 어떻게 표현하는지? => 프로퍼티. 링크와 속성 어떻게 접근하는지? => 행동 어떻게 수정하는지? => 행동

행동 외부적인 관점 => 협력 내부적인 관점 => 상태 변경 상태 접근, 변경은 행동으로만 접근 가능 => 자율성

식별자 상태는 변경되므로 식별자로 구분한다.

객체를 어떻게 만드는가

행동이 상태를 결정한다.

kkirico commented 6 months ago

1장에서 말한 역할(책임?)이 2장에서 말한 행동인가 -> 책임과 대응된다.

상태는 프로퍼티인가? -> 객체의 상태를 프로퍼티라고 부른다

링크: 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다. -> 참조를 알고있다. 식별자는 어떻게 표현되는가. -> 참조로서 내재된다.

상태를 먼저 결정할 경우 캡슐화가 저해된다? -> 캡슐화란 상태를 행동으로 감추는 것 -> 상태를 먼저 결정하면 협력관계를 생각하는 과정에서 상태를 기반으로 생각하게 되고 -> 그렇게 되면 서로의 상태를 알 필요가 생긴다 -> 캡슐화가 저해된다.

kkirico commented 6 months ago

사람은 본능적인 인지 능력으로 객체를 구분한다. 이를 자세히 설명하기 위해

객체를 설계 할 때 행동을 기반으로 해야한다.

그렇지 않으면