출처 : 객체지향의 사실과 오해 조영호 저 | 위키북스
객체 지향과 인지 능력
객체 지향을 직관적이고 이해하기 쉬운 패러다임이라고 말하는 이유는 객체 지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 기본적인 인지 능력에 기반을 두고 있기 때문이다.
인간이 인지할 수 있는 다양한 객체들이 모여 현실 세계를 이루는 것처럼 소프트웨어의 세계 역시 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다.
but, 객체 지향 패러다임의 목적은 현실 세계를 모방하는 것이 아닌 현실 세계를 기반으로 새로운 세계를 창조하는 것
객체, 이상한 나라
- 이상한 나라의 앨리스는 문을 통과하기에 적당한 상태로 자신의 키를 조절 -> 상태를 가지며 상태는 변경 가능
- 특정 시점의 앨리스의 상태 = 특정 시점에서의 앨리스의 키
- 음료를 마시면 키가 변화 -> 앨리스가 하는 행동에 따라 앨리스의 상태가 변하게 된다.
- 앨리스의 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태 -> 행동의 결과는 상태에 의존적
- 문을 통과하려면 적당한 상태의 크기가 되기 위해 음료 등을 먹는 행동이 선행 필수 -> 행동의 순서가 결과에 영향
- 앨리스의 상태가 변하더라도 앨리스는 앨리스 -> 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능
객체, 소프트웨어 나라
- 객체는 상태, 행동, 식별자를 지닌 실체이다.
- 객체는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수 있다.
상태
- 앨리스의 키를 알면 문을 통과할 수 있는 지 판단 가능 -> 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 이해할 수 있다.
- 앨리스의 키는 객체가 아니다 -> 단순한 값들은 그 자체로 독립적인 의미를 가지기 보다는 다른 객체의 특성을 표현하는 데 사용
프로퍼티 (property)
- 앨리스가 음료를 들고 있는 상태인지 여부 -> 앨리스라는 객체와 음료라는 객체가 연결되어 있는지 여부
- 앨리스가 음료를 들고 있다 -> 앨리스는 음료에 관해 알고 있는 상태 + 앨리스 객체와 음료 객체는 연결
- 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 이 때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다.
- 앨리스가 음료를 마시고 난 뒤 버림 -> 앨리스는 음료에 관해 알지 못하는 상태가 됨 + 음료와 협력 불가능
- 키 = 정적 프로퍼티, 음료 = 동적 프로퍼티
- 객체의 상태는 특정 시점에 객체가 가지고 있는 정보의 집합(속성(=정적 프로퍼티) + 동적 프로퍼티)
행동
- 앨리스가 음료를 마시면 키 감소 -> 객체의 상태를 변경하는 것은 객체의 자발적인 행동
- 객체의 행동은 객체의 상태를 변경, 그러나 행동의 결과는 객체의 상태에 의존적
협력과 행동
- 객체는 주어진 책임을 완수하기 위해 다른 객체와 적극적으로 상호작용하며 협력하는 객체들의 공동체를 만들기 위해 노력
- 객체가 다른 객체와 협력하는 유일한 방법 = 요청 (메시지)
- 앨리스가 음료를 마시면 키가 작아지는 동시에 음료의 양이 줄어듬 -> 객체는 협력에 참여하는 과정에서 자기 자신의 상태 뿐만 아니라 다른 객체의 상태 변경 유발 가능
상태 캡슐화
- 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재
- 앨리스의 키를 줄이는 것은 앨리스 객체의 몫, 음료의 양이 줄어드는 것은 음료 객체의 몫
- 메시지 송신자는 메시지 수신자의 상태 변경에 대해서 전혀 알 수 없다 -> 캡슐화
- 객체는 상태를 캡슐 안에 숨기고 외부로 노출 X
- 객체가 외부에 노출하는 것은 행동 뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동
- 메시지를 해석하고 그에 따른 반응은 수신자의 자율적인 판단
- 상태를 행동 뒤로 캡슐화하는 것은 객체의 자율성을 높이고, 스스로 판단하고 결정하게 만들기 때문에 객체의 지능을 높임 -> 협력이 유연하고 간결해짐
식별자
- 값과 객체의 차이는 식별자의 유무
- 값이 같은지 여부 = 상태가 같은가? (동등성 판단) -> 숫자 1과 1은 같은 값
- 객체가 같은지 여부 = 식별자가 같은가? (동일성 판단) -> 시간의 흐름에 따라 객체가 변하기 때문에 한 시점에 두 객체의 상태가 동일하더라도 서로 다른 객체
행동이 상태를 결정한다
상태를 먼저 결정할 경우
- 상태가 객체 내부로 캡슐화되지 못하고 공용 인터페이스에 그대로 노출될 가능성이 높아진다.
- 객체의 고립 -> 협력 힘들어짐
- 협력에 참여하기 어렵기 때문에 재사용성 저하
훌륭한 객체지향 설계
- 협력에 참여하는 객체를 만들면 상태가 아닌 행동에 초점 -> 행동이 상태를 결정
- 객체의 행동은 협력에 참여하는 유일한 방법이고 객체는 다른 객체와 협력하기 위해 존재하기 때문이다.
- 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행한다.
- 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도 -> 책임-주도 설계(Responsibility-Driven Design, RDD)
객체의 의인화
- 현실 세계의 음료는 아무것도 못하지만 객체 지향 세계의 카드 객체는 스스로 양을 줄인다. -> 객체의 의인화
'JAVA > 객체지향의 사실과 오해' 카테고리의 다른 글
객체 지향의 사실과 오해 - 책임과 메시지 (0) | 2022.02.24 |
---|---|
객체 지향의 사실과 오해 - 역할, 책임, 협력 (0) | 2022.02.13 |
객체 지향의 사실과 오해 - 타입과 추상화 (0) | 2022.02.11 |
객체 지향의 사실과 오해 - 협력하는 객체들의 공동체 (0) | 2022.02.06 |