프로그래밍을 하면서 가장 힘든게 객체지향적으로 프로그래밍을 하는 것이다. 메소드를 어디에 위치를 시켜야 맞는 것일까? 객체의 책임은 어디까지 가져가야하는 것일까? 요즘들어 이런 생각들을 자주하게 되면서 코드를 썻다 지웠다하는 것 같다.
혼자 해결이 불가능하여 예전에 읽고 잊어버렸던, 사실은 그 당시에는 잘이해가 안되었던 것 같다. 객체지향의 사실과 오해란 책을 피고 객체에 대해 다시 읽어 보았다. 고민을 하고 읽을 때와 무지성으로 읽었을 때는 확실히 다르더라..
이 곳에 정리되는 내용은 나중에 객체
가 무엇이였지? 라고 생각될 때 기억을 되살리기 위해 작성됬다.
객체
개별적인 실체로 식별 가능한 물리적인 또는 개념적인 사물은 어떤 것이라도 객체가 될 수 있다.
- 개념적인 사물? - 오늘의 주문내역 혹은 어제의 주문 내역 물리적인 실체가 존재하지 않더라도 인간이 쉽게 구분하고 하나의 단위로 인지할 수 있다면 객체화 시킬 수 있다.
객체의 특성을 효과적으로 설명하기 위해서는 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다.
https://studyfied.com/tutorial/java/oop/
상태
왜 상태가 필요할까?
- 객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤일이 발생했느냐에 좌우된다.
- 비행기를 이용하려면 탑승 전에 항공권을 발권해야 한다.
- 자판기에 충분한 금액을 투입하기전에는 원하는 음료를 선택할 수 없다.
- 텔레비전의 전원을 켜지 않는 한 채널을 변경할 수 없다.
모든 일들의 공통점은 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다는 것이다.
그렇다면 어떤 행동의 결과를 판단하기 위해서는 과거에 발생한 행동의 이력을 알아야한다는 것인데 이는 상당히 번거로우며 이해하기 어렵다.
따라서 객체는 상태라는 개념이 추가된다. 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.
- 항공권 발권 여부 → 비행기 탑승 가능
- 텔리비전 전원 on/off → 채널 변경 가능
객체는 자율적인 존재이다. 객체지향의 세계에서 객체는 다른 객체의 상태에 접근할 수도, 변경할 수도 없다. 자율적인 객체는 스스로 자신의 상태를 책임져야 한다.
외부의 객체가 간접적으로 객체의 상태를 변경하거나 조회할 수 있는 방법이 필요한대 이때 필요한 것이 행동(behavior)
이다. (메소드)
객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다.
행동
상태와 행동
객체의 상태는 저절로 변경되지 않는다. 객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이다.
상태와 행동 사이에는 다음과 같은 관계가 있음을 알 수 있다.
- 객체의 행동은 상태에 영향을 받는다. (상태에 따라 메소드 결과값이 달라진다.)
- 객체의 행동은 상태를 변경시킨다.
협력과 행동
객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공한다. (상호작용하며 ‘협력하는 객체들의 공동체’에 참여하려 노력한다.)
객체가 다른 객체와 협력하는 유일한 방법은 다른 객체에게 요청
을 보내는 것이다. 요청을 수신한 객체는 요청을 처리하기 위해 적절한 방법에 따라 행동
한다.
행동이란?
행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.
상태 캡슐화
현실 세계의 객체 vs 객체지향 세계의 객체
사람이라는 객체가 음료라는 객체를 마신다고 해보자. → 음료의 양이 줄어든다.
- 현실세계
사람
은 스스로 음료를 마시는 능동적인 존재,음료
는 스스로 아무것도 할 수 없는 수동적인 존재- 음료의 양을 줄여 상태를 변경시키는 주체는 음료를 목 안으로 밀어 넣는
사람
이 된다.
- 객체지향 세계
- 객체는 자신의 상태를 스스로 관리하는 자율적인 존재임을 다시 한번 되새기면서…
음료
의 양을 줄이는 것은 음료 자신이어야 한다. 따라서사람
은 직접적으로 음료의 상태를 변경할 수 없다. 단지 음료에게 음료를 마셨다는메시지
를 전달할 수 있을 뿐이다. 적절한 정도로 음료의 양을 줄이는 것은 메시지를 전달받은 음료 스스로의 몫이다.
아래는 메시지를 통한 사람과 음료의 협력 관계이다.
Main -drinkBeverage()→ 사람 →drunken(quantity) → 음료
사람이라는 객체는 음료수를 마시면 포만감이라는 상태가 올라간다고 하자. (drinkBeverage 라는 메시지를 전달받았을 때 사람이 하는 행위라고 생각하자.)
위의 메시지만 보고 사람의 포만감이 올라간다거나, 음료의 양이 줄어든다는 상태 변경을 예상할 수 있는가? 메시지를 사람에게 전송하는 객체건 음료에게 메세지를 전송하는 사람이건 메시지 송신자는 메시지 수신자의 상태에 대해서 전혀 알지 못한다.
이것이 캡슐화가 의미하는 것이다.
객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
식별자
객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미한다. 이 프로퍼티를 식별자라 한다.
- 동등성(equality)
- 값의 상태가 같으면 두 인스턴스는 동일한 것으로 판단하고 상태가 다르면 두 인스턴스는 다른 것으로 판단한다.
- 사람이라는 객체의 상태가 키/몸무게가 있고, 두 사람 객체의 키/몸무게가 동일하다면 두 인스턴스는 동일한(equality) 것으로 판단한다.
- 동일성(identical)
- 두 사람 객체의 상태가 똑같더라도 두 객체는 독립적인 별개의 객체로 다뤄야 한다. 비록 키/몸무게가 동일하더라도 두 사람은 별개의 인격체이기 때문이다.
- 어린 시절 나를 생각해보자. 어린 나는 현재의 나보다 키도 작고 몸무게도 적게 나가지만 두 사람은 동일한 사람이다. 따라서 나란 객체는 상태와 무관하게 동일한 사람으로 판단될 수 있는 일종의 식별자를 가지고 있는 객체라고 할 수 있다.
- 두 객체의 상태가 다르더라도 식별자가 같다면 두 객체를 같은 객체로 판단할 수 있다. 이처럼 식별자를 기반으로 판단할 수 있는 성질을 동일성(identical)이라고 한다.
상태를 기반으로 객체의 동일성을 판단할 수 없는 이유는 시간이 흐름에 따라 객체의 상태가 변하기 때문이다.
식별자란?
식별자란 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다. 값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다. 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.
참고) 객체지향의 사실과 오해
'프로그래밍 노트 > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향] 추상화에 대해서 (0) | 2022.09.07 |
---|---|
[객체지향] 객체 설계시 주의해야할 점 (0) | 2022.09.07 |
[객체지향] 타입과 추상화 (0) | 2020.02.03 |
[객체지향] 이상한 나라의 객체(객체지향세계에서의 객체) (0) | 2020.01.29 |
[객체지향] 협력하는 객체들의 공동체 (0) | 2020.01.26 |