02 이상한 나라의 객체
객체지향과 인지 능력
- 인간은 인지 능력을 이용해서 세상에 존재하는 다양한 객체를 식별하고 분류한다.
- 소프트웨어 세계에서도 마찬가지다. 소프트웨어 역시 인간이 쉽게 인지할 수 있도록 다양한 객체들로 이뤄져 있다.
객체, 그리고 이상한 나라
예시) 앨리스가 음료를 마시면 키가 작아지고, 케이크를 먹으면 커진다. 키가 작아지면 아름다운 정원에 갈 수 있는 문을 통과할 수 있다.
객체 : 앨리스, 음료
앨리스 객체의 상태 : 키, 위치
앨리스 객체의 행동 : 음료를 마신다, 케이크를 먹는다
위의 예시를 통해 알 수 있는 것
- 앨리스는 키라는 상태를 가지며, 상태는 변경 가능하다.
- 앨리스의 상태를 변경시키는 것은 음료를 마시는 앨리스의 행동이다.
- 행동의 결과는 상태에 의존적이다.(ex) 음료를 마시면 키가 작아지며, 케이크를 먹으면 키가 커진다.)
- 행동의 순서가 결과에 영향을 미친다.
- 앨리스는 어떤 상태에 있더라도 유일하게 식별할 수 있다.
객체, 그리고 소프트웨어 나라
객체란?
- 식별 가능한 개체 또는 사물이다. 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다.
- 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
- 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
객체의 상태
- 상태가 필요한 이유
- 상태를 이용하면 과거의 행동 이력을 알 필요 없이, 행동의 결과를 쉽게 예측할 수 있다.
- ex) 앨리스의 키만 알면 문을 통과할 수 있는지 여부를 쉽게 판단할 수 있다.
- 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다.
- 프로퍼티?
- 객체의 상태를 구성하는 모든 특징
- 프로퍼티는 정적이지만, 프로퍼티의 값은 동적이다. (ex) 키가 170cm일 때, 키라는 프로퍼티는 변하지 않지만 170cm이라는 값은 변한다.
- 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
- 링크란, 한 객체가 다른 객체의 식별자를 참조하고 있음을 의미한다.
- 프로퍼티?
객체의 행동
행동의 부수 효과(side effect)는 두 가지
- 객체 자신의 상태 변경
- 객체의 상태를 변경하는 건 오로지 객체의 행동뿐이다.
- 즉, 행동의 결과는 상태에 의존적이다.
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
- 객체가 다른 객체와 협력하는 유일한 방법은 다른 객체에게 메시지를 요청 보내는 것이다. 객체는 수신된 메시지에 따라 행동하며 협력하고, 자신의 상태를 변경한다.
- ex) 앨리스 객체가 음료 객체에게 '음료를 마신다'라는 요청을 보내면 음료 객체는 자신의 상태인 '양'을 줄인다.
- 상태 캡슐화
- 모든 객체는 자신의 상태를 스스로 관리하는 자율성을 가지고 있다. 앨리스 객체의 키를 작게 만드는 건 앨리스 자신이며, 음료 객체의 양을 줄이는 것 또한 음료 자신이어야 한다. 앨리스 객체는 단지 음료 객체에게 자신이 음료를 마셨다는 메시지를 전달할 수 있을 뿐이다. 앨리스 객체는 음료 객체의 상태 변경에 대해서는 전혀 알지 못한다. 이것이 캡슐화이다.
- 객체가 외부에 노출하는 것은 행동 뿐이며, 외부에서 객체에 접근할 수 있는 방법도 행동 뿐이다.
- 캡슐화를 통해 객체의 자율성을 높인다. 자율성이 높은 객체들의 협력은 유연하고 단순해진다.
객체의 식별자
- 객체는 다른 객체와 식별할 수 있는 식별자를 가진다.
- 객체의 식별자를 이용해서 동일성(identical) 검사를 통해 객체들을 비교할 수 있다.
- 동일성(identical)? mutable인 객체는 고유의 식별자로 비교할 수 있다.
- 동등성(equality)? immutable인 상태는 값으로 비교할 수 있다.
- (이 개념은 자바같은 객체지향 언어에서도 나오는 데 따로 공부하는 걸 추천)
- 상태는 계속 변하기 때문에 객체를 식별할 수 없다.
행동이 상태를 결정한다
소프트웨어 설계 시 주의할 점
- 객체는 다른 객체와 협력하기 위해 존재한다. 객체의 행동만이 다른 객체와 협력할 수 있는 유일한 방법이다. 따라서 설계할 땐 상태가 아닌 행동에 초점을 맞춰야 한다.
- 객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는 데 필요한 행동을 먼저 생각해야 한다.
- 객체의 행동을 먼저 결정한 다음, 그 행동에 필요한 상태를 선택하는 방식으로 설계한다.
상태를 먼저 결정할 경우
- 캡슐화 저해
- 객체를 고립된 섬으로 만든다.
- 객체의 재사용성 저하
은유와 객체
객체지향 세계는 현실 세계의 모방이 아니다. 하지만 어느정도의 접점은 있다. 두 세계의 객체들의 관계는 다음과 같이 표현할 수 있다.
소프트웨어 객체는 현실 세계 객체를 의인화한다.
- 현실에서 수동적인 객체는 소프트웨어에선 능동적으로 변한다.
- ex) 소프트웨어 객체인 음료는 자신의 양을 줄이는 행동을 할 수 있다.
소프트웨어 객체는 현실 세계 개체를 은유하여 표현한다.
- 소프트웨어의 객체는 현실의 객체에 대한 은유이다.
- ex) 현실의 전화기는 스스로 전화를 걸 수 없지만, 소프트웨어 객체에서 전화기라는 개념을 이용하면 그 객체가 전화를 걸 수 있다는 사실을 쉽게 이해할 수 있다.
마무리
객체는 상태, 행동, 식별자로 구성된다. 객체의 상태는 외부로부터 감춰져야 하며, 행동을 통해 변경될 수 있다. 행동만 외부에 노출시키고, 상태는 내부로 감춤으로써 다른 객체들과의 협력이 유연해진다. 객체지향의 핵심은 협력이다. 협력은 행동으로만 이루어질 수 있으며, 설계 시 행동에 초점을 두고, 행동을 먼저 결정한 후 상태를 결정해야 한다.
그리고 객체는 식별자를 가진다. 나는 코드 상에서 객체의 식별자는 객체의 주소라고 생각했다. 팀원들과 토론을 하다보니 PK 필드 값도 식별자도 될 수 있다는 의견이 나왔다. 책을 읽고 스터디를 하며 평소에 생각해보지 않았던 부분에 대해 이야기를 나눌 수 있어서 좋았다.
'스터디' 카테고리의 다른 글
[모던 자바 인 액션] 3장. 람다, 함수형 인터페이스, 메서드 참조 (0) | 2023.06.28 |
---|---|
[객체지향의 사실과 오해] 4. 역할, 책임, 협력 (0) | 2023.06.24 |
[모던 자바 인 액션] 1,2장. Java 8의 변화, 동작 파라미터화 (0) | 2023.06.23 |
[객체지향의 사실과 오해] 3. 타입과 추상화 (0) | 2023.06.16 |
[ 객체지향의 사실과 오해 ] 1. 객체란 무엇인가 (0) | 2023.06.02 |
댓글