🧐 객체지향의 패러다임?
2장을 펼쳤을 때, 가장 먼저 눈에 들어오는 말은 패러다임이다.
패러다임이라는 말은 익숙한 듯 낯설다. 위키백과에는 패러다임은 다음과 같이 정의되어 있다.
패러다임(paradigm)은 어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계,
또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념이다.
JPA(ORM)를 시작할 때 "객체지향 프로그래밍과 관계형 데이터베이스의 패러다임의 불일치를 해소하기 위한 기술"이라는 점을 가장 먼저 공부한다.
당시에는 단순하게 둘 사이의 차이를 해소시키는 것으로 이해하고 넘어갔지만 패러다임이 무엇인지 명확하게 이해가 가지 않는다.
그렇다면 패러다임을 어떻게 이해하면 좋을까?
나는 패러다임은 안경으로 이해했다. 예를 들면 다음과 같다.
과거에는 지구가 평평하다고 사람들이 생각했다. 즉, '지구가 평평하다'라는 패러다임을 쓰고 세상을 바라봤기 때문이다.
하지만 '지구가 둥글다'라는 패러다임이 등장하고 사람들은 지구가 둥글기 때문에 지평선이 끝이 아님을 알 수 있게 되었다.
이렇게 패러다임은 변화할 수 있는 것이고, 세상을 바라보는 시선 혹은 이해하는 기준이라고 이해할 수 있다.
객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다.
객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다. - 레베카 워프스브록
이제 저 말을 이해할 수 있을 것 같다.
객체지향 세계를 바라보는 내 시선은 추상화와 캡슐화란 도구로 실세계의 복잡성을 해소하는 공간이고,
개발자가 객체지향의 세계를 구축하기 위해선 지식과 행동을 구조화해야한다는 뜻으로 이해했다.
😎 객체지향과 인지 능력
객체지향 세계가 가능한 이유는 사람이 타고난 인지 능력때문이다.
단순히 물리적인 것을 넘어서 추상적인 것도 사람은 인지하기 때문이다.
하지만, 여기서 잊지말아야하는 것은 1장에서 언급한 객체지향의 목표 즉, 새로운 세계를 창조하는 것이다.
여기서도 패러다임의 불일치가 존재한다, 바로 객체는 스스로 행동하기 때문이다.
🐰 객체, 그리고 이상한 나라
책에서 이해를 돕기 위해서 이상한 나라의 앨리스를 이야기한다.
앨리스의 키는 행동의 결과에 따라 변화한다. 여기서 핵심은 다음과 같다.
- 앨리스는 상태를 가진다. 상태는 변경 가능하다.
- 상태를 변경시키는 것은 앨리스의 행동이다. 행동의 순서가 결과에 영향을 준다.
- 상태는 유일하게 식별 가능하다.
🤖 객체, 그리고 소프트웨어 나라
객체는 추상적일 수도 구체적일 수도 있다.
객체의 특성을 설명함에 있어서 상태, 행동, 식별자 이 3가지가 필요하다.
1️⃣ 상태
상태는 왜 필요할까? 이전에 일어난 모든 과거의 행동을 알기 어렵기 때문이다.
단순히 상태를 두면 행동의 결과를 쉽게 예측할 수 있다.
다시 말해, 과거의 피드백을 보관함으로 마주할 수 있는 복잡성을 줄이는 것이다.
객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
상태를 구성하는 모든 특징을 객체의 프로퍼티라고 한다.
프로퍼티(property)는 일종의 키(Key)로 정적이다. (ex. 키, 위치)
프로퍼티 값(property value)은 키의 값(value)으로 동적이다. (ex. 키 : 180)
객체 사이의 의미 있는 연결을 링크라고 한다. 링크가 있어야지 메시지를 주고 받을 수 있다.
다른 객체를 참조할 수 있다는 것을 의미하는데, 이는 식별자를 알고있음으로 표현할 수 있다.
반면에 속성은 객체를 구성하는 단순한 값을 의미한다.
상태를 다음과 같이 정리할 수 있을 것 같다.
상태는 특정 시점에 객체가 가지고 있는 정보의 집합이다.
객체의 구조적 특징을 표현한다.
2️⃣ 행동
상태는 과거의 피드백(행동)의 결과물이다. 행동은 Side Effect를 일으킨다.
행동을 다음과 같이 정리할 수 있을 것 같다.
행동은 외부의 요청 즉, 메세지를 응답하는 것이다.
객체는 행동을 통해서 다른 객체들과 협력하므로 행동은 외부에 가시적이어야 한다.
캡슐화란 무엇일까? 상태를 외부에 노출하지 않는다는 것이다.
마틴 파울러가 캡슐화에 대해서 다음과 같이 말했다.
For me, the point of encapsulation isn't really about hiding the data,
but in hiding design decisions, particularly in areas where those decisions may have to change.
캡슐화는 단순히 데이터를 외부에 노출하지 않는 것이 아니라, 변화할 수 있는 요소인 "디자인 결정"을 감추는 것이다.
이렇게 변화 요소를 감춤으로 객체에게 높은 자율성을 부여하고 협력을 단순하게 유연하게 만들 수 있다.
3️⃣ 식별자
객체 모두 다른 존재로 구분할 수 있는 이유는 구분을 결정 짓는 요소가 있기 때문이다.
이 요소는 객체가 가지고 있고, 이 프로퍼티를 식별자라고 한다.
단순한 값과 객체를 구분할 수 있는 이유는 바로 이 식별자 때문이다.
여기서 등장하는 개념이 '동등성'과 '동일성'이다.
식별자로 같음을 구분할 수 있음을 '동일성'이라고 하고, 상태를 이용해서 구분할 수 있음을 '동등성'이라고 한다.
식별자를 다음과 같이 정리할 수 있을 것 같다.
식별자란 객체를 구분하는데 사용되는 프로퍼티이다.
🥅 행동이 상태를 결정한다.
이번 챕터의 핵심을 행동이 상태를 결정한다로 봐도 무방하다.
만일 상태를 먼저 결정하고 행동을 정하면 다음과 같은 문제점들이 있다.
- 캡슐화가 저해된다.
- 객체를 고립되게 만든다.
- 객체의 재사용성이 줄어든다.
상태는 단순하게 이전의 행동의 결과를 기록한 것이다.
객체지향의 패러다임은 어떻게 메세지를 주고 받을지이다.
메세지를 보내는 것은 협력을 요청하는 것이고 객체는 요청에 따라 스스로 행동한다.
👾 은유와 객체
다시 한번 생각해보자. 왜 객체지향의 세계는 실세계의 모방이 아닐까?
실세계의 객체와 객체지향의 세계에서의 객체는 명백히 다르기 때문이다.
예를 들어, 실세계의 어떤 TV도 스스로 전원을 키고 끄지 않는다. 하지만 객체지향 세계에서는 가능하다.
그렇다고 두 세계 사이의 어떠한 연관성이 없는 것이 아니다.
단지 두 세계의 관계는 '모방'보다는 '은유'에 더 가깝다.
'추상화'라는 도구를 가지고 실세계의 객체에게서 불필요한 부분을 추려내고 핵심만 뽑아낸다.
그리고 객체지향 세계의 객체에 적용시킨다.
다시 언급하자면 객체지향 프로그래밍 개발자들의 궁극적인 목표는 '새로운 세계의 창조'이다.
어떠한 제약도 없고 추상화란 도구를 사용할지는 개발자의 마음이다.
단, 어떻게 객체들이 메세지를 주고받을지 고민하고 설계하는 것이 우리의 역할이다.
😋 지극히 개인적인 블로그지만 훈수와 조언은 제 성장에 도움이 됩니다 😋
'개인 공부 > 객체지향의 사실과 오해' 카테고리의 다른 글
[객체지향의 사실과 오해] 4장 : 역할, 책임, 협력 (0) | 2023.06.19 |
---|---|
[객체지향의 사실과 오해] 1장 : 협력하는 객체들의 공동체 (0) | 2023.04.01 |
댓글