본문 바로가기
Develop/Design

객체지향 설계 - 책임, 역할, 협력

by 코딩의성지 2022. 9. 6.

개발 관련 일을 한지 5년정도 되다보니, 이제는 구현뿐만 아니라 설계적인 능력도 중요하게 되었다.

요즘 하나의 기능을 추가해도 깔끔하게 설계를 한 뒤에 프로그래밍하는 것이 습관이 되었다.

 

오늘은 객체지향 설계의 가장 중요한 요소인 책임, 역할, 협력의 관점에서 어떻게 설계를 해야할 지를 풀어나가 볼 예정이다.

 

대학생 때, 교수님 한분이 그런 말씀을 하셨다.

 

"객체지향은 실세계를 모방하여 구현하는 것이 아니라 새로운 세계를 창조하는 것이다."

 

예전에 이말이 참 이해가 안되었는데, 실무를 경험하다 보니 조금은 이해가 된다.

객체지향은 말그대로 실세계를 조금 참고하여, 새로운 세계를 만들어내는 것이다. 우리는 실세계의 다양한 부분을 통해 객체지향의 기본 사상을 이해하고 학습한다.

 

객체지향 세계에서 모든 일은 역할, 책임, 협력이 조화를 이루며 일어난다.

 

객체지향 세계에서 각 객체는 문제해결을 위해 다른 객체에게 도움을 요청(request) 한다. 요청 을 받은 객체는 그 문제를 직접 해결하기도 하고, 또 다른 객체에게 새로운 요청을 하기도 한다. 문제 해결이 될때까지 요청은 연쇄적으로 일어난다.

요청을 받은 객체는 해당 요청에 대한 책임을 다한다. 문재해결을 위해 자신이 아는 지식과 서비스를 총동원하여 요청에 응답(response)한다. 응답은 요청 방향의 역순으로 연쇄적으로 전달 된다.

 

요청에 대해 응답하는 것, 이것을 책임이라 하는데 여러가지 책임이 모여 하나의 역할을 만든다.

예를 들어 선생님은 수업을 진행할 책임이 있는 동시에 학생의 안전을 지킬 책임이 있다. 이렇게 여러 책임이 모여 선생님이라는 역할을 만든다. 학생은 학교에 출석할 책임이 있고, 수업에 열심히 참여할 책임이 있다. 마찬가지로 이런 여러가지 책임이 모여서 학생이라는 역할이 만들어진다.

(무조건 역할이 여러가지 책임을 가진다는 뜻은 아니다. 상황에 따라 하나의 책임만을 가진 역할도 있다.)

 

객체지향 세계에서는 각 역할들이 서로서로 연쇄적인 요청과 응답을 통해 특정한 목표를 이뤄내며 완전한 협력 관계를 달성한다. 올바른 객체지향 프로그램을 구현하기 위해서는 하나의 객체가 너무 많은 책임을 수행하게 해서는 안된다. 객체가 적극적으로 다른 객체에게 협력을 요청할 때 진정한 객체지향 세계가 구현된다. 다른 객체와 협력 없이 모든 것을 수행하는 객체 (흔히 갓 클래스 객체라 부른다.) 를 만들어내는 실수를 하지 말자. 너무 많은 책임을 가진 객체는 프로그램의 복잡도를 높이는 요인이 된다.

 

또한 하나의 객체는 여러가지 역할을 수행할 수 있다. 학교에서는 선생님이지만 퇴근하고 집으로 돌아가서는 주부의 역할을 할 수도 있다. 마찬가지로 학생도 학교를 나와서는 학원의 수강생 역할을 수행할 수 있다.

 

그리고 역할은 여러 객체들에 의해 대체가능하다. 예를 들어 학원 선생님이든 학교 선생님이든 상관없이 수업 진행이라는 책임을 수행할 수 있다. 1학년 2반 학생이든 3학년 5반 학생이든 상관 없이 수업에 참여하는 책임을 수행할 수 있다.

요청한 객체 입장에서는 어떤식으로든 요청이 수행되기만 하면 아무 상관이 없다.

 

그리고 요청을 받는 객체 입장에서는 자율적으로 책임 수행 방법을 선택할 수 있다.

학원 선생님은 칠판에 열심히 필기하며 수업을 진행할 수도 있고, 학교 선생님은 토론 수업으로 수업을 진행할 수도 있다. 이렇게 같은 요청에도 다른 방법으로 응답하는 것을 객체지향 세계에선 다형성 이라 부른다. 객체가 자율적으로 방법을 선택할 때 외부의 간섭을 전혀 받지 않도록 해야한다. 외부에서는 단지 해당 객체가 무엇인지만 알면되지 어떻게 수행하는지는 전혀 몰라도 된다. 다시 말해 객체는 상태와 행위를 외부에 노출하지 않는다. 이러한 특성을 객체지향 에서는 캡슐화 라 부른다.

 

위에서 말한 내용으로 비추어 볼때, 객체는 협력적인 존재인 동시에 자율적인 존재로 보인다. 객체는 다른 객체의 요청에 응답할 책임이 있는 협력적인 존재이자, 각 요청에 대한 응답을 자유롭게 선택할 수 있는 자율적인 존재이다.

 

지금 까지 말했던 내용을 바타응로 객체지향 용어를 정의해보자. 객체지향에서는 선생님이나 학생을 객체라고 한다. 그리고 각각의 객체가 한 요청 (수업하라) 을 메시지라 부른다. 마지막으로 책임을 수행하는 방법(칠판 수업, 토론 수업 등)을 메서드 라 부른다. 

 

객체지향 세계에서 협력은 프로그램의 기능을 구현하기 위해 이루어진다. 객체지향 프로그램에서는 책임을 수행할 메서드를 컴파일 타임이 아닌 런타임 때 결정한다. 이는 객체의 자율성을 지키는 객체지향 언어의 가장 큰 특징 중 하나이다.

 

최적의 설계를 위해 적절한 객체에게 적절한 책임을 할당하기 위해 노력하자. 이는 객체지향 프로그램의 품질을 결정하는 아주 중요한 요소가 될것이다.

 

 

반응형

댓글