객체 지향의 사실과 오해 요약1

Mr_Gu·2022년 1월 12일
1

books

목록 보기
1/8

글을 시작하기 전에!

  1. 설명, 이야기는 다 빼고 개념적인 부분만을 추려서 정리하였습니다. 다만 개념 정리 부분을 많은 부분을 저의 말로 바꿔썼기에 자기 생각이 강합니다.

1. 협력하는 객체들의 공동체

객체 지향과 실세계의 메타포

객체 지향을 실세계로 비유하는 관습은 객체 지향을 설명하기 쉽다는 이유로 널리 퍼졌다. 아무래도 실세계로 묘사하다 보면 추상화, 캡슐화, 협력 같은 객체 지향의 핵심적인 특징을 설명하기 매우 쉬워지기 때문이다. 하지만 현실 세계의 객체와 객체 지향 세계의 객체는 매우 다르다. 현실 세계와의 비유는 딱 교육적인 목적에서 끝나야 할 것이다.

역할, 책임, 협력

어떤 객체도 섬이 아니다. [Beck 1989]

애플리케이션의 기능들은 작은 책임들로 분해되고 이 책임들은 적절한 객체가 맡아서 처리하게 된다. 그리고 책임을 수행하는 작은 객체들은 시스템의 목표를 위해 협력한다.

그렇기에 다른 객체들과 협력하지 않고 자기가 다하는 오만한 객체는 객체 지향 방식에 어긋난다. 그렇다고 자율적이지 못하고 다른 객체에 휘둘리는 객체 또한 협력에 적합하지 않다. 자기 할 것만 하고 남의 일은 메세지를 통해 위임하는 객체가 이상적인 객체다.

객체 지향의 핵심은 책임을 적절히 분배받은 객체 간의 협력이다. 클래스는 객체가 아니니 객체 지향 = 클래스로 생각하지 말자. 3장에서 배우겠지만 클래스는 타입을 정의하는 문법 중에 하나일 뿐이다.

나중에 책을 다 읽고서 알았지만 이후 챕터는 이 장에서 다룬 내용 중 일부분을 구체화 하는 내용이 주가 된다. 그럼에도 결국은 협력, 책임, 역할로 귀결되어서 어? 똑같은 얘기 하는 거 아니야 라는 느낌을 들게 한다. 다른 챕터를 읽을 때 어디에 초점이 있는지 생각하면서 읽으면 좋을 듯 싶다.

2. 이상한 나라의 객체

소프트웨어의 경계, 현실 세계의 경계

현실 속에 사람은 이해하기 힘든 복잡한 객체를 자신이 감당 가능한 개념체계에 분류해서 생각한다. 즉 현실 세계에서 개념 분류 체계는 이미 있는 복잡한 수많은 사물을 이해하기 위해 그은 경계이다.

하지만 소프트웨어 세상은 복잡한 일을 하는 협력체를 창조하기 위해 타입(3장에서 배우겠지만 개념은 타입임)을 정의하기 때문에 현실 세계의 객체와는 완전히 다른 성격의 객체가 탄생한다.

소프트웨어의 객체

객체는 동작해야 한다. 현실 세계에서는 인간이라는 치트키가 있어서 지갑이 아무것도 안해도 인간이 대신 수행해주지만 소프트웨어 세계는 지갑이 스스로 돈을 관리해야 협력이 굴러간다. 이를 의인화라고 부른다.

객체는 자율적이여야 한다. 자신이 어떤 책임을 수행하는 지만 공개하고 어떻게 수행하는지는 자신이 스스로 결정해서 감춰야 한다. 어떻게 수행하는지 간섭 받으면 받을 수록 해당 객체와 협력하는 객체는 더 많은 정보를 알고 있어야 하고 이는 시스템의 복잡성을 급격하게 증가시킨다.

상태는 행동을 위한 정보일 뿐이다. 객체는 협력에 참여하기 위해 존재하고 협력 안에서 책임을 수행할 수 있는 지는 행동이 결정한다. 상태는 그저 객체가 적절히 행동할 수 있게 도와주는 용도일 뿐이다. 상태와 행동은 서로가 서로에게 영향을 끼치기 때문에 동등하다고 볼 수 있는 관계지만 협력이라는 틀 안에서 메인은 행동이라는 것을 명심하자.

3. 타입과 추상화

추상화란

특정 목적을 달성하기 위해 복잡한 부분을 감추고 본질적인 부분만을 드러내는 행위를 칭한다.
주로 객체들을 개념 안에 분류하는 방식으로 추상화를 실현한다.

![](https://velog.velcdn.com/images%2Fcuzz%2Fpost%2F46e689ce-fceb-4784-bd1e-d65e335ced95%2F03_%EC%B6%94%EC%83%81%ED%99%94_%EC%9A%94%EC%95%BD1.PNG)

#### 타입에 관하여

현실 세계에서의 개념은 프로그래밍 세계에서의 타입과 매칭된다. 타입도 본질적으로 목적을 달성하기 위해 복잡한 부분은 감추고 본질적인 부분만을 드러내기 위해 사용된다.

기본 데이터 타입은 메모리 내의 이진수를 감추고 우리에게 익숙한 데이터 개념만을 드러낸다.

객체 타입은 객체의 여러 상태나 구현을 숨기고 해당 객체가 제공하는 행동만을 제공한다.

타입 간의 추상화, 객체와 타입

우선 트럼프와 트럼프 카드 그림부터 보자. 트럼프 카드 타입에 속하는 모든 객체는 트럼프 타입에 속한다고 하면 트럼프는 슈퍼타입, 트럼프카드는 서브타입이 된다.

이때 특정 포함되는지의 여부는 전적으로 행동에 의해 결정된다. 그리고 일반적인 타입일수록 할 수 있는 행동이 적고(대신 어떤 객체에 기능이 거의 없어도 다 포함된다.) 구체적인 타입일수록 할 수 있는 행동이 많아진다.

서브 타입을 슈퍼 타입으로 변경하는 것은 일종의 추상화이다. 서브 타입만이 할 수 있던 행동의 슈퍼 타입으로 변경하면서 없애버리기 때문이다. 서브 타입으로 할당된 객체가 사실 슈퍼 타입이 요구하는 행동만을 한다면 슈퍼 타입으로 캐스팅 하므로써 불필요한 부분은 없애버릴 수 있다.

마지막 그림은 타입과 객체 간에 관계를 표현하였다. 타입은 실시간으로 변하는 객체를 편하게 다루기 위한 추상화 도구라는 점을 명심하자.

프로그래밍 세계에서 추상화를 두 가지로 분류할 수 있을 듯 싶다.
첫번째 추상화는 객체에 타입을 부여하면서 시간 종속적인 속성 값이나 내부 구현를 숨기고 행동만을 드러내게 하는 방식이다.
두번째 추상화는 서브 타입이 부여된 객체에 슈퍼 타입을 부여함으로써 불필요한 행동을 숨기고 핵심적인 행동만을 수행하게 하는 방식이다.

추상화는 목적을 수행하기 위해 복잡함을 숨기고 본질만을 드러내는 행위다. 객체 지향 세계에서 객체는 책임을 수행하기 위해 존재하니 특정 객체를 자기 멋대로 추상화시키지 말고 책임을 명확하게 수행하기 위해 추상화를 사용하길 바란다.

  • 우선 내용이 길어지는 관계로 나머지 내용은 다음 포스트에 작성하도록 하겠습니다.
  • 정리하면서 느낀 건데 내용이 만만치 않습니다. 특히 추상화 부분은 워낙 어려운 내용이라... 부디 잘못된 내용이 있으면 댓글로 지적해주심 감사합니다.
profile
그냥... 즐기자..

1개의 댓글

comment-user-thumbnail
2022년 5월 4일

velog 깔끔하네요

답글 달기