본문 바로가기
카테고리 없음

응집도 결합도

by 구루마3단 2025. 3. 13.

모듈의 응집도와 결합도에 대해 설명
**응집도 (Cohesion)**는 모듈 내부의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타내는 정도입니다. 즉, 하나의 모듈이 얼마나 '책임'을 완수하기 위해 뭉쳐있는가를 의미합니다. 응집도가 높을수록 모듈은 하나의 명확한 목적을 수행하는 데 집중하게 되며, 유지보수 및 재사용성이 향상됩니다.
좋은 응집도는 높은 수준의 응집도를 의미하며, 이는 모듈이 **단일 책임 원칙 (Single Responsibility Principle)**을 잘 따르고 있다는 것을 나타냅니다.
응집도는 다음과 같은 단계로 분류할 수 있으며, 아래로 갈수록 응집도가 낮아집니다.
* 기능적 응집도 (Functional Cohesion):  가장 높은 수준의 응집도입니다. 모듈 내의 모든 요소가 단 하나의 기능을 수행하기 위해 필수적으로 관련되어 있을 때 기능적 응집도를 갖습니다. 이상적인 응집도이며, 모듈은 명확하고 예측 가능하며 재사용성이 높습니다.
   * 예시: "로그인 처리 모듈", "이메일 전송 모듈", "데이터베이스 연결 모듈"  처럼, 모듈 자체가 하나의 명확한 기능을 수행합니다. 내부 요소들은 모두 이 기능을 완성하기 위해 협력합니다.
* 순차적 응집도 (Sequential Cohesion): 모듈 내의 요소들이 순차적인 데이터 흐름에 따라 연결되어 있을 때 순차적 응집도를 갖습니다. 한 요소의 출력이 다음 요소의 입력으로 사용되는 형태로, 요소들이 특정 순서대로 처리되어야 합니다.
   * 예시: "주문 처리 모듈"에서 "재고 확인 -> 결제 처리 -> 배송 정보 생성" 과 같이, 각 단계가 순차적으로 연결되어 데이터를 처리합니다.
* 통신적 응집도 (Communicational Cohesion): 모듈 내의 요소들이 동일한 입력 데이터 또는 동일한 출력 데이터를 사용하여 서로 관련되어 있을 때 통신적 응집도를 갖습니다. 즉, 데이터 흐름은 순차적이지 않지만, 동일한 데이터를 공유하며 상호작용합니다.
   * 예시: "회원 정보 관리 모듈"에서 "회원 정보 조회", "회원 정보 수정", "회원 정보 삭제" 기능들이 모두 회원 정보 데이터베이스를 공유하고 접근합니다.
* 절차적 응집도 (Procedural Cohesion): 모듈 내의 요소들이 특정 순서대로 실행되어야 하지만, 기능적으로 밀접하게 관련되어 있지는 않을 때 절차적 응집도를 갖습니다.  프로그램의 특정 흐름을 따라 요소들을 묶어 놓은 형태입니다.
   * 예시: "초기화 모듈"에서 "변수 초기화 -> 설정 파일 로드 -> 시스템 시작 메시지 출력" 과 같이, 특정 순서로 실행되어야 하는 기능들을 모아 놓았지만, 기능적으로 긴밀하게 연관되어 있다고 보기는 어렵습니다.
* 시간적 응집도 (Temporal Cohesion): 모듈 내의 요소들이 특정 시간에 함께 실행되어야 한다는 이유로 묶여 있을 때 시간적 응집도를 갖습니다.  보통 초기화 루틴이나 종료 루틴에 나타납니다.
   * 예시: "시작 시 초기화 모듈"에서 "모든 전역 변수 초기화", "로그 파일 열기", "캐시 초기화" 와 같이, 시스템 시작 시점에 함께 실행되어야 하는 기능들을 모아 놓았습니다. 기능적으로는 서로 연관성이 낮을 수 있습니다.
* 논리적 응집도 (Logical Cohesion): 모듈 내의 요소들이 유사한 종류의 작업을 수행하지만, 서로 밀접하게 관련되어 있지는 않을 때 논리적 응집도를 갖습니다.  예를 들어, 다양한 종류의 입력을 처리하는 함수들이 하나의 모듈에 묶여 있는 경우입니다.  피해야 할 응집도 중 하나입니다.
   * 예시: "입력 처리 모듈"에서 "키보드 입력 처리", "마우스 입력 처리", "네트워크 입력 처리"  처럼, 다양한 입력 방식을 처리하는 기능들이 하나의 모듈에 묶여 있지만, 기능적으로는 개별 모듈로 분리하는 것이 더 나을 수 있습니다.
* 우연적 응집도 (Coincidental Cohesion) 또는 무작위적 응집도: 가장 낮은 수준의 응집도입니다. 모듈 내의 요소들이 아무런 의미 있는 관련성 없이 무작위로 묶여 있을 때 우연적 응집도를 갖습니다.  가장 나쁜 응집도이며, 모듈은 유지보수가 어렵고 예측 불가능하며 재사용성이 매우 낮습니다.  이러한 응집도를 가진 모듈은 반드시 분리해야 합니다.
   * 예시:  "잡동사니 모듈"처럼, 기능적으로 전혀 관련 없는 함수들이 그냥 하나의 모듈에 묶여 있는 경우.  예를 들어, "날짜 계산 함수", "문자열 변환 함수", "데이터베이스 연결 함수" 등이 하나의 모듈에 무작위로 섞여 있는 경우입니다.
**결합도 (Coupling)**는 모듈 간의 상호 의존성 또는 연결 강도를 나타내는 정도입니다. 즉, 하나의 모듈이 다른 모듈에 얼마나 의존하는가를 의미합니다. 결합도가 낮을수록 모듈 간의 독립성이 높아져 시스템 전체의 유지보수, 재사용성, 확장성이 향상됩니다.
좋은 결합도는 낮은 수준의 결합도를 의미하며, 이는 모듈들이 서로 최소한의 정보만 교환하고 독립적으로 동작하도록 설계되었다는 것을 나타냅니다.
결합도는 다음과 같은 단계로 분류할 수 있으며, 아래로 갈수록 결합도가 높아집니다.
* 자료 결합도 (Data Coupling): 가장 낮은 수준의 결합도입니다. 모듈 간에 매개변수를 통해서만 데이터를 교환할 때 자료 결합도를 갖습니다.  매개변수는 기본 자료형 (정수, 문자열 등) 이거나 자료 구조이지만, 자료 구조 전체가 아닌 필요한 데이터만 전달합니다.  가장 이상적인 결합도입니다.
   * 예시:  "계산 모듈"이 "입력 모듈"로부터 숫자 값을 매개변수로 받아 계산 결과를 반환하는 경우.  두 모듈은 필요한 데이터만 주고받으며, 서로의 내부 구조에 대해서는 알 필요가 없습니다.
* 스탬프 결합도 (Stamp Coupling) 또는 제어 영역 결합도: 모듈 간에 자료 구조를 통해 데이터를 교환하지만, 자료 구조 전체를 전달하고, 그 구조체의 일부만을 사용하는 경우 스탬프 결합도를 갖습니다. 자료 구조의 형태가 변경되면 관련된 모든 모듈에 영향을 줄 수 있어 자료 결합도보다는 결합도가 높습니다.
   * 예시: "주문 처리 모듈"이 "회원 정보 모듈"로부터 회원 정보 구조체를 전달받아, 주문 처리 과정에서 회원 이름과 주소만 사용하는 경우.  주문 처리 모듈은 회원 정보 구조체 전체에 의존하게 됩니다.
* 제어 결합도 (Control Coupling): 한 모듈이 다른 모듈의 논리 흐름이나 제어 흐름을 제어할 때 제어 결합도를 갖습니다.  예를 들어, 플래그 변수나 제어 코드를 전달하여 다른 모듈의 동작 방식을 결정하는 경우입니다.  모듈 간의 의존성이 높아지고, 한 모듈의 변경이 다른 모듈에 큰 영향을 줄 수 있습니다.
   * 예시: "UI 모듈"이 "처리 모듈"에게 "처리 유형"을 나타내는 코드를 전달하여, 처리 모듈이 코드 값에 따라 다른 방식으로 동작하도록 제어하는 경우.
* 외부 결합도 (External Coupling): 모듈들이 외부 환경 (예:  운영체제, 하드웨어, 외부 데이터베이스, 프로토콜 등) 을 공유할 때 외부 결합도를 갖습니다.  외부 환경에 대한 의존성이 높아져, 시스템 이식성이나 환경 변화에 대한 적응성이 낮아질 수 있습니다.
   * 예시:  여러 모듈이 특정 파일 형식의 설정 파일을 공유하거나, 특정 운영체제의 API를 사용하는 경우.
* 공통 결합도 (Common Coupling) 또는 공유 기억장소 결합도: 모듈들이 전역 변수 또는 공유 메모리 영역을 공유할 때 공통 결합도를 갖습니다.  모듈 간의 숨겨진 의존성이 발생하고, 데이터의 변경 추적이 어려워지며, 모듈의 재사용성이 크게 저하됩니다.  피해야 할 결합도 중 하나입니다.
   * 예시:  여러 모듈이 전역 변수를 통해 데이터를 공유하고 수정하는 경우.  어느 모듈에서 전역 변수를 변경했는지 추적하기 어려워 오류 발생 가능성이 높아집니다.
* 내용 결합도 (Content Coupling) 또는 경로 결합도: 가장 높은 수준의 결합도이며, 가장 나쁜 결합도입니다. 한 모듈이 다른 모듈의 내부 데이터 또는 내부 코드를 직접 참조하거나 수정할 때 내용 결합도를 갖습니다.  모듈 간의 의존성이 극도로 높아져, 한 모듈의 아주 작은 변경이 시스템 전체에 예측 불가능한 영향을 미칠 수 있습니다.  이러한 결합도를 가진 모듈은 반드시 리팩토링해야 합니다.
   * 예시:  "모듈 A"가 "모듈 B"의 특정 함수 내부의 변수를 직접 접근하거나 수정하는 경우, 또는 "모듈 B"의 함수를 강제로 호출하는 경우.
이상적인 모듈 설계는 높은 응집도 (High Cohesion) 와 낮은 결합도 (Low Coupling) 를 추구하는 것입니다.
* 높은 응집도: 모듈은 하나의 명확한 책임 (기능) 을 수행하고, 내부 요소들은 그 책임을 완수하기 위해 밀접하게 협력합니다.
* 낮은 결합도: 모듈들은 서로 독립적으로 동작하며, 필요한 경우 최소한의 정보만 주고받습니다.
비유:
* 응집도:  집 안의 방이라고 생각해보세요. 응집도가 높은 방은 "침실", "주방", "서재" 처럼 하나의 명확한 목적을 가지고, 그 목적에 필요한 물건들이 잘 갖춰져 있습니다. 응집도가 낮은 방은 그냥 '잡동사니 방' 처럼, 온갖 종류의 물건들이 아무렇게나 섞여 있는 방입니다.
* 결합도:  집과 집 사이의 관계라고 생각해보세요. 결합도가 낮은 집들은 서로 멀리 떨어져 있어서 서로에게 거의 영향을 주지 않습니다. 결합도가 높은 집들은 벽을 공유하거나, 수도관이나 전선 등을 공유하여 서로에게 크게 의존합니다.
결론적으로, 좋은 모듈 설계를 위해서는 모듈 내부의 응집도를 높이고, 모듈 간의 결합도를 낮추는 것을 목표로 해야 합니다. 이는 소프트웨어의 품질을 향상시키고, 유지보수 및 확장을 용이하게 만들어줍니다.