본문 바로가기
IT/아키텍처

결합도(Coupling)과 응집도(Cohesion)

by ^&**&^ 2022. 7. 13.
반응형

오늘은 결합도와 응집도를 알아보겠습니다. 결합도와 응집도는 모듈 또는 객체의 독립성을 나타내는 두 가지 지표입니다. 

1. 결합도는 모듈 또는 객체 간에 서로 의존관계(종속성이라 표현해도 좋을 듯합니다) 정도를 나타냅니다. 
2. 응집도는 모듈 또는 객체 내부 코드 간의 관계를 나타냅니다.

 

결합도(Coupling)

 

결합도를 설명하기 가장 적절한 비유로 데이터베이스 설계를 들 수 있습니다. 


데이터베이스의 테이블을 설계할 때 1:N 관계를 유지해야 하고 M:N 관계를 지양해야 하는 것처럼 결합도는 종속 관계를 단순하게 가져가는 것이 좋다는 것을 말합니다. 

결합도가 높은 것은 변경이 어려운 코드이고, 낮은 코도는 변경이 쉬은 코드입니다. 키보드의 자판 하나가 고장 나도 키보는 전체를 바꿔야 한다면 실로 엄청난 손해인 거죠. 

결합도를 낮게 유지하는 방법은 데이터만을 전달하는 관계로 설계하는 것이고 대표적인 방법이 인터페이스를 사용하는 방법입니다. 

결합도를 구분하는 기준은 아래 순서와 같습니다. 



자료(Data) > 스탬프(Stamp) > 제어(Control) > 외부(External) > 공통(common) > 내용(Content)

 


오른쪽으로 갈수록 결합도는 높아집니다. 

결합도 자체가 아예 없을 수는 없습니다. 다만 결합도를 낮추게 객체를 설계하는 것이지요. 

 

결합도 설계 시 주의사항

 

결합도를 고려해서 객체를 설계할 때 가장 피해야 할 관계가 내용 결합도와 공통 결합도입니다. 

내용 결합은 다른 객체의 변수를 직접 사용하여 현재 객체의 행위에 영향을 주는 경우입니다. 
공통 결합은 전역 변수를 통해 서로 간의 참조를 말합니다. 

프로그램의 큰 틀을 만들 때 종종 사용하는 결합도입니다. 즉, 메인 프레임처럼 다른 객체를 읽어 동적으로 화면을 구성하거나 할 때 내용 결합도와 공통 결합도는 가장 직접적이고 편리하게 사용할 수 있는 결합도입니다. 


전역 설정을 읽어 화면을 표시하거나, 전후 메뉴를 탐색하거나 쉽게 사용할 수 있죠. 

이럴 때 인터페이스 사용을 고려해 보면 좋습니다. 

 

나머지 결합도 설명

 

자료 결합(Data Coupling)


두 개 이상의 객체가 매개 변수에 의해 결합 관계를 가지는 경우입니다. 객체 메서드에 파라미터를 전달해 수행되는 관계입니다. 

 

스탬프 결합(Stamp Coupling)


자료 결합에서 일부 매개 변수가 사용되지 않는 경우입니다. 자료 결합으로 설계했는데 일부 경우에서는 파라미터가 누락되는 경우입니다. 


제어 결합(Control Coupling)


커맨드 패턴이 대표적으로 제어 이동이 발생하는 경우입니다. 현재의 객체에서 다른 객체로 제어가 이동되었다가 돌아오는 경우입니다. 


외부 결합(External Coupling)


다른 객체에서 반환된 값을 참조해서 사용하는 경우입니다. 순차적인 수행인 경우도 포함됩니다. 


응집도(Cohesion)


응집도는 '하나의 객체가 하나의 기능을 온전히 순도 높게 담당하고 있는 정도'를 나타냅니다. 

가장 좋은 응집도는 응집도가 높다고 표현하며 기능적 응집 상태를 말합니다. 
기능적(Functional) 응집도는 하나의 객체가 딱 하나의 기능만 충실하게 수행하는 경우입니다. 

응집도를 구분하는 기준은 아래 순서와 같습니다. 


기능적(Functional) > 순차적(Sequential) > 교환적(Communicational) > 절차적(Procedural) > 시간적(Temporal) > 논리적(Logical) > 우연적(Coincidental)


오른쪽으로 갈수록 응집도는 낮아집니다. 


응집도 설계 시 주의사항

 

응집도도 가장 높은 응집도로만 객체 설계가 이루어지면 정말 좋겠지만 불가능한 얘기입니다. 

객체를 설계할 때 좀 더 높은 응집도를 가지게 설계하는 것이 최선이며 다른 방법은 없습니다. 

 

 

나머지 응집도 설명

 

순차적(Sequential) 응집

 

메서드의  결과가 다음 메서드의 입력으로 사용되는 관계를 말합니다.(파이프라인)

 

교환적(Communicational) 응집

 

팩토리 클래스와 같이 동일한 입력과 출력 자료를 제공하는 메서드들의 집합을 말합니다. 
동일한 입력 출력을 사용하여 다른 기능을 수행하는 활동들이 모여 있는 경우입니다. 

 

절차적(Procedural) 응집

 

순서적으로 처리되어야 하는 메서드들이 순서대로 정렬되어 있는 응집 관계입니다. 
하나의 임무를 수행하기 위해 메서드들이 순차적으로 실행되는 경우입니다. 

 

시간적(Temporal) 응집

 

시간의 흐름에 따라 작업 순서가 정렬되는 관계입니다. 
특정 시간이 처리되어야 하는 활동을 한 모듈에서 처리하는 경우입니다. 

 

논리적(Logical) 응집

 

유사한 성격의 객체들이 모여 잇는 경우이며, java.io 클래스들의 경우가 대표적인 예입니다. 

 

우연적(Coincidental) 응집

 

각 객체 간의 연관성이 없는 경우입니다. 
서로 간의 어떠한 의미 있는 연관 관계도 없는 기능 요소로 구성되는 경우인데 요런 관계는 찾기는 쉽지 않겠네요. 

마무리

 

결합도와 응집도는 정도의 차이로 구분됩니다. 좋은 코드는 항상 낮은 결합도와 높은 응집도를 가진다고 정의하지만

모든 애플리케이션은 다양한 결합도와 응집도를 가질 수밖에 없습니다. 따라서 이것을 너무 신경 쓸 필요는 없다는 말입니다. 

생산성 측면에서도 설계에 결합도와 응집도를 반영하는 것 자체가 좋지 않습니다. 

결합도와 응집도는 리팩터링(Refactoring)을 수행하면서 조정하는 것이 좋다고 생각합니다. 

 

반응형

댓글