인간이 직접적으로 지각할 수 있는 대부분의 객체는 물리적인 경계를 지닌 구체적인 사물이다. 그러나 인간의 인지 능력은 물리적인걸 넘어서 개념적으로도 경계를 지을 수도 있는 추상적인 사물도 객체로 인식을 하다.
→ 개념적인 객체는 무엇일까? 출금 계좌에서 동일한 입금 계좌로 동일한 금액을 두번 보내도, 첫번째 이체와 두번째 이체는 명백히 다르다. 즉, 인간은 이런 계좌이체 까지도 한번의 단위로 인식 할 수 있다.
요약 : 즉 객체는 인간이 분명하게 인지하고 구별할 수 있는 물리적인 개념 또는 개념적인 경계를 지닌 어떤 것이다.
객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라, 현실 세계를 기반으로 새로운 세계를 창조하는 것이다.
→ 현실 세계의 객체와 소프트웨어상의 객체는 전혀 다른 모습이다. 그렇다면 소프트웨어 상의 객체는 정확히 무엇일까?
일반적으로 객체는 인간의 인지 능력 안에서 개수를 셀 수 있고, 다른 사물과도 구별이 되면서, 생성 시점을 알 수 있고, 독립적인 하나의 단위로 인식 할 수 있는 모든 사물이다.
이런 객체의 다양한 특성을 소프트웨어상에서 가장 효과적으로 이해하기 위해서는 객체를 상태, 행동, 식별자를 가진 실체로 보는 것이 가장 효과적이다.
모든 객체의 공동점은 어떤 행동의 결과에 따라 상태가 바뀐다. 즉, 객체는 어떠한 행동에 의존적이다.
또한 일반적으로 객체의 상태를 보면, 이 객체가 과거에 어떤 행동을 했는지 몰라도, 앞으로 그 객체가 앞으로 어떠한 것을 할 수 있는지 알 수 이다.
→ 예를 들어, 우리가 보조배터리를 길에서 주었다고 가정해보자, 우리는 이 보조배터리의 충전 상태가 어떠한지는 모른다. 따라서 이 보조배터리로 휴대폰을 충전 할 수 있는지 알 수가 없다. 하지만 보조배터리의 '상태' 즉, 축전량을 알고 있다면, 우리는 이 보조배터리로 휴대폰을 충전이라는 행동을 할 수 있다는 것을 알 수 있다.
☑️ 객체의 상태를 이용하면, 이 객체의 과거를 이해하지 않고, 현재 상태를 보고 객체가 앞으로 무엇을 할 수 있는지 파악이 가능.
그렇다면 세상의 모든 것은 객체인가? 정확히 말하면 아니다. 분명히 우리가 인식 할 수 있지만, 객체가 아닌 것들도 있다. 예시로 숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓 처럼 단순한 값들이 있다. 이런 단순 값들은 객체가 아니다. 하지만 단순 값들은 객체의 상태를 표현 하기 위해 사용 된다.
이런 상태를 나타내는 단순 값들로 객체를 나타내고, 때때로 이러한 객체로 또 다른 객체를 나타 낼 수도 있다.
→나이가 24인 최지환이 150ml 정도 물이 들어 있는 물병를 갖고 있다고 해보자. 우선 물병 객체는 150ml의 양을 갖고 있는 '상태'이다. 하지만 최지환의 관점에서 보면 물병라는 '객체'를 갖고 있다.
최지환 → 물병(객체) + 24살(단순값)
물병 → 150ml(단순값)
따라서 최지환은 물병(객체) + 24(단순값)으로 이루어진 객체이다.
요약하자면, 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현 가능하다.
→모든 객체의 상태를 나타내는 것들을 프로퍼티(property) 라고한다.
💡 객체와 객체 사이의 의미있는 연결을 링크(Link)라고 함
→ 최지환이 물병을 갖고 있는것은 최지환과 물병이 Link 되어 있는것.
💡 객체를 구성하는 단순한 값은 속성(Attribute)이라고함
→ 최지환의 나이
객체의 행동에 의해 객체의 상태가 변경되면서 얻는 것
→ 최지환이 물병을 버림으로써 손이 가벼워진다는 부수 효과를 얻을 수 있다.
즉, 최지환 ⇒ 물병(객체) + 24살(단순 값) + 한손 사용가능 이라는 상태에서 최지환 → 24(단순 값) + 양손 사용 가능 으로 상태가 바뀜.
→ 최지환 ⇒ 24(단순 값) + 양손 사용 가능
이러한 상태라면, 앞으로 물병을 다시 들 수 있거나, 두 손을 다 사용해 의자를 들 수도 있다.
객체는 협력과 행동의 과정을 통해, 자신(자신 객체)의 상태를 변경 시키거나, 협력 관계에 있는(협력 객체)의 상태를 변경 시킨다.
즉 객체의 행동으로 인해 발생되는 결과는 '객체 자신의 상태 변경', '협력하는 다른 객체에게 메시지 전송' 이렇게 두 가지가 있다.
캡슐화
메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 전혀 알지 못하는 것.
최지환 객체가 물병 객체가 있다고 가정 해보자.
현실 속에서 최지환 객체가 물병안에 있는 물을 마시면, 물 병의 물을 줄이는 상황의 주체는 최지환이다.
하지만, 객체지향적인 관점에서는 최지환 객체와 물병 객체 모두 자율적이다.
따라서, 음료의 양을 줄어드는 건 물병 객체의 자율안에서 줄이는 것이고, 최지환 객체는 물병 객체에게 '물을 마신다'는 메시지를 보내기만 하지 물병 객체의 물을 직접적으로 줄이지는 않는다.
쉽게 말하자만, 최지환 객체가 '물을 마신다' 메시지를 보내기만 한다. 또한 물병 객체는 이런 메시지를 받고 물을 줄이는 행동을 바로 하는게 아니라, 자율적으로 물의 상태를 바꾸거나 냅둘 수 있다.
이렇게 때문에 최지환 객체는 물병 객체에게 물을 마신다고 메시지만 보내고, 물병 객체 안에 있는 물의 줄었는지, 늘었는지는 모른다.
이런 캡슐화 (메시지 송신자가 메시지 수신자의 상태 변경에 대해 모르는 것)를 통해 객체의 자율성을 높힐 수 있다.
값과 객체
식별자
→ 객체를 서로 구별할 수 있는 특정한 프로퍼티
값
→ 숫자, 문자열, 날짜, 시간, 금액 처럼 변하지 않는 불변 상태를 가진 값
동등성 : 상태를 이용해 두 값이 같은지 판단할 수 있는 성질
→ 이 동등성을 판단하기 위해 근거가 되는 상태는 '값'이 될 수 있음
→why? 불변 상태인 값은 결고 변하지 않기 때문에 어떤 시점에 동일한 타입의 두값이 같다면, 그 두 값은 동등한 상태를 유지하기 때문.
객체 : 시간에 따라 변경 되는 상태를 포함
→ 가변 상태
동일성 : 식별자를 기반으로 객체가 같은지 판단할 수 있는 성질
객체는 상태를 기반으로 같은지 판단할 수 없다 → 따라서 '동일성'으로 판단
→why? 객체의 상태는 가변적이기 때문에 시간의 흐름에 따라 바뀔 수 있다.