테마
결합도와 응집도
결합도(coupling)는 모듈과 모듈이 서로 얼마나 기대고 있는지, 응집도(cohesion)는 한 모듈 안의 요소들이 얼마나 한 목적으로 뭉쳐 있는지를 나타낸다. 좋은 설계는 결합도는 약하게, 응집도는 강하게 만든다. 두 개념은 1960년대 후반 콘스탄틴(Larry Constantine)이 구조적 설계(structured design, 프로그램을 기능 단위 모듈로 나누는 설계 방법)의 일부로 만들었고, 1974년 논문과 요던(Edward Yourdon)과 함께 쓴 1979년 책으로 널리 퍼졌다. 시험은 등급 이름과 강도 순서를 쓰게 하거나, 상황을 주고 어느 등급인지 고르게 한다.
결합도 6종
결합도가 강하면 한 모듈을 고칠 때 다른 모듈도 같이 고쳐야 한다. 그래서 등급이 약할수록 품질이 높다. 아래는 강한 것부터 적었다. 외우는 요령은 첫 글자를 이어 "내·공·외·제·스·자"로 읽는 것이다.
- 내용(content) 결합도, 가장 강함: 다른 모듈의 내부 코드나 자료를 직접 참조하거나 고친다. 예) A가 B의 지역 변수를 바로 바꾼다.
- 공통(common) 결합도: 여러 모듈이 같은 전역 데이터 영역을 함께 쓴다. 예) 전역 변수
total을 세 모듈이 갱신한다. - 외부(external) 결합도: 외부에 선언된 데이터나 형식을 참조한다. 예) 한 모듈이 선언한 변수를 다른 모듈이 참조한다.
- 제어(control) 결합도: 상대의 처리 흐름을 바꾸는 제어 신호를 넘긴다. 예)
print(data, mode)의mode플래그. - 스탬프(stamp) 결합도: 배열·레코드 같은 자료 구조를 통째로 넘긴다. 예) 주소만 필요한데 회원 레코드 전체를 전달한다.
- 자료(data) 결합도, 가장 약함: 필요한 자료 요소만 인자로 넘긴다. 예)
area(w, h).
두 등급은 특히 헷갈린다. 제어 결합도는 넘겨준 값이 "무엇을 할지"를 정한다는 점이 핵심이다. 하위 모듈이 상위 모듈에 처리 지시를 내리게 되는 경우를 시험은 권리 전도 현상이라고 부른다. 스탬프 결합도는 필요 이상으로 큰 구조를 넘겨, 받는 쪽이 그 구조의 형태 변경에 영향을 받는다는 점이 문제다.
외부 결합도의 뜻은 자료마다 조금 다르다. 시험은 "다른 모듈이 선언한 데이터를 외부에서 참조하는 경우"로 정의하는 반면, 영문 자료는 외부에서 정해진 데이터 형식·통신 프로토콜·장치 인터페이스를 함께 쓰는 경우로 설명한다.1 공통 결합도는 공유 결합도, 스탬프 결합도는 검인 결합도라고도 한다.
응집도 7종
응집도가 강하면 모듈이 한 가지 일만 하므로 이해하고 고치기 쉽다. 결합도와 반대로 강할수록 품질이 높다. 아래는 강한 것부터 적었고, "기·순·교·절·시·논·우"로 외운다.
- 기능적(functional) 응집도, 가장 강함: 모든 요소가 하나의 기능을 위해 모였다. 예)
제곱근_계산. - 순차적(sequential) 응집도: 앞 활동의 출력이 다음 활동의 입력이 된다. 예) 읽기, 검증, 저장.
- 교환적(communicational) 응집도: 같은 입력이나 출력을 쓰는 서로 다른 기능이 모였다. 예) 같은 주문 데이터로 합계와 영수증을 만든다.
- 절차적(procedural) 응집도: 정해진 순서대로 수행된다는 이유만으로 모였다. 예) 초기화 뒤 메뉴 표시.
- 시간적(temporal) 응집도: 같은 시점에 실행된다는 이유로 모였다. 예) 시작할 때 변수 초기화와 로그 열기.
- 논리적(logical) 응집도: 성격이 비슷한 처리를 묶고 인자로 골라 쓴다. 예) 모든 입력을
mode로 골라 처리한다. - 우연적(coincidental) 응집도, 가장 약함: 서로 관련이 없다. 예) 잡동사니
Utils모듈.
교환적 응집도는 통신적 응집도라고도 부른다. 순차적과 절차적의 차이는 데이터가 이어지느냐다. 순차적은 앞 단계 결과가 다음 단계 입력으로 흐르고, 절차적은 순서만 정해져 있을 뿐 데이터가 이어지지 않는다. 영문 자료에는 기능적보다 위에 완전(perfect) 응집도를 두는 경우가 있지만 시험 범위는 위 7종이다.
시험 포인트
- 결합도 강 → 약: 내용 > 공통 > 외부 > 제어 > 스탬프 > 자료. 약할수록 좋다.
- 응집도 강 → 약: 기능 > 순차 > 교환 > 절차 > 시간 > 논리 > 우연. 강할수록 좋다.
- "다른 모듈 내부를 직접 참조·수정" → 내용 결합도. "전역 변수 공유" → 공통 결합도.
- "제어 신호를 넘겨 흐름을 바꿈, 권리 전도" → 제어 결합도. "배열·레코드 통째 전달" → 스탬프 결합도.
- "출력이 다음 입력" → 순차적, "같은 입력·출력 공유" → 교환적, "같은 시간대" → 시간적.
- 순서를 쓰는 문제는 방향(강한 것부터인지)을 문제에서 먼저 확인한다.
참고
영문 위키백과의 Coupling 문서 기준. 시험 답안은 시험 정의로 쓴다. ↩︎
