일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 쿼리 최적화
- 도메인 모델
- 캡슐화
- 캐싱
- 스프링
- Lombok
- REST API
- 클린 코드
- 인터프리터
- 추상화
- cache
- JIT
- 스프링부트
- Refactor
- 협력
- 자바
- 객체
- clean code
- JPA
- 리팩토링
- SRP
- 재사용성
- 객체지향의 사실과 오해
- 객체지향
- Java
- spring boot
- string
- 클린코드
- 캐시
- 책임
- Today
- Total
GO SIWOO!
[객체지향의 사실과 오해] 2장 - 이상한 나라의 객체 본문
#0. 객체지향이란 현실 세계의 모방?
이 장에서는 '이상한 나라의 앨리스' 이야기를 통해 '객체지향이란 현실 세계의 모방'이라는 객체지향의 기본 개념의 오해에 대해서 설명한다.
객체는 현실세계의 모방이라고 배웠다. 그래서 우리는 사람과 휴대전화라는 객체가 있을 때 우리는 Person과 Cellphone이라는 이름의 객체의 설계도인 클래스를 만들 수 있다.
하지만 앞서 1장에서 한 말이 있다. 객체는 행동 통해 상태를 바꾸며 상태는 감추어진다. 객체는 메시지를 통해 협력을 하며 메시지에 대한 행동을 객체 스스로 선택할 수 있다고 했다.
위에서 만든 Person과 Cellphone 클래스로 만들어진 객체가 있을 때 Person 객체는 전화를 건다("010-1234-1234") 라는 메시지를 Cellphone 객체에게 보냈을 때 Cellphone이 스스로 행동을 선택할 수 있다는 것이 1장의 큰 주제였다.
하지만 생각을 해보면 현실세계의 모방을 통해 추출한 객체인 Cellphone이 현실세계에서 전화를 건다("010-1234-1234")라는
이에 대한 오해를 푸는 것이 2장, 이상한 나라의 객체의 큰 주제이다.
#1. 객체지향과 인지 능력
객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다.
위에서 설명한 바와 같이 Cellphone은 스스로 전화를 걸 수 없지만 객체지향의 세계에서는 가능하다. 이는 객체지향 패러다임은 현실 세계를 모방한 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조함에 있어 가능한 것이다.
#2. 객체
앨리스는 객체이다. 앨리스는 자신의 행동을 통해 상태를 변경할 수 있다. 부채를 부치거나 물을 마시는 행동을 통해 몸의 크기라는 상태를 조절할 수 있고 문을 통과하는 행동을 통해 자신의 위치인 상태를 변경할 수 있다.
행동의 결과는 상태를 통해 설명할 수 있다.
하지만 문을 통과하는 행동 성공 여부는 이전에 어떤 행동이 발생했는지에 따라서 바뀐다. 물을 얼마나 마셨는지, 부채질을 얼마나 했는지에 따라 성공 여부가 바뀐다.
행동의 순서 또한 중요해진다. 물을 마시거나 부채질을 먼저 하지 않고 문을 통과하고자 하면 실패한다. 이전의 행동들이 행동의 성공 여부를 결정한다는 말이 이해가 될 것이다.
추가로 앨리스는 키가 줄어도 위치가 변해도 여전히 앨리스이다. 앨리스라는 식별자를 지니는 한 앨리스는 앨리스다.
앨리스(객체)의 특징은 다음과 같이 요약할 수 있다.
- 객체(앨리스)는 상태를 가지며 상태(키, 위치)는 변경 가능하다.
- 객체의 상태를 변경하는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
- 객체는 어떤 상태에 있더라도 유일하게 식별이 가능하다.
#3. 상태
앨리스가 문을 통과하는 행동의 성공 여부는 이전의 행동에 기반한다고 했다. 이전의 행동 이력을 계속해서 기억하고 있는 것은 행동의 결과를 설명하는 것을 어렵게 한다.
이것을 해결하기 위해 상태라는 개념이 생겼다. 키 100cm 이하라는 상태가 되어야 앨리스의 문을 통과하는 행동의 성공할 수 있다고 하면 매우 편하다.
상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.
앨리스의 키, 위치는 단순한 값으로 그 자체로 객체가 되지 못하고 다른 객체의 상태를 표현하기 위해 사용된다. 이러한 단순한 값은 객체의 상태를 표현하기 위한 중요한 수단이다.
- 프로퍼티(property) : 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있는데 이때 객체의 상태를 구성하는 모든 특징을 통틀어 프로퍼티라고 한다.(정적이다)
- 프로퍼티 값(property value) : 시간이 흐름에 따라 변경되는 것으로 특징의 값.(동적이다)
- 속성(attrubute) : 객체의 프로퍼티 중 단순한 값.
- 링크(link) : 객체의 프로퍼티 중 다른 객체를 참조하는 값, 객체 사이의 의미 있는 연결
위의 그림에서 프로퍼티, 객체, 속성, 링크 등의 요소로 나누면 다음과 같다.
- 객체 : 앨리스, 음료
- 앨리스의 프로퍼티 : 키(값), 위치(값), 음료(객체)
- 키의 프로퍼티 값 : 130cm
- 앨리스의 속성 : 키, 위치
- 링크 : 앨리스 객체와 음료 객체의 연결
#4. 행동
객체의 상태 변경은 행동으로부터 발생한다. 이를 행동이 부수 효과(side effect)를 초래한다는 것을 의미한다.
앨리스(객체)의 부채질(행동)을 통해 키(상태)가 변경되지만 행동의 결과는 객체의 상태에 의존적이다.
예로 앞서 설명했던 것처럼 문을 통과(행동)의 성공 여부는 앨리스(객체)의 키(상태)에 전적으로 의존적이다.
1. 상태와 행동 사이의 관계
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
2. 협력과 행동
객체는 행동을 통해 자신의 상태를 변경한다고 했다. 추가로 행동을 통해서 요청 메시지를 보내 다른 객체에게 협력을 요청할 수 있다. (1장에서 혼자서 모든 걸 처리할 수 있는 전지전능한 객체는 복잡성 때문에 자멸한다고 했다.)
결국 객체의 행동을 통해 다음과 같은 2가지 부수 효과를 가진다.
- 객체 자신의 상태를 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
3. 상태 캡슐화
객체지향 세계에서 모든 객체는 자신의 상태를 스스로 관리한다.(ex, Person, Cellphone, 앨리스, 음료)
drinkBeverage(), drunk(quantity) 메시지가 앨리스, 음료 객체에게 전달된다. 메시지를 통해 객체의 협력을 요청할 수 있다. 하지만 메시지를 받은 객체 말고는 상태가 어떻게 바뀌는지 알 수 없다. 상태를 캡슐화를 통해 감춰두었기 때문이다.
캡슐화를 통해 스스로 자신의 상태를 관리하고 행동을 관리하는 객체는 자율성을 확보할 수 있고 자율성이 늘어날수록 협력은 유연하고 간결해진다.
#5. 식별자
모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.
값(value)은 숫자, 문자열, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 모델링한다.
값 상태를 비교하는 성질은 동등성(equality)이라고 한다. 값의 상태는 변하지 않으므로 값의 상태를 통해 비교를 할 수 있다.
객체는 시간에 따라 변경되는 상태를 포함하므로 동등성을 바탕으로 비교가 불가하다. 그러므로 같은 상태를 갖고 있는 객체더라도 별개의 객체이다. 객체의 비교는 식별자 기반으로 이루어지며 식별자를 통해 같은지 판단하는 것을 동일성(identical)이라고 한다.
#6. 행동이 상태를 결정한다
객체지향 설계를 하는데 사람들이 가장 많이 빠지는 함정은 상태를 중심으로 설계를 한다는 점이다. 우선 객체에 필요한 상태를 우선 정해두고 그 상태에 필요한 행동을 결정한다. 하지만 이는 설계에 나쁜 영향을 끼친다.
- 첫 번째, 캡슐화가 저해된다
상태에 초점을 맞출 경우 상태 캡슐화가 저해될 가능성이 높아진다.
- 두 번째, 객체를 협력자가 아닌 고립된 섬으로 만든다
전지전능한 객체는 없다고 했다. 전지전능할수록 복잡성으로 자멸할 가능성이 높다고 했다. 상태를 먼저 고려하면 행동에서 이루어지는 협력을 등한시할 수 있으며 자연스럽게 객체를 고립된 섬으로 만들 가능성이 높아진다.
- 세 번째, 객체의 재사용성이 저하된다
객체의 재사용성이 캡슐화를 통해 자율성을 확보함에 따라 따라올 수 있다고 했다. 하지만 상태에 초점을 맞춘 객체는 앞서 설명했듯이 행동에서 이루어지는 협력을 등한시할 수 있기에 재사용성이 저하될 가능성이 높아진다.
올바른 객체지향 설계는 다음과 같은 순서를 추천한다.
첫 번째, 협력에 필요한 행동을 선택한다.
두 번째, 행동을 수행할 객체를 선택한다.
협력 -> 행동 -> 객체 순으로 고려를 하는 걸 추천한다.
#7. 은유와 객체 그리고 의인화
객체의 의인화
해당 포스팅의 처음 Person과 Cellphone을 기억하는지 모르겠다.
'객체는 현실세계의 모방'이라는 관점에 따라 현실 객체에서 추출한 소프트웨어 객체 Person과 Cellphone를 우리는 어떻게 바라보아야 할까?
의인화의 관점에서 소프트웨어를 생물로 생각하자.
모든 생물처럼 소프트웨어는 태어나고, 삶을 영위하고, 그리고 죽는다.
by. 레베카 워프스브록
전화를 걸 수 없는 휴대전화(현실 객체)와 스스로 전화를 걸 수 있는 Cellphone(소프트웨어 객체)의 괴리감을 의인화를 통해 해결하고자 한다. 소프트웨어 안의 객체지향 세계는 현실을 모방한 것이 아니라 현실의 모습을 조금 참고할 뿐 새로운 세계를 창조하는 것이다. 객체지향 세계 안에서 모든 객체는 스스로 행동을 결정할 수 있는 자율성을 지닌 채로 새로 태어난다.
은유
'객체는 현실세계의 모방'이라는 얘기는 그렇다면 완전히 틀린 것인가?
꼭 그렇지만은 않다. 단지 모방이라는 말보다 은유라는 말이 더욱 현실 세계와 객체지향 세계 사이를 더욱 잘 표현할 수 있는 말이다.
은유를 통해 소프트웨어에 대해 사람들이 생각하는 것과 실제 소프트웨어 표현의 차이를 줄일 수 있으며 표현적 차이(representational gap) 또는 의미적 차이(semantic gap)를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있게 한다.
은유를 통해 효과적으로 표현적 차이를 줄여 유지보수가 용이한 소프트웨어를 만들 수 있게 되는 것이다.
'Develop > 객체지향의 사실과 오해' 카테고리의 다른 글
[객체지향의 사실과 오해] 6장 - 객체 지도 (1) | 2023.08.11 |
---|---|
[객체지향의 사실과 오해] 5장 - 책임과 메시지 (0) | 2023.08.09 |
[객체지향의 사실과 오해] 4장 - 역할, 책임, 협력 (0) | 2023.08.08 |
[객체지향의 사실과 오해] 3장 - 타입과 추상화 (1) | 2023.08.02 |
[객체지향의 사실과 오해] 1장 - 협력하는 객체들의 공동체 (0) | 2023.07.24 |