객체지향에 대해서 대부분의 사람들은 이와 같이 생각한다.
"객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임"
과연 정말 실세계를 반영한 것일까?
예를 들자면 커피를 마시는 행위를 예로 들자
현실세계에서는 커피를 마셔 커피의 양을 줄여주는 주체는 마시는 사람이다.
객체지향의 세계에서는 커피 자체가 자신의 양을 조절한다.
단순하게 말하자면 현실세계에서는 주체적으로 행동할 수 없었던 사물이 객체지향의 세계에서는 마치 사람인 것처럼 행동하는 것이다.
나는 이를 의인화라고 말하고 싶다.
"어떤 객체도 섬이 아니다"라는 워드 커닝 헴과 켄트 벡
이렇게 의인화된 객체들은 서로 분리되어 행동하지 않고 서로서로 도움을 요청하면서 행동을 한다.
이를 협력이라고 부르며 도움을 요청하는 행위를 메시지를 주고받는 것을 의미한다.
그렇다면 각각의 객체는 어떠한 구성요소를 이루는가?
객체는 상태와 행동으로 구성되어있다.
행동
행동이란 무엇일까?
행동이란 다른 객체로부터 요청이 왔을 때 (메시지를 수신하였을 때) 처리할 수 있는 방법이다.
커피를 주문하고 손님과 바리스타를 예로 들자면 만약 손님이 아메리카노를 주문하였다면 바리스타는 해당 주문을 받아 커피를 만드는 방법이 행동에 해당한다.
이때 손님은 자신이 주문한 커피를 받기만 하면 되는 것이고 바리스타가 어떠한 방식으로 커피를 만들지에 대해서는 관여하지 않는다.
(무엇을 수행하는지는 알 수 있지만 어떻게 수행하는지는 알 수 없다.)
상태
그렇다면 상태란 무엇일까?
말 그래로 현재의 상태를 의미한다.
그렇다면 객체는 왜 상태가 필요한 것일까?
객체가 상태가 필요한 이유는 행동의 결과를 판단하는 방법이 상태가 없이는 무척 번거로운 작업이기 때문이다.
행동의 결과는 과거의 일어났던 행동들을 기준으로 판단하는데 행동의 결과를 판단할 때마다 과거의 행동을 되돌아보는 것이 무척 번거롭다는 말이다.
이때 상태가 있다면 굳이 과거의 행동들을 보지 않고 현재 나타나는 상태를 보면 행동의 결과를 바로 판단할 수 있다.
예를 들자면 비행기 탑승 가능 여부를 판단할 때 현재의 발권 상태를 확인한다면 탑승 여부를 바로 확인할 수 있는 점이 이와 같다.
그렇다면 상태와 행동은 긴밀한 관계를 유지하고 있다는 점을 알 수 있다.
따라서 정리하자면 아래와 같이 네 가지 방식으로 정리할 수 있다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
- 협력이 현재의 상태에 어떤 방식으로 의존하는가
- 협력이 어떻게 현재의 상태를 바꾸는가
행동은 메세지를 받기 위해서 외부에 노출된다.
상태는 해당 객체만이 상태를 변경시킬 수 있다.
위와 같은 원칙을 지켜야 하는 이유는 객체 자체에 자율성을 부여하기 위해서이다. 객체 자신이 스스로 판단하고 결정하기 때문에 자율성이 높아질수록 협력은 유연해지고 간결해진다.
그렇다면 각각의 객체는 어떻게 구별하는가?
객체를 구별하기 위해선 객체마다 고유의 값이 존재하여 구별가능하여야 한다.
구별 가능한 값을 식별자라고 한다.
값과 객체의 차이는 무엇일까?
값은 구별할 수 있는 식별자가 없다.
객체는 구별할 수 있는 식별자가 있다.
그러므로 값은 불변이며 객체는 가변이다.
예를들어서 단순하게 사람을 예로 들자면
나는 나다 최준우라는 사람이고 고유한 인간이다.
20살의 나와 30살 나는 시간이 흘러 나의 상태가 바뀌었을 뿐이지 최준우라는 사람은 변하지 않았다.
값은 문자, 날짜, 숫자 등 변하지 않는 것이다.
2020년 2월 20일이라는 날짜는 누가 보든간에 같은 값을 가진다.
'Java > 객체지향' 카테고리의 다른 글
(OOP) 리스코프 치환 원칙 (0) | 2020.02.20 |
---|---|
(OOP) 객체지향에 대해서(2) - 은유 (0) | 2020.02.20 |
(OOP) 역할, 책임, 협력 (0) | 2019.12.30 |
(OOP) 객체지향 프로그래밍 (0) | 2019.12.30 |
(OOP) 객체, 설계 (0) | 2019.12.29 |