기타/독서

객체지향의 사실과 오해

youngble 2025. 10. 20. 23:28

들어가기전에

코드가아닌 글로써 객체지향에 대한 식견을 설명을 정말 잘한 책이라고 생각한다.

읽으면서 느낀점이나 기억남는것을 써내려가기때문에 정확한 해석이나 순서는 보장하지않는다.

 

단순하게 개념의 정의로만 알던 혹은 오히려 클래스와 객체를 만들고 직접 코드를 짜면서도 단순히 모호한 형태의 덩어리처럼

이해하던 객체지향을 글을 통해 좀더 깊게 생각하게 되었다. 다독을 통해 처음본것보다 2번째 봤을때 느끼고 이해가는게 다르듯이 한번 보고 나중에 한번더 읽으면 좋을거같다. 해당 책의 일부분만 적은것이고 추후 느낀점을 더 쓸거같다. 

이상한나라의 앨리스

이책은 이상한나라의 앨리스를 예시를 통해 객체지향의 특색과 의도 목적 등을 다양한 시각으로 설명을 시작하였다.

앨리스가 시계를 보며 허겁지겁 달려가던 토끼를 보고 따라가면서 생기게 되는 에피소드를 객체지향의 설명을 한다는것에서 감탄했다.

 

상태와 행동

앨리스의 행동과 상태로 객체라는 것을 표현하다니 재미있네. '작은 문을 통과하기위해 음료수를 마신다거나 부채질을 해야만 키가 작아지고 작아진다음에야 작은문을 통과할수있다.' 라는 에피소드를 이야기하는데 단순히 이야기로만 본다면 아무 특색도없다. 당연한 스토리같기도하다. 문을 통과할수없으니 방법을 찾고 그 방법이 음료수를 마시거나 부채질을 한다라는 것이기 때문이다. 하지만 이를 객체를 이해하기위해 접목한다면 신선하다고 생각했다. 어떠한 행동에따라 엘리스는 달라지고 그 달라진 상태로인해 또다른 결과를 만들수있다는 것이다. 이는 객체의 필드, 메서드를 이해할수있으면서 결과는 필드의 값에 따라 달라진다는 것이다.

 

객체: 앨리스

상태: 키, 위치

행동: 마시기, 부채질하기, 문에 들어가기

 

1. 객체는 상태를 가지며 상태는 변경가능하다.

2. 객체의 상태를 바꾸는 것은 행동이다.

2-1. 행동의 결과는 상태에 의존적이며 상태에 의해 설명된다.

2-2. 행동의 순서가 결과에 영향을 준다.

 

기계로써의 객체

이부분에서 캡슐화, 자율적인 행동에 대해서 정말 표현을 잘했다고생각한다. 

흔히 캡슐화라고 한다면 정의는 딱딱하고 이해하기어렵다. 상태와 행동을 묶고 외부에서 접근할수있는 방법은 오로지 행동을 통해서만이고 이로인해 정보은닉을 하고 등등.. 아예 모르진 않다 하지만 와닿지가 않았다. 그걸 왜하는데? 이런느낌? 당연히 코드를 짜고 계속해서 설계해가다보면 자연스럽게 체득하겠지만 이는 새로운 시각이나 인사이트를 주지못하고 그저 코드에 갖히게 되는것같다.

이책에서는 기계라는 것을 이용해 이를 설명했는데 캡슐화에 대해 더 잘이해하게 된거같다. 흔히 우리는 기계는 버튼이있고 그 버튼을 통해 동작을한다. 하지만 그 동작의 내부구현을 알지 못할뿐더러 어떻게 그렇게 되는지 직접 분해해서 보지않는다. 우리는 버튼을 통해 작동하게하고 그 작동의 결과를 눈으로 보면 되는 것이다. 이게 다이다. 캡슐화가 말하고자하는것과 이해는 이 예시로 끝났다. 우리가 그 기계의 상태를 알고싶다고 분해해서 직접 접근하지도 않거니와 어떻게 동작하는지는 알필요도없다. 그저 버튼을 통해 무엇을 동작하는지만 알면 되는 것이다. 즉 캡슐화, 정보은닉, 행동(메서드)를 알게 되는것이다.

 

식별자

객체의 식별 동일성, 동등성을 이해하는데도 좋았다. 같은 기계가 두개있고 같은 동작, 같은 상태를 갖고있다고해도 우리는 이것을 하나의 같은 객체 라고보지않고 각각의 고유객체로 본다. 이유는 같은 동작이나 상태가 동일한 객체라고 볼수없기때문이다. 이처럼 우리가 사용하는 소프트웨어의 객체는 식별자를 가지고있고 이 식별자를 통해 우리는 동일한지 동등한지를 알게되는것이다.

 

도시전설(오해)

객체지향의 초보자는 객체의 상태를 먼저 생각하고 만든다음 그에 맞는 행동을 설계한다고한다. 이게 무슨말이지 싶었다. 또는 당연하다고 생각했다. 객체(클래스)를 설계할때 그 객체가 가지고있는 필드부터 생각하지않나? 라고말이다. 이유가 궁금했다.

여기서 바로 이것이 도시전설 이라고하면서 우리가 알고있는 정통적인 객체지향이라 함은 현실세계의 객체를 모방한다라는 오해에서 시작하기 때문이라고한다. 보통 정통적으로는 현실의 객체를 모방함으로써 소프트웨어의 객체를 만든다고 생각하지만, 오히려 이러한 도시전설로인해서 객체지향의 특색을 약하게 한다고한다. 모방하기위해선 실 객체를 잘 관찰해야되고 그 특성을 잘 추출해서 추상화해야한다. 이러다보면 우리가 만들고자하는 목적보단 객체라는 실체에만 집중하게 된다. 우리가 객체를 설계하는 이유는 어떠한 동작과 행동을 토대로 시스템을 구축해 나가는 것인데 객체에 매몰된다는 것이다. 이렇기 때문에 부자연스러운 객체 설계로인해 객체 자체는 고립이되고 협력관계도 약해지고 필요없는 행동들이 생겨나게 된다는 것이다. 

상태위주가 아닌 행동위주로 생각함으로써 우리가 이루고자하는 그객체가 무엇을 하기위해 존재하는지(행동)을 먼저 생각하고 그 행동에 필요한 상태나 협력을 생각해야한다는 것이다.

머리를 한대 맞은것처럼 충격적이면서도 이해가 되었다. 나는 무엇을 만드는가 필드가 중요한가 그 객체가 하는것이 중요한가. 무엇을 하는지가 중요하고 그 행동에 따른 필드가 필요한 것이다. 이게바로 전통적인 객체지향의 오해인것이다.

 

그러기 때문에 실세계의 모방이 아닌 단순히 참조를 해서 소프트웨어 객체를 창조하고 만들어 가는것이 객체지향의 설계에 더 맞다라는 것이다.  이상한 나라의 앨리스에 나오는 토끼, 앨리스, 카드 왕 등은 현실세계의 인물들을 모방한것이 아닌 참고를 하여 새로운 형태를 창조한것이다. 만약 실세계를 완벽히 모방하는 것만으로 객체를 이루고자한다면 한계가 있고 우리가 이루고자하는 객체지향의 설계와 도메인은 나올수없다는 것이다. 즉 현실세계를 객체에 모두 투영하려는 과오로 고립되거나 한계를 만들지 말라는 것이다.

 

은유

이 참조라는것은 마치 은유를 통해 설명하듯이 객체도 이뤄질수있다는 것이다. '그 여자는 토끼와 같은 사람이야' 라는 은유를 통해서 그 여자가 온순한 성격을 가졌다는 특징을 알수있고 '그 남자는 사자같은 사람이야' 라고한다면 사납고 불같은 성격을 가지고있다는 것을 이해할수있다. 이처럼 객체 또한 현실세계의 모방이나 같음이 아닌 그 특징을 참고하여 재창조한다는 것이다. 자동차라는 은유와 참고를 통해 우리가 원하는 소프트웨어를 만들수있는것이고, 그것이 설령 실제 자동차와 달라지더래도 우리가 이루고자하는 소프트웨어의 목표라면 그렇게 하라는 것이다. 이 얼마나 자유롭고 유연한 사고로 비롯된 것일까 생각이 들었다. 틀에 갖히기보단 자유롭게 사고할수있는 것이라고 생각했다. 

 

단 의도와 역할에 대한 일관성은 유지해야한다. 예를들어 go(), back()이라는 메서드를 보고 앞으로가거나 뒤로간다라는 역할임을 알수있고 이를 따르는것은 정도다. 하지만 창조라는것을 위해 go라하고뒤로가거나 특이한 행동을 한다면 여러 객체들간의 협력 또는 코드를 이해함에 있어서 정말 최악인것이다. 정도를 알고 오해없이 제대로 이해해야지만 골고루 분포된 객체지향이 되는것같다.

 

끝내며

아직 책을 다 읽고 쓴것도 아니거니와 객체지향에 대해 더 알고싶고 이책의 추천도 많아서 읽었는데 인사이트가 느는거 같아서 재미있다.

배울수록 재미있어진다. 이거 읽고 같은 저자가 쓴 '오브젝트'도 읽을려고 샀고 DDD관련된 책도 읽고싶다. 요새 테스트코드 작성하면서 이거와 맞물리는것도 재미있다 어떠한 의도를 볼것인지, 무엇을 테스트할건지 등등 Classicist vs mockist, 그리고 그 작성할때 생각하는게 도메인적인 관점, 행동의 관점 등 여러가지 맞물리면서 많이 알수록 좋은 설계를 할수있겠구나 생각이 들었다. 

 

 

 

 

 

 

'기타 > 독서' 카테고리의 다른 글

[독서] 베로니카, 죽기로 결심하다  (1) 2023.05.05