본문 바로가기

책을 읽어보자/객체지향의 사실과 오해

[우테코 권장도서] 객체지향의 사실과 오해 2장

2장 현실과 프로그래밍 세계는 다르다구~~~~~~~~~~~~


객체!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

전장의 주제는 객체지향을 구성하는 요소를 종합해봤다면

이번장은 객체에 집중해보는 장이였다

 

시작부터 객체는 무엇일까를 살펴보는데

객체를 인간이라면 응당 구분해내야할것으로 이야기한다 -> 인지와 관련된 실험을 언급하며 아기들도 객체를 구분하는 능력이 있다고한다.

이런면에서 나는 객체를 구분못하는 문어 이쯤인가 싶다.

 

 

어쩃든 객체는 일단 눈으로보면 물리적적이든 추상적이든 구분이 되고 값이 아닌 객체라면 객체를 구분하는 고유값을 갖고있다-> 여기서는 뭐 동일성을 주소값이 아닌 어떤 인스턴스로 표현했지만 뭐 주소값이라도 말해도 무방하지않나 싶다.

 

그래서 동등성 동일성, 값객체, DTO(이건 책에서는 안나오지만 ), 엔티티 등등 값과 객체를 구별하는 요소들 값들이 객체의 상태를 구성한다는 것을 훑고 지나간다.

뭐 나중에 까먹을까봐 적어놓으면 동등성 동일성은 https://mccoy-devloper.tistory.com/99 여기에

DTO,값객체,엔티티 같은건 여기에 정리했으니 https://mccoy-devloper.tistory.com/100 다시보면된다 미래의 나에게 전한다.

 

객체를 구성하는 요소는 상태와 행동 식별자


1.상태

객체를 구성하는 요소로 상태를 우선 살펴본다.

상태는 객체가 흘러온 역사를 요약하고 현재 객체가 어떠한 행동을 할수있는지 또한 어떤 조건을 갖추고있는지 요약한다고 이해했다.

무슨일이 쭉 있었는지 다 기록한다면 뭐 어떻게 요약할지 감도안온다 애초에 그렇게 생각해본적도 없다.

어쨋든 객체의 나이테 같은거라는것.

상태의 구성요소

프로퍼티를 객체의 상태라고 하는데 값과 링크(객체와의 연결)로 구성되어 있다고 한다.

당연히 값은 우리가 아는 그냥 그거다 기본적인 자료형(Int,StringBoolean) 등등 원시 자료형을 통해 표현하는것

링크는 객체와의 관계를 표현하는 방법으로 객체사이 관계가 링크로 서로 연결되어있어야 요청도 보낼수 있고 서로 소통이 가능한데

한 객체에서 다른객체의 주소값을 참조할 수 있다는것이다. -> 책에 기술되어있지는 않지만 주소를 참조할수 있는 링크는 주입받을수도 객체내에서 생성할수도 뭐 여러방법이 있을것이다.(주입받는게 왠만해서 좋겠지)

 

그래서 이제 서로 연관되어있는 경우에 메시지를 던질수 있다.

메시지를 던져서 상태값을 변화시켜서 자율성을 보존해줘야한다 -> 다른객체에서 상태를 직접 변경하는 일은 절대 없어야한다.

 

그리고 아주얕게 엘리스 객체에서는 음료를 알지만(참조가능) 그반대는 아니다 라는게 스쳐갔지만 자세히는 안다룬다.

 

행동

행동은 메서드 그자체이다

행동에서 요점은 함수명을 보고도 상태가 어떻게 변하는지는 전혀 모르는게 맞다는것이다.

상태값이 궁금하다면 따로 조회해봐야하지 그냥 행동자체는 행동일뿐 상태값을 암시하거나 하면 안된다는것이다.

이런행위 자체가 캡슐화이고 이럴수록 유연해지고 교체가 쉬워질것이다.

 

이부분에서 초심자들이 주로 겪는 실수 (내가 많이함) 상태값을 우선적으로 생각하고 행동을 정의하는 행위를 하지말고

행동(책임)을 먼저 설계하고 그에맞는 상태값을 가지도록 설계하게 하는것을 한다면 객체의 설계가 응집도를 높이고 재사용이 쉬워질것이라는것이다.-> 이걸 실제로 생각해본다면 인터페이스로 행위부터 정의해놓고 실제 객체를 구현한다면 그에맞춰 만든 객체들은 다 호환이 될테니 좀 유연해질것 같다.

 

이글에서의 중요한 명언!!!! 행동이 상태를 결정한다 -> 여태 정리되었다고 생각한다.

 

근데 신기한게 이부분을 분명 수업에서 다뤄졌을때는 하나도 와닿지 않았는데 여러번 반복노출되다보니 감이 확온다. 역시 반복노출이 중요한것같다

기계적인 객체

객체를 예시를 들때 기계를 예로 들었는데

상태를 조회할수있는 창이있고 행위를 하는 버튼들이있는 기계를 예시를든다 이것만 기억한다면 직관적으로 객체를 잘 설치할수 있다고 생각한다.

어쩃든 내가 가져가야 할 점은 객체에서 상태 조회시켜주는거 올바른 행위중하나니 무서워하지말자 이다.

현실세계와의 대비

여태 계속 미션을 할때 리뷰어 분들이 이거는 어떤 객체가 해야하지 않을까요 라는 리뷰를 받을때마다 현실세계에 대입해서 으음..... 그런가??? 이런상황이였다.예를들어 카드 계산같은걸 카드가 아닌 심판같은 외부 객체가 하는것은 어떤가 제시를 받았을때 읭? 현실에서는 그런가? 아님 뭐 현실에 대입하면 그렇게 되려나? 라고 생각했다.하지만 이 부분을 읽으면서 명확해졌다. 내가 기준이 있다면 내생각대로 하면된다.세상을 투영하는것이 아니라 내가 새로운 세계관을 구성하는것이기 때문이다.

 

다른 객체지향 원칙에 따라 한가지 일만한다 이런 기준이라면 분리해야겠지만, 그걸 제외하고 그냥 현실에 대비하거나 타인의 주관적인 기준으로 분리되어야한다면 세계관을 내가 설정하고있기 때문에 그런건 내가 결정해야하고 나의 주관이 가장 중요하다는 것을 깨달았다.

현실에 전혀 대비하지않고 이해를 위한 은유의 영역이라면 그것을 제외하고 세계관을 구성하는 것은 개발하는 사람의 몫이라는것을 깨달았다.

 

어쨋든 은유를 잘이용해서 타인이 잘 알아들을수있게 구성하며 전체적인 역할과 책임은 내가 캡슐화와 메시지를 던지기 쉬운 형태로 구성하면 될것이라는 생각이 들었다.