본문 바로가기
Develop/Design

협력, 역할, 책임의 관점에서 바라본 객체지향 세계

by 코딩의성지 2022. 10. 10.

객체지향 개발을 하는 사람이라면 누구나 이해해야할 개념이 있다.

바로 협력,역할,책임이다. 오늘은 협력, 역할, 책임의 관점에서 객체지향을 어떻게 잘 설계할 수 있을지를 글로 작성해보려 한다.

 

협력

 

개체지향 세계는 동일한 목적을 달성하기 위해 객체끼리 서로 협력하는 세상이다. 여기서 나오는 협력이라는 단어는 객체지향 설계를 논할때 가장 중요한 요소 중 하나이다. 협력은 여러가지의 요청과 응답에 의해 이루어진다. 여기서 각 요청과 응답은 서로 연결된 채 유지된다. 즉 , 서로 관계를 맺는다는 얘기다. 요청과 응답은 서로 관계를 맺으며 객체가 수행할 책임을 명확하게 만든다. 어떤 대상에 대해 어떠한 요청을 한다면 요청을 받은 대상은 해당 요청을 처리할 책임이 주어진다.

 

이렇게 객체가 다른 객체에게 책임을 수행하도록 요청하는 행위를 객체지향 세계에서는 메시지 전송이라고 부른다. 협력을 요청하기 위해 메시지를 보내는 객체를 송신자 객체라 칭하고, 메시지를 받아 처리하는 객체를 수신자 객체라 한다. 송신자 객체는 메시지를 전송하고 수신자 객체는 메시지에 대한 적절한 책임을 수행한다. 즉 메시지를 기반으로 송신자와 쉰자가 서로 상호협력을 진행하게 된다.

 

책임

 

협력과 마찬가지로 책임 역시 객체지향 설계에서 가장 중요한 요소 중 하나이다. 

 

보통 객체지향 세계에서 책임은 두가지 종류로 구분된다.

 

첫째, 하는 것(Doing) 이다.

객체를 생성하거나 계산하는 등 스스로 하는 행위,

다른 객체가 특정한 행동을 하도록 시키는 행위,

다른 객체의 활동을 제어하고 조절하는 행위 등을 의미한다.

 

두번째, 아는 것(Konwing) 이다.

개인적인 정보에 대해 아는 것,

관련된 객체에 관해 아는 것,

자신이 유도하거나 계산할 수 있는 것에 관해 아는 것 등을 의미한다.

 

책임을 간단하게 요약해보자면,

책임은 외부에 정보를 제공하거나 (Knowing) 외부에 서비스를 제공하는 것(Doing)을 모아 놓고 공용 인터페이스 (Public Interface) 로 제공하는 것이다.

 

여기서 책임을 메시지 그 자체로 인식하기 쉬운데, 책임이 곧 메시지가 되지 않는다. 하나의 책임이 하나의 메시지로 구분되기도 하지만 보통은 하나의 책임이 여러 메시지로 분리가 된다. 하지만 설계를 하는 초반에는 세부적으로 메시지를 나눌 필요는 전혀 없다. (전체적인 설계 뒤에 세부적인 구현이나 설계하는 단계에서 메시지는 자연스럽게 추가된다.)

설계를 시작하는 초반에는 어떤 시스템이 어떤 책임을 수행하고 협력하는지만 알아도 충분하다. 예를 들어 시스템 단위의 시퀀스를 먼저 그려본 뒤, 추후에 객체 간 상세한 시퀀스 다이어그램을 그려보는 것도 하나의 방법이 될 수 있다. 이를 통해 대략적인 윤곽을 그리는 것이다.

 

역할

 

책임이 모여 역할을 이룬다. 역할은 여러객체가 대신할 수 있음을 주의하라. 역할 내의 책임만 적절히 수행할 수 있다면 어떠한 객체라도 생관이 없다.

 

예를 들어 설명해보겠다.

 

선생님이라는 역할은 수업이라는 책임과 학생관리라는 책임을 수행해야 한다. 수학 선생님도 이 역할을, 음악 선생님도 이 역할을 수행할 수 있다. 역할을 대체할 수 있는 객체는 책임, 즉 동일한 메세지를 수행할 수 있어야한다는 뜻이다.

 

역할을 잘 정의하면 재사용성이 높아지고, 설계가 단순해지고 유연해진다. 객체를 추상화하는 방식으로 범용적인 역할을 정의하고, 협력을 추상화하면 더욱 이해하기 쉽고 단순한 객체지향 설계가 그려진다. 이는 개발 단계에서 큰 힘을 발휘할 것이다.

 

수학 선생님- 3학년 2반 학생 - 3학년 2반 교실,

음악 선생님 - 2학년 1반 학생 - 음악실 이라는 각각의 역할이 선생님-학생의 관계에서 이루어지는 수업이라는 협력을 추상화한다. 선생님, 학생, 수업 공간(교실) 이라는 역할을 할 수 만 있다면 어떤 객체든 대체가 가능하다는 것이다.

 

여기서 중요한 포인트는 설계를 진행할 때 , 객체의 행동을 중심으로 설계하지 않으면 목적에 맞지 않는 잘못된 객체가 만들어진다. 

 

예를 들어 학생, 선생님이라는 역할을 설계할 때 ,

학생은 몇 학년이고, 이름은 뭐고, 교복을 입었고, 가방을가지고 있고...

선생님은 분필을 가지고 있고, 출석부가 있고, 과목은 무엇이고 ... 등 데이터나 클래스를 중심으로 객체를 바라보고 설계하면, 목적에 부합하지 않는 객체가 탄생할 수 있다.

잘못된 설계 - 데이터 중심의 설계

 

반대로 수업하라, 수업에 참여하라 등 행동을 중심으로 객체를 설계하면 객체지향의 품질은 매우 높아지게 된다. 즉, 시스템의 목적에 맞는 객체가 탄생한다는 말이다.

올바른 설계 - 행동 중심의 설계

 

협력이 어떻게 설계되는지에 따라 객체지향의 퀄리티는 달라진다. 이를 위해 우리는 올바른 협력을 결정해야만한다. 올바른 협력은 메시지 간의 주고받는 요청과 응답, 즉 여러가지 책임을 결정하고나면 필요한 데이터나 클래스는 자연스럽게 눈에 보이게 될 것이다.

 

협력 , 역할 , 책임의 관점에서 바라본 객체지향 설계

 

협력을 정의하여 전체적인 윤곽을 잡고, 협력에 필요한 역할과 책임을 설계한 뒤, 그 책임을 수행할 객체에 책임을 할당하고, 해당 객체들이 외부에 제공할 행동을 정의하고난 뒤 마지막으로 필요로 하는 데이터를 정의하면 깔끔한 객체지향 설계를 해낼 수 있을 것이다.

 

조금 더 구체적으로 객체지향 설계를 하는 방법을 알아보자.

 

1. 시스템이 사용자에게 제공해야하는 기능을 파악한다. 즉 시스템의 책임을 파악한다.
2. 분할이 필요한 시스템 책임을 더 작은 책임의 단위로 분할한다.
3. 분할된 책임을 수행할 수 있는 적당한 객체나 역할을 찾아 해당 책임을 할당한다.
4. 객체가 책임을 수행할 때 다른 객체에 도움을 요청할 수 있다. 이 요청을 수행할 객체나 역할을 찾는다.
5. 찾은 객체나 역할에 책임을 할당하고 두 객체를 같은 협력안에 넣는다.
6. 1~5 의 과정을 반복하여 하나의 협력을 만든다.

 

여기서 가장 중요한 것은 자율적이면서도 상호 협력적인 객체를 만들어 내는 것이다.

 

반응형

댓글