객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다.
-레베카 워프스브록-
동화 앨리스에 비유하여 객체,상태,행동을 설명하려 한다.
앨리스는 작은 문을 통과하기 위해 자신의 키를 늘렸다가 줄이고 있다.
이러한 상황에서 아래와 같이 행동과 상태를 정의할 수 있다.
앨리스의 키를 변화시키는 것 -> 앨리스의 행동
앨리스의 키 -> 상태
앨리스의 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태이다.
문의 사이즈 : 130cm
앨리스의 키 : 140cm
케익을 먹음: 15cm가 자람
부채질을 함: 5cm가 줄어듬
케익을 먹고 -> 부채질을 함 -> 앨리스와 문의 사이즈가 같아짐
따라서 행동에 따라 상태(키)가 변하고 상태에 따라 행동을 결정한다.
문을 통과함으로써 앨리스의 위치가 정원으로 변화했다고 하면
문을 통과한 과정이 있었기 때문에 정원에 도착할 수 있었던 것이다.
따라서 어떤 행동(정원에 도착)의 성공 여부는 이전에 어떤 행동이 발생했는지에 영향을 받는다.
위의 내용을 요약하자면,
식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다.
객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
객체 = 상태(state) + 행동(behavior) + 식별자(identity)를 지닌 실체
상태를 이용하면 과거의 모든 행동을 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.
프로퍼티
숫자,문자열,양,속도,시간,날짜,참/거짓과 같은 단순한 값들은 객체가 아니다.
단순한 값들은 그 자체로 독립적인 의미를 가지기보다는 다른 객체의 특성을 표현하는데 사용된다.
다시 말해 단순한 값은 다른 객체의 상태를 표현하는 수단으로 사용된다.
앨리스가 현재 음료를 들고 있는 상태인지를 표현하고 싶다면
앨리스의 상태 일부를 음료라는 객체를 이용해 표현하면 된다.
위의 예시 처럼 객체도 다른 객체의 상태를 표현하는데 사용될 수 있다.
결론적으로, 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.이때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다. 앨리스의 경우 키,위치,음료가 프로퍼티가 된다.
프로퍼티 : 정적인 값
프로퍼티 값 : 동적인 값(변화하므로)
링크
객체(앨리스)와 객체(음료)를 연결을 링크(link)라고 한다. 객체와 객체 사이에는 링크가 존재해야만 요청을 보내고 받을 수 있다.(=메시지를 주고 받을 수 있다.)
링크는 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다.
(다른 객체의 식별자를 알고 있으면 둘 사이에는 링크가 존재한다고 하는것이다.)
프로퍼티 = 속성(단순한 값) 와 링크(다른 객체를 가리키는 것)의 조합으로 표현할 수 있다.
객체의 상태는 저절로 변화하지 않는다.
객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이다.
객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수효과를 초래한다는 것을 의미한다.
상태와 행동 사이의 관계
정리하면 객체의 행동으로 인해 발생하는 결과는 2가지 관점에서 설명할 수 있다.
1. 객체 자신의 상태 변경
2. 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
객체의 행동은 이 두 가지 관점의 부수효과를 명확하게 서술해야 한다.
요약하면 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동의 외부에 가시적이어야 한다.
객체지향의 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재다.
앨리스 객체의 키를 작게 만드는 것이 앨리스 자신인 것처럼
음료 객체의 양을 줄이는 것은 음료 자신이어야 한다.
따라서 상태를 잘 정의된 행동 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.
모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별한다.
객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것이다.
이 프로퍼티를 식별자라고 한다.
값과 객체의 가장 큰 차이점은 값은 식별자를 가지지 않지만 객체는 가진다는 것이다.
값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다. 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.
값과 객체를 구별하는 방법
값과 객체를 혼동하는 경우가 많아 값과 객체를 지칭하는 별도의 용어를 사용하기도 한다.
식별자를 지닌 전통적인 의미의 객체 : 참조객체(reference object),엔티티
식별자를 지니지 않는 값: 값 객체(value object)
⭐ 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다. 행동에 초점을 맞춰야 한다.
상태를 먼저 결정하면 안 좋은 이유
1. 상태를 먼저 결정할 경우 캡슐화가 저해된다.
상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게
캡슐화되지 못하고 공용 인터페이스에 그대로 토출되버릴 확률이 높아진다.
상태를 먼저 고려하는 방식은 협력을 무시하고 개쳋를 설계하므로 옳지 않다.
객체의 재사용성은 다양한 협력에 참여할 수 있는 능력에서 나오는데
상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵다.
객체의 행동은 객체가 협력에 참여하는 유일한 방법이다.
객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는 데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다.
행동을 결정한 후 행동에 필요한 정보를 고려하고 이 과정에서 필요한 상태가 결정된다.
객체지향은 현실세계의 모방이다(?) -> x
객체지향의 세계는 현실세계의 단순한 모방이 아니다.
의인화
현실속의 객체와 소프트웨어 객체 사이의 가장 큰 차이점은 현실속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다는 것이다.
현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화라고 한다.
결론적으로, 소프트웨어 안에 구축된 객체지향 세계는 현실의 모방이 아니며 모방한 것 또한 아니다.
현실의 모습을 조금 참고한 것뿐 현실과 전혀 다른 새로운 세계를 창조하는 것이다.
은유
은유란 실제로는 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 형태이다.
은유의 본질은 한 종류의 사물을 다른 종류의 사물 관점에서 이해하고 경험 하는데 있다.
프로그램 내의 객체는 현실 속의 객체에 대한 은유다.
현실 속의 전화기는 스스로 전화를 걸 수 없다고 하더라도 우리가 알고 있는 전화기라는 개념을 이용해 소프트웨어 객체를 묘사하면 그 객체가 전화를 걸 수 있다는 사실을 쉽게 이해하고 기억할 수 있다.
창조한 객체의 특성을 상기시킬 수 있다면 현실속의 객체의 이름을 이용해 객체를 묘사하자. 그렇지 않다면 깔끔하게 현실을 무시하고 자유롭게 세계를 창조하자.