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

객체지향의 사실과 오해 - 객체지향의 핵심

by ocwokocw 2021. 8. 18.

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

- 객체지향의 핵심, 메시지

객체지향이라는 단어를 들으면 가장 먼저 생각나는것은 클래스이다. 프로그램을 구현하라고 하면 우리가 가장 먼저 하는 일은 클래스를 선언하고 속성과 메소드를 채워넣는것이다. 그리고 클래스간의 의존성을 관리하며 상속도 사용한다.

하지만 객체지향의 강력함은 객체들이 주고 받는 메시지에서 나온다. 따라서 객체들의 속성과 행위를 먼저 식별해야 한다. 클래스는 단지 객체들의 특성과 행위를 정적으로 표현하는 추상화 도구일뿐이다.

 

문제는 클래스보다 객체를 우선시한다고 해결되지 않는다는 것이다. 객체들의 속성과 행위를 먼저 식별해야 한다는 말을 개별적인 객체에 집중하라는 의도로 오해하면 안된다. 객체지향의 진가는 전체 협력과정에서 객체들간의 주고 받는 메시지에서 나온다. 협력 이라는 문맥안에서 라는 전제를 기억해야 한다.


- What/Who 사이클

협력이라는 문맥안에서 다른 객체에게 메시지를 전송할 때 수신받은 객체는 그 메시지를 수행할 책임이 있고, 이런 책임이 수신자의 행위를 결정한다고 했다. 이렇게 메시지를 먼저 고려한 후 수신하기에 적합한 객체를 선택해야 한다.

 

이 과정을 What/Who 사이클 이라고 한다. 어떤 행위(what)를 수행한 후 누가(who)를 결정해야 한다는것이다. 수신 가능한 메시지가 모이다보면 객체의 인터페이스를 구성하게 된다.


- 묻지말고 시켜라

What/Who 사이클은 어떤 객체가 필요한지보다 어떤 메시지가 필요한지를 먼저 고민하는것이다. 만약 어떤 객체가 필요하다는것을 먼저 생각하면 메시지 송신자는 수신자에 대해서 많은 것을 알게 된다. 수신자의 속성과 행위에 대해 파악한 후 메시지를 전송하는 로직이 구현되는것이다. 수신자에 대해 많이 알고 있다는것은 캡슐화가 저해되었음을 의미한다. 송신자는 수신자에게 너무 많은것을 묻지 말아야 한다.


- 다형성

메시지를 전송하는 송신자가 객체에 대해 먼저 생각한다는 것은 해당 객체의 타입도 먼저 식별할 수 있다는 얘기가 된다. 어떤 협력안에서 메시지 수신자는 해당 메시지를 이해하고 적절한 응답을 할 수 있다면 누구든지 상관없어야 한다. 그래서 역할의 대체 가능성에 대해 언급했었다. 

 

메시지의 수신자가 누구인지 즉 객체의 타입을 먼저 생각하면 안된다. 객체의 타입은 어떤것이라도 상관이 없으며 메시지를 이해하는 객체라면 메시지를 주고받을 수 있어야 한다. 이렇게 객체의 타입에 상관없이 메시지를 보낼 수 있다면 다형성이라는 특성을 저절로 따라올것이다.

댓글