이 개념에 대해 공부한 적이 있는 사람이라면 일반적으로 응집도는 높게, 결합도는 낮게(high cohesion loose coupling) 로 외우고 있을 것이다. 그렇다면 응집도와 결합도가 무엇이고 왜 "high cohesion loose coupling" 이어야 하는지를 이번 기회에 확실하게 정리 해 보도록 하겠다.
모듈(Module)
응집도와 결합도는 프로그램의 모듈과 모듈간의 관의 관계에 대한 개념이다. 따라서 프로그램에 있어서 모듈의 개념을 이해하는 것이 먼저이다.
모듈은 프로그램에서 하나의 기능을 수행하는 단위이다.
나는 주로 프로그래밍 관련 용어들을 레고에 빗대어 이해하곤 한다. 프로그램 코드 한 줄 한 줄이 레고 블럭 하나라면, 모듈은 그 블럭들을 조립하여 만든 하나의 '기능'을 수행하는 덩어리라고 할 수 있다. 이러한 모듈들이 합쳐져서 하나의 큰 레고 작품이 탄생하는 것이다.
즉 프로그램의 기능을 독립적인 부품으로 분리한 것이 모듈이라고 할 수 있다. 프로그램을 짤 때 모듈화 한다는 것은, 작은 기능 단위들을 모듈화하여 유지 보수와 타 프로그램에서의 코드 재사용을 손쉽게 하고자 하는 것을 의미한다.
응집도(Cohesion)
응집도는 한 모듈 내에 존재하는 함수, 데이터 등의 구성 요소들 사이의 밀접한 정도를 나타낸다. 응집도가 높은 모듈은 하나의 모듈 안에 필요한 함수나 데이터와 같은 구성 요소들이 똘똘 뭉쳐서 존재한다. 반대로 응집도가 낮은 모듈은 모듈 내부에 서로 관련 없는 함수나 데이터들이 존재하거나 관련성이 적은 여러 기능들이 하나의 모듈 안에 있게된다. 가끔 초보 개발자들의 코드를 리뷰하다 보면 하나의 클래스 안에 수천 라인의 온갖 기능들을 때려 넣어서 작성되어 있는 것을 볼 수 있는데, 이는 그 모듈의 정체성이 없으며 응집도가 매우 낮다고 볼 수 있다. 응집도가 가장 높은 모듈은 하나의 모듈이 단일 기능 하나만을 담당하게끔 구성되어 있는 경우이다.
응집도는 정보 은닉과도 관계가 있으며, 응집도가 높은 모듈은 프로그램 전체에서 담당하는 기능을 수행하는 것에 있어서는 다른 모듈과의 상호작용이 거의 없이도 단일 기능을 수행할 수 있게된다.
응집도는 기능적, 순차적, 교환적, 절차적, 시간적, 논리적, 우연적 응집도의 척도로 나타낼 수 있으며, 이에 따라서 모듈의 품질을 측정할 수 있게 된다. 기능적 응집도 쪽으로 갈 수록 좋은 품질이라고 할 수 있으며 우연적 응집도로 갈수록 나쁜 품질이라고 할 수 있다.
결합도(Coupling)
결합도는 하나의 모듈이 다른 모듈에 의존하는 정도를 나타낸다. 결합도를 의존도라고 부르기도 한다.
완제품 자동차 하나에는 여러 개의 모듈들(핸들, 엔진, 배터리 등)이 들어 있는 것처럼 하나의 프로그램에는 많은 모듈들이 존재한다. 결합도는 이렇게 하나의 프로그램 안에서 각 모듈들이 서로 관련되어 의존하고 있는 정도를 뜻한다.
각 모듈이 서로 관련성이 적어 결합도가 낮을수록 모듈간의 독립성이 높아진다. 독립성이 높은 모듈은 서로의 기능에 영향을 미치지 않고 데이터만을 주고받는다. 때문에 전체 프로그램에서 일부 기능을 수정해야 할 때 그 기능을 담당하는 모듈만을 교체하면 되기 때문에 유지보수가 손쉽다. 자동차의 예에서 핸들을 교체하는데 엔진의 일부분이 관계가 있어서 엔진까지 같이 손봐야 한다면 이는 결합도가 높은 상태인 것이다. 결합도가 낮아 모듈간의 독립성이 높아지게끔 설계 하는 것이 좋은 설계라고 할 수 있을 것이다.
반대로 모듈간의 결합도가 높은 프로그램은 모듈이 기능을 수행하는 것에 여러 모듈들이 연관되어 있기 때문에 기능의 수정이 매우 어렵게 된다. 결합도는 자료, 스탬프, 제어, 외부, 공통, 내용 결합도의 척도로 나타낼 수 있다. 각 모듈들이 파라미터 등을 통해 데이터만 주고받는 자료 결합도가 가장 낮은 결합도이며 품질이 좋다고 할 수 있다. 한 모듈이 다른 모듈의 내부 동작에 관여하는 내부 결합도는 한 모듈이 일부 기능을 변경할 경우 다른 모듈의 변경이 필요하게 되어 결합도가 높으며 품질이 나쁘다고 할 수 있다.
high cohesion and loose coupling
응집도는 높을수록 좋고 결합도는 낮을 수록 좋다는 "high cohesion loose coupling" 원칙이 항상 유효한 것은 아니다. 프로그램의 특성이나 상황에 따라 유연하게 적용해야 할 것이다. 하지만 시스템 유지보수 측면에 있어서 모듈의 응집도는 높을수록, 결합도는 낮을 수록 유리한 것은 분명하다. 프로그래밍을 배울 때 가장 먼저 배우게 되는 개념 중 하나지만 실제로 개발할 때 이를 염두하지 않고 코딩하는 사람들이 많다. 자신이 개발을 할 때는 이 중요성에 대해 잘 모를 것이다. 하지만 남이 개발해놓은 엉망진창인 코드를 유지보수 해야할 때 비로소 체감하게 되는 것이 응집도와 결합도에 대한 것이다.
여러가지 유명한 디자인 패턴들이 응집도를 높히고 결합도를 낮추기 위한 원칙으로 개발되어 있다. 이러한 디자인 패턴을 원칙을 잘 지키면 일단 기본적으로 따르게 될 개념일 것이다. 하지만 개발자 스스로도 개발을 할 때 마음속에 "high cohesion loose coupling"을 신경 쓴다면 전체 프로그램의 코드 자체가 깔끔해 지고, 훌륭한 설계와 프로그램이 만들어질 것이다.