[OOP : 객체지향의 사실과 오해] 2. 이상한 나라의 객체

KIM KYUBIN·2022년 6월 5일
0

OOP

목록 보기
2/7

객체지향의 사실과 오해 - 조영호 저

객체지향과 인지 능력

🔵 많은 사람들이 객체지향을 직관적으로 이해하기 쉬운 패러다임이라고 말하는 이유는 객체지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 기본적인 인지 능력에 기반을 두고 있기 때문이다.

🔵 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다.

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

🔵 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다.

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

🔵 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.

🔵 소프트웨어 안에서 객체는 저장된 상태실행 가능한 코드를 통해 구현된다.

상태

왜 상태가 필요한가

🔵 객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다.

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

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

🔵 상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념이다.

상태와 프로퍼티

🔵 숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓과 같은 단순한 값들은 객체가 아니다.
➡️ 다른 객체의 상태를 표현하기 위해 사용된다.

🔵 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
➡️ 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다.

🔵 프로퍼티는 변경되지 않고 고정되기 때문에 '정적'이다.
➡️ 프로퍼티 값(property value)은 시간이 흐름에 따라 변경되기 때문에 '동적'이다.

🔵 객체와 객체 사이의 의미 있는 연결을 링크(link)라고 한다.
➡️ 객체의 링크를 통해서만 메시지를 주고받을 수 있다.

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

🔵 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.

🔵 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다.

🔵 객체의 프로퍼티단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.

행동

상태와 행동

🔵 객체의 행동상태에 영향을 받는다.

🔵 객체의 행동상태를 변경시킨다.

🔵 상호작용이 현재의 상태에 어떤 방식으로 의존하는가

🔵 상호작용이 어떻게 현재의 상태를 변경시키는가

협력과 행동

🔵 객체가 다른 객체와 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것이다.
➡️ 객체의 행동은 객체가 협력할 수 있는 유일한 방법이다.

🔵 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.

🔵 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다.

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

상태 캡슐화

🔵 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. ➡️ 캡슐화

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

🔵 상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.

식별자

🔵 객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미한다.
➡️ 이 프로퍼티를 식별자라고 한다.
➡️ 모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.

🔵 값과 객체의 가장 큰 차이점은 식별자를 가지지 않지만 객체식별자를 가진다는 점이다.

🔵 시스템을 설계할 때는 이런 단순한 객체의 차이점을 명확하게 구분하고 명시적으로 표현하는 것이 매우 중요하다.

🔵 값(value)은 숫자, 문자열, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 모델링한다.
➡️ 값의 경우 두 인스턴스의 상태가 같다면 두 인스턴스를 같은 것으로 판단한다.

🔵 값이 같은지 여부는 상태가 같은지를 이용해 판단한다.
➡️ 상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)이라고 한다.

🔵 은 오직 상태만을 이용해 동등성을 판단하기 때문에 인스턴스를 구별하기 위한 별도의 식별자를 필요로 하지 않는다.

🔵 객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다.
➡️ 타입이 같은 두 객체의 상태가 완전히 똑같더라도 두 객체는 독립적인 별개의 객체로 다뤄야 한다.

🔵 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라고 한다.

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

🔵 참조 객체(reference object), 또는 엔티티(entity)식별자를 지닌 전통적인 의미의 객체를 가리키는 용어다.

🔵 값 객체(value object)는 식별자를 가지지 않는 값을 가리키는 용어다.

기계로서의 객체

🔵 일반적으로 객체의 상태를 조회하는 작업을 쿼리(query)라고 하고 객체의 상태를 변경하는 작업을 명령(command)이라고 한다.

🔵 사용자는 객체가 제공하는 명령 버튼과 쿼리 버튼으로 구성된 인터페이스를 통해서만 객체에 접근할 수 있다.

🔵 객체 기계가 제공하는 버튼을 통해서만 상태에 접근할 수 있다는 점은 객체의 캡슐화를 강조한다.

행동이 상태를 결정한다

🔵 상태를 먼저 결정할 경우 캡슐화가 저해된다.
➡️ 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되버릴 확률이 높아진다.

🔵 객체를 협력자가 아닌 고립된 섬으로 만든다.
➡️ 상태를 먼저 고려하는 방식은 협력이라는 문맥에서 멀리 벗어난 채 객체를 설계하게 함으로써 자연스럽게 협력에 적합하지 못한 객체를 창조하게 된다.

🔵 객체의 재사용성이 저하된다.
➡️ 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵기 때문에 재사용성이 저하될 수밖에 없다.

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

🔵 책임 주도 설계(Responsibility-Driven Design, RDD)협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.

은유와 객체

의인화

🔵 현실 속의 객체와 소프트웨어 객체 사이의 가장 큰 차이점은 무엇일까?
➡️ 현실 속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다는 것이다.

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

은유

🔵 은유란 실제로는 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 한 형태다.

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

🔵 은유 관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.

profile
상상을 현실로 만들기 위해 노력하는 개발자

0개의 댓글