Categories
Algorithm🧩
백준 📝
BookReview📕
CleanCode✨
Network 📨
Database 🗄
DevOps☁️
에러 일기📕
Etc💬
Fishy Fish 🎣
Spring🌱
[객사오] Chapter 2
앨리스 객체
- 문을 통과하기에 적당한 상태로 키(
상태)를 변화시킴 - 앨리스의
행동에 따라 앨리스의 상태가 변화- 행동의 결과를 결정하는 것이 상태
- 행동의 결과는 상태에 의존적
- 어떤 행동의 성공 여부는
이전에 어떤 행동들이 발생했는지에 영향을 받는다. - 앨리스의 상태가 어떻든 앨리스는 유일한 존재로 식별 가능
객체, 그리고 소프트웨어 나라
- 하나의 개별적인 실체로 식별 가능한 사물은 모두 객체가 될 수 있다.
- 객체는 상태, 행동, 식별자를 지닌 실체
상태와 프로퍼티
- 상태: 과거의 이력 없이 행동의 결과를 쉽게 예측할 수 있게 한다.
- 프로퍼티: 객체의 상태를 구성하는 모든 특징
- 프로퍼티는 변경되지 않고 고정 → 정적
- 프로퍼티 값은 변경될 수 있는 것 → 동적
- 프로퍼티의 종류
- 링크: 객체와 객체 사이 의미있는 연결
- 객체간 요청은 링크를 통해서만 가능하다.
- 객체가 다른 객체를 참조할 수 있음을 의미 = 다른 객체의 식별자를 알고 있음
- 속성: 객체를 구성하는 단순한 값
- 링크: 객체와 객체 사이 의미있는 연결
상태와 행동
- 부수 효과: 객체의 행동에 의해 객체의 상태가 변경되는 것
- 행동은 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이다.
- 상태와 행동의 관계
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
- 상태의 개념으로 서술한 행동
- 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
- 상호작용이 어떻게 현재의 상태를 변경시키는가
협력과 행동
- 객체는 다른 객체와
메시지를 통해서만 의사소통할 수 있다. - 객체는 수신된 메시지에 따라 적절히 행동하며 협력에 참여 → 결과로 상태 변경
- 객체의 행동으로 발생하는 결과
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
상태 캡슐화
- 앨리스의 키(상태)를 변화시키는 것은 앨리스 자신
- 그렇다면 음료의 양(상태)를 변화시키는 것도 음료 자신이어야 한다!
- 앨리스의 키를 줄이려 음료를 마시는 상황 → 앨리스 객체에서 음료 객체에 메시지 전송 필요
- 메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 알지 못한다. →
캡슐화
캡슐화
- 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
- 객체가 외부에 노출하는 것은 행동 뿐
- 객체의 상태를 변경할지 여부는 객체 스스로 결정 → 외부의 메시지는 행동을 유발할 뿐..
- 수신자가 자신의 상태를 변경하지 않아도 송신자가 간섭할 수 없다.
식별자
- 객체를 서로 구별할 수 있는 특정 프로퍼티가 객체 안에 존재하는 것
- 모든 객체는 식별자를 가진다.
- 값과 객체의 가장 큰 차이점
- 값: 숫자, 문자열, 날짜, 금액 등 변하지 않는 양을 모델링
- 불변 상태를 가진다.
- 값은 두 인스턴스의 상태가 같다면 두 인스턴스를 같은 것으로 판단
- 상태를 이용해 같은지 판단한다. →
동등성판단 - 구별하기 위한 별도의 식별자가 필요 없다.
- 상태를 이용해 같은지 판단한다. →
- 객체
- 가변 상태 - 행동에 따라 상태가 변한다.
- 타입이 같은 두 객체의 상태가 똑같아도 별개로 다루어야 함
- 식별자를 기반으로 객체가 같은지 판단해야 한다. →
동일성 - 객체의 상태는 변하는 값이므로 도 객체의 동일성을 판단하기 위해서는 식별자가 필요하다.
행동이 상태를 결정한다
- 상태를 중심으로 객체를 바라보는 것은 설계에 나쁜 영향을 끼친다.
- 캡슐화 저해
- 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되어버릴 확률이 높아진다.
- 객체를 협력자가 아닌 고립된 섬으로 만든다.
- 문맥에서 벗어난 채 객체를 설계하도록해 협력에 적합하지 못한 객체를 창조하게 된다.
- 객체의 재사용성이 저하된다.
- 객체의 재사용성은 다양한 협력에 참여할 수 있는 능력
- 상태에 초점을 맞춤 객체는 다양한 협력에 참여하기 어렵기 때문에 재사용성이 저하된다.
- 캡슐화 저해
- 상태가 아닌 행동에 초점을 맞추어야 한다.
- 우리가 애플리케이션 안에서 어떤 행동을 원하느냐가 어떤 객체가 적합한지 결정
- 객체의 적합성을 결정하는 것은 상태가 아닌 객체의 행동
- 행동을 결정한 후 행동에 필요한 정보와 필요한 상태를 결정
책임 주도 설계: 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도하는 것- 협력이라는 문맥 안에서 객체의 행동을 생각하도록 돕는다.
은유와 객체
- 객체지향이란 현실 세계의 모방
- 실제 세계와 소프트웨어에 구현된 객체는 전혀 다름
- 모방과 추상화라는 개념만으로는 현실 객체와 소프트웨어 객체의 관계를 설명하지 못한다.
의인화
- 현실 속에서의 수동적인 존재들이 소프트웨어 객체로 구현될 경우 능동적으로 변함
- 현실 객체가 가지지 못한 추가적인 능력을 보유하게 한다.
-
소프트웨어의 객체는 현실의 객체보다 더 많은 일을 할 수 있다는 특징
→
의인화
은유
- 현실 세계와 객체지향 세계 사이의 관계를 좀 더 정확하게 설명할 수 있는 단어
- 실제로는 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 한 형태
-
예를 들어 전화기 객체를 만든다?
→ 객체가 전화를 걸 수 있다는 사실을 쉽게 이해할 수 있음
- 은유 관계에 있는 실제 객체 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.