본문 바로가기
SW core/객체지향

객체지향의 사실과 오해 - 메시지와 메소드

by ocwokocw 2021. 8. 16.

- 이 글은 조영호의 객체지향의 사실과 오해를 기반으로 작성되었습니다. (가능하면 꼭 읽어보는것을 추천드립니다.)

- 책임

객체는 다른 객체로 부터 요청을 수신하였을 때 이 요청을 자율적으로 처리할 수 있는 존재여야 한다. 그리고 이때 객체가 처리하기 위해 수행하는 행동을 책임이라고 부른다.

 

앞의 역할,책임,협력 글에서 왕은 모자장수에게 '증언하라' 는 메시지를 전달했다. 메시지는 수신자의 책임을 암시하므로 모자장수는 증언해야할 책임이 생긴다. 왕은 모자장수가 증언만 수행할 수 있다면 어떤식으로 하든지 방법에는 신경쓰지 않는다. 말이나 글로 혹은 영상 녹화본이 있다면 영상을 제출할 수도 있다. 만약 왕이 모자장수에게 요청하는 내용이 아주 세부적이라면 어떻게 될까?

간결하게 '증언하라' 라고 요청했을 때와는 다르게 위의 요청은 모자장수에게 많은 책임을 지게한다. 재판이라는 협력에서 왕이 모자장수에게 요청한 것은 해당 사건에 대한 증언인데 위의 요청은 모자장수의 권한을 지나치게 제한함으로써 모자장수가 자율적으로 행동을 할 수 없게 만든다.

 

그렇다고 해서 너무 추상적인 책임이 좋은것은 아니다. 만약 왕이 모자장수에게 밑도 끝도 없이 '설명하라' 라고 요청한다면 모자장수 입장에서는 무엇을 설명하라는 것인지 알 수 없다. 책임은 협력의 의도를 뚜렷하게 표현하고 있다는 전제하에 충분히 자율적이어야 한다.

 

자율적인 책임의 특징은 어떻게가 아니라 무엇을에 초점을 맞추는 경우가 많다. 개인적인 생각으로 이 부분이 나를 포함한 개발자들 입장에서 정말 사고하기 어려운 부분이라고 생각한다. 객체에 자율성을 부여하기 위해서는 요구사항을 듣자마자 구현 방법을 먼저 떠올리는것을 참아내고 어떻게가 아니라 무엇을에 초점을 맞추어 객체가 어떤 책임을 져야 하는지 생각해보아야 한다.


- 메시지와 메소드

다른 객체로 부터 메시지를 수신받는다는 것은 수신받는 객체가 어떤 책임을 수행한다는것을 의미한다. 객체지향에서 다른 객체의 행동을 유발하는것은 메시지를 전송하는것 뿐이다.

 

메시지는 메시지 이름과 인자로 구성되어있다. 만약 왕이 모자장수에게 '증언하라'고 요청할 때 부가적인 정보로 어제라는 시간과 왕국이라는 장소를 요청한다면 메시지는 '증언하라(어제, 왕국)' 과 같은 형태로 구성될것이다. 이런 메시지를 수신하는 수신자까지 표현한다면 '모자장수.증언하라(어제, 왕국)' 과 같은 형태가 될 것이다. 이 형태가 코드로 무엇을 표현하는지는 굳이 말하지 않아도 다 알것이라고 믿는다.

 

메시지를 수신받는 객체는 자신이 처리할 수 있는지 여부를 우선 확인한다. 자신이 처리할 수 있는 메시지라면 해당 객체는 그러한 책임이 있다는 것을 의미한다. 메시지는 해당 객체가 수행해야할 책임을 명시하고 있다.

 

객체는 메시지를 자율적으로 처리할 수 있기 때문에 메시지를 받고서 어떻게 처리할 것인지를 스스로 결정할 수 있다. 따라서 요청받는 수신자가 메시지를 변경하지만 않는다면 책임을 수행하는 방법을 변경해도 요청자는 알 길이 없다. 이런 점은 메시지가 외부와 내부를 분리한다는것을 의미한다. 무엇을 처리할지는 외부에 공개되지만 수행방법은 내부의 영역이다.

 

앞의 사실로 부터 객체가 수신할 수 있는 메시지와 이를 어떻게 수행할지 방법에 대한 부분이 분리되는것을 알 수 있다. 메소드란 메시지를 수신받은 객체가 내부적으로 처리하는 방법을 의미한다. 객체는 메시지를 수신하면 해당 메시지의 처리가능 여부를 결정한 후 어떻게 처리할지에 대한 메소드를 선택하게 된다. 메시지는 어떻게 수행하는지를 의미하지는 않으며 무엇이 실행되는지만 명시한다. 또한 객체 지향에서는 실행 시간에 메소드를 선택할 수 있다.

 

다형성이란 메시지와 메소드를 구분하는것에서 시작한다. 동일한 메시지를 수신받더라도 처리 주체가 다르면 다르게 반응한다. 메시지로 무엇을 수행할지 결정했다면 어떻게 실행할지는 전적으로 수신자에 의해 결정된다. 그래서 수신자는 이 메시지를 처리할 메소드를 선택할 수 있다. 엘리스 이야기에서 '증언하라'는 메시지에 대해 모자장수와 요리사 그리고 앨리스가 처리하는 방법은 모두 다르지만 왕이 전달한 메시지는 동일하다. 이것이 바로 다형성이다.

 

다형성을 협력, 책임, 역할의 관점에서 보면 역할의 대체가능성에 가장 가깝다. 메시지를 전송하는 객체의 입장에서는 메시지를 처리하는 수신자의 종류에는 관심이 없다. 메시지에 대해 기대한 응답값을 받으면 그만이다. 메시지를 수신하는 입장에서 하나의 메시지를 처리할 수 있는 다른 객체들이 있다면 이는 동일한 역할을 수행하고 있다는 말이 되며 역할의 대체가능성으로 표현할 수 있다. 이를 고급스럽게 말하면 수신자의 종류를 캡슐화 하고 송신자와 수신자간의 타입에 대한 결합도를 낮춘다고 표현할 수 있다.

댓글