[객체지향의 사실과 오해] 05. 책임과 메시지

주영진·2024년 7월 28일

명확한 책임의 부여

1964년 달리와 라타네는 실험 참가자들의 반응과 집단 크기 사이에 밀접한 관계가 있음을 발견해내는 '책임감 분산' 실험을 실행하고, '사건에 대한 목격자가 많으면 많을수록 개인이 느끼는 책임감은 적어진다' 라는 결론을 내릴 수 있는 실험을 시행하였다.

이 실험은 우리에게 명확한 책임과 역할을 부여해야 사람들이 협력에 참여한다라는 사실을 시사한다. 이는 객체들이 협력하는 세계에도 똑같이 대응시킬 수 있는 교훈이다. 객체의 세계에서도 명확하게 정의된 역할과 책임을 객체들에게 부여해야 객체들이 원활한 상호협력을 이루어낼 수 있다.

'자율적인' 책임의 중요성

객체에게 '자율성'을 부여하는 것은 훌륭한 객체지향 설계를 위해 매우 중요한 포인트이다. 자율적인 객체란, 스스로 정한 원칙에 따라 판단하고 스스로의 의지를 기반으로 행동하는 객체이다.

객체가 책임을 자율적으로 수행하기 위해서는 객체에게 할당되는 책임이 자율적이어야 한다. 예를 들어, 책에서 계속 예시로 드는 앨리스의 이야기에서, 모자 장수는 왕으로부터 증언하라는 요청을 받는다. 이 상황에서 모자 장수는 증언 방식이나 증언에 필요한 자료는 스스로의 의지와 판단에 따라 자유롭게 선택할 수 있다. 그 이유는 왕의 입장에서 모자 장수가 어떤 방법으로 증언하는지는 중요하지 않기 때문이다. 왕은 그저 어떤 방식이든 증언을 하라는 요청만 잘 수행하게 하면 된다.

이 그림은 왕이 모자 장수의 자유의 범위를 지나치게 제한하는 상황을 나타낸다. 이는 증언의 방식을 구체적으로 지시하기 때문에 모자 장수의 입장에서는 증언을 하기 위한 최선의 방법을 활용할 수 없어, 지시를 이행함에 있어 효율성이 떨어질 수 있다. 그렇기에 적당히 포괄적이고 추상적인 책임을 부여하는 것이 바람직하다.

'어떻게(How)'가 아니라 '무엇을(What)'

자율적인 책임을 부여하기 위해서는 어떻게가 아니라 '무엇을' 해야하는 가를 지시해야 한다. 왕이 모자 장수에게 '무엇을' 하라고 지시하지, 방식까지는 지정해주지 않는 것이 모자 장수 증언의 효율성을 높인다.

객체간의 유일한 접근 방법, 메시지

하나의 객체는 메시지를 전송함으로써 다른 객체에 접근한다. 왕이 모자 장수에게 '증언하라'는 메시지를 보내는 상황에서 '증언하라' 라는 부분은 메시지 이름에 해당하고, 추가적으로 인자(argument)를 통해 추가정보를 제공할 수 있다. 또, 수신자를 추가해 최종적으로는 메시지는 수신자, 메시지 이름, 인자의 조합으로 구성된다. 예를 들면, 모자장수.증언하라(어제,왕국) 과 같은 형태로 메시지를 구성할 수 있다.

메시지의 모양은 객체가 수행할 책임의 모양을 결정한다. 수신자는 메시지를 처리하는 방법을 자율적으로 선택할 수 있다. 송신자는 수신자가 어떤 방식으로 메시지를 처리하는지는 절대 알 수 있는 방법이 없다. 메시지를 처리하기 위해 책임을 수행하는 방법은 객체 자신의 사적인 영역이다.

이와 같은 상황에서 메시지를 처리하기 위해 내부적으로 선택하는 방법을 '메서드'라고 한다. 객체지향 프로그래밍 언어에서 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.

다형성

다형성이란 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미한다. 즉, 서로 다른 객체가 같은 메시를 수신했을 때 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘을 말한다. 앨리스의 이야기에서 서로 다른 등장인물들에게 동일하게 '증언하라'는 명을 내렸을 때, 각자 다른 방식을 활용해 증언을 해도, 왕의 입장에서는 이들 모두 같은 증언을 하고 있다. 이것이 바로 다형성이다.

이러한 다형성은 객체들의 '대체 가능성'을 이용해 설계를 유연하고 재사용 가능하게 만든다. 유연하고 재사용성이 높은 협력이란, 송신자가 수신자에 관해 매우 적은 정보만 알고 있더라도 상호 협력이 가능하다는 것이다. 이는 협력을 유연하게 만들며, 협력이 수행되는 방식을 확장시키고, 협력이 수행되는 방식을 재사용 할 수 있게 한다.

객체지향의 핵심, 메시지

객체지향 설계에서 흔히 할 수 있는 오해 중에 메시지가 아닌 클래스에 중심을 맞추는 것이 있다. 객체지향의 강력함은 클래스가 아닌 객체들이 주고받는 메시지로부터 나온다. 클래스는 단지 객체들의 특성과 행위를 정적인 텍스트로 표현하기 위해 사용할 수 있는 추상화 도구일 뿐이다.

책임-주도 설계에서도 메시지가 중심이 된다. 객체가 책임을 완수하기 위해 다른 객체의 도움이 필요하다고 판단되면 도움을 요청하기 위해 먼저 어떤 메시지가 필요할지 결정한다. 그리고 메시지를 수신하기 위해 적합한 객체를 선택한다. 여기서의 핵심은 'What-Who' 사이클이다. 어떤 행위를 수행할 것인지 결정한 후에, 누가 그 행위를 수행할 것인지 결정해야 한다는 의미인데, 좋은 객체지향 설계를 위해 이 사이클은 굉장히 중요하다.

인터페이스(Interface)

인터페이스의 사전적 정의는, 어떤 두 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있게 이어주는 방법이나 장치를 의미한다. 스마트폰, 리모컨, 엘레이베이터의 버튼, GUI 다 사람과 기계 사이의 상호작용을 이어주는 장치이다. 인터페이스는 다음과 같은 세 가지 특징을 지닌다.

  1. 사용법을 익히기만 하면 내부 구조나 동작 방식을 몰라도 쉽게 대상을 조작하거나 의사를 전달할 수 있다.
  2. 단순히 내부 구성이나 작동 방식을 변경하는 것은 인터페이스 사용자에게 어떤 영향도 미치지 않는다.
  3. 대상이 변경되더라도 동일한 인터페이스를 제공하기만 하면 아무런 문제 없이 상호작용 할 수 있다.

이 세 가지 특징은 객체지향 세계에서의 객체에도 똑같이 적용할 수 있는 특징이다.

인터페이스와 구현의 분리

좋은 객체지향 설계를 위해서는 인터페이스와 관련된 다음의 세 가지 규칙이 제안된다.

  • 좀 더 추상적인 인터페이스
  • 최소 인터페이스
  • 인터페이스와 구현 간에 차이가 있다는 점을 인식

추상적인 인터페이스란, 앞서 말했듯 객체의 자율성을 저해하지 않는 선에서 적당히 추상적이고 포괄적인 인터페이스를 설계해야 한다는 의미이다.

최소 인터페이스는 외부에서 사용할 필요가 없는 인터페이스는 최대한 노출하지 말라는 뜻이다.

객체지향의 세계에서 내부 구조와 작동 방식을 가리키는 용어를 '구현(implementation)'이라고 한다. 메소드가 외부에 노출되는 공용 인터페이스의 일부가 아니기에 메서드를 구성하는 코드 자체는 객체의 구현 부분에 포함된다. 객체의 외부와 내부를 분리하라는 것은 객체의 공용 인터페이스와 구현을 명확하게 분리하라는 말과 동일하다.

구현 부분을 내부로 감춤으로서 변경해도 무방한 안전지대와 변경했을 경우 외부에 영향을 미치는 위험 지대를 구분함으로서, 객체의 자율성을 극대화 할 수 있다.

캡슐화

구현을 내부로 감추는 것을 '캡슐화'라고 한다. 이는 외부에서 접근해야만 하는 행위를 골라 공용 인터페이스로 노출하고, 그 외의 사적인 데이터는 틀 안으로 묶어 보호하는 것을 의미하며, 결국 이것은 객체의 내부와 외부를 엄격하게 구분함으로써 객체를 자율적인 존재로서 있을 수 있게 한다.

협력의 품질을 결정하는 책임의 자율성

객체의 책임이 자율적일수록 협력이 이해하기 쉬워지고, 유연하게 변경할 수 있게 된다. 자율적인 책임은 의도를 명확하게 표현함으로써 협력을 단순하고 이해하기 쉽게 만든다. 즉, 책임이 적절하게 추상화되는 것이 바람직한 객체지향 설계를 만든다.

객체가 수행하는 책임들이 자율적이면 자율적일수록 객체의 존재 이유를 명확하게 표현할 수 있다. 책임이 자율적일수록 객체의 응집도를 높은 상태로 유지하기 쉬워진다.

정리하자면, 책임이 자율적일수록, '추상화'되며, '응집도'가 높아지고, '결합도'는 낮아지며, '캡슐화'가 증진되고, '인터페이스와 구현이 명확히 분리'되며, 설계의 유연성과 재사용성이 향상된다.

profile
'개발사(社)' (주)영진

0개의 댓글