[객사오] 2. 이상한 나라의 객체
2023. 7. 25. 21:40ㆍComputer Sciences/OOP
객체, 그리고 소프트웨어 나라
상태
- 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
- 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로로퍼티 값으로 구성된다.
- 객체의 프로퍼티는 속성과 다른 객체를 참조하는 링크로 구분할 수 있다.
프로퍼티 (property)
- 객체의 상태를 구성하는 모든 특징을 의미한다.
- 앨리스의 경우 키, 위치, 음료가 해당된다.
프로퍼티 값 (property value)
- 객체의 상태를 구성하는 특징 중 특정한 값을 의미한다.
- 앨리스의 경우 키는 음료를 마시면 줄어들고, 문을 통과하면 위치가 변경되며, 음료를 다 마시면 음료를 버린다.
링크 (link)
- 객체와 객체 사이의 의미 있는 연결을 의미한다.
- 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현한다.
속성 (attribute)
- 객체를 구성하는 단순한 값을 의미한다.
- 앨리스의 키, 위치
행동
- 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.
- 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다.
- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.
상태와 행동 사이 관계
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
상태 캡슐화
- 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
- 외부로 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
- 상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.
식별자
- 객체가 서로를 구별할 수 있는 특정한 프로퍼티를 의미한다.
- 모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.
값
- 숫자, 문자열, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 의미한다.
- 흔히 값의 상태는 변하지 않기 때문에 불변 상태를 가진다고 말한다.
- 두 인스턴스의 상태가 같다면 두 인스턴스를 같은 것으로 판단한다.
- 상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)라고 말한다.
- 값의 상태는 변하지 않기 때문에 특정 시점에 동일한 타입의 두 값이 같다면 두 값은 언제까지라도 동등한 상태를 유지할 것이다.
- 값은 오직 상태만을 이용해 동등성을 판단하기 때문에 인스턴스를 구별하기 위한 별도의 식별자를 필요로 하지 않는다.
- Integer, Long 등
객체
- 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다.
- 따라서 객체는 가변 상태를 가진다고 말한다.
- 타입이 같은 두 객체의 상태가 완전히 똑같더라도 두 객체는 독립적인 별개의 객체로 다뤄야 한다.
- 두 객체의 상태가 다르더라도 식별자가 같다면 두 객체를 같은 객체로 판단할 수 있다.
- 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라고 한다.
- Person, User 등
💡 객체의 상태는 시간의 흐름에 따라 변하기 때문에 상태를 기반으로 동일성을 판단할 수 없다.
객체의 특성
- 객체는 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 실행 결과에 영향을 미친다.
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
행동이 상태를 결정한다
상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 준다.
- 캡슐화가 저해된다.
- 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되어버릴 확률이 높아진다.
- 객체를 협력자가 아닌 고립된 섬으로 만든다.
- 객체가 필요한 이유는 애플리케이션의 문맥 내에서 다른 객체와 협력하기 위해서다.
- 불행하게도 상태를 먼저 고려하는 방식은 협력이라는 문맥에서 멀리 벗어난 채 객체를 설계하게 함으로써 자연스럽게 협력에 적합하지 못한 객체를 만들게 된다.
- 객체의 재사용성이 저하된다.
- 객체의 재사용성은 다양한 협력에 참여할 수 있는 능력에서 나온다.
- 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵기 때문에 재사용성이 저하될 수 밖에 없다.
💡 객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는 데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다. 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지를 고려하게 되며 이 과정에서 필요한 상태가 결정된다. 따라서 먼저 객체의 행동을 결정하고 그 후에 행동에 적절한 상태를 선택하게 된다.
은유와 객체
- 객체지향 세계는 현실 세계의 단순한 모방이 아니다.
- 현실 속의 수동적인 존재는 소프트웨어 객체로 구현될 때 능동적으로 변한다.
- 은유를 활용해 현실 객체의 이름을 소프트웨어 객체의 이름으로 부여하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.
- 또한 은유를 효과적으로 사용할 경우 표현적 차이를 줄일 수 있으며, 이해하기 쉽고 유지보수가 용이한 소프트웨어를 만들 수 있다.
'Computer Sciences > OOP' 카테고리의 다른 글
[객사오] 4. 역할, 책임, 협력 (0) | 2023.07.26 |
---|---|
[객사오] 3. 타입과 추상화 (0) | 2023.07.26 |
[객사오] 1. 협력하는 객체들의 공동체 (0) | 2023.07.25 |
[OOP] 헥사고날 아키텍처 맛보기 (0) | 2023.07.24 |