728x90
반응형
SMALL
소프트웨어 품질의 핵심은 모듈의 독립성입니다.
- 응집도(cohesion): 모듈 내부 요소들이 하나의 목적을 위해 얼마나 밀접하게 관련되어 있는가
- 결합도(coupling): 모듈 간이 얼마나 강하게 서로 의존하는가
원칙은 단순합니다. 응집도는 높게, 결합도는 낮게.
결합도(Coupling): 모듈 “사이”의 의존성 줄이기
결합도는 “모듈 간 데이터/제어/구현을 얼마나 노출하고 공유하느냐”에 따라 단계가 나뉩니다.
아래로 갈수록 나쁜(강한) 결합입니다.
- 데이터 결합(Data coupling) — 좋음(낮음)
- 값만 주고받습니다. (예: add(10, 5))
- 모듈 간 인터페이스가 스칼라·단순 값 위주라면 유지보수가 쉽습니다.
int add(int x, int y); // 값 전달만 - 스탬프 결합(Stamp coupling)
- 배열/구조체/객체 등 자료구조 통째로 전달합니다. (예: add(Point p))
- 받는 쪽이 구조 내부에 불필요하게 의존하기 쉬워 스펙 변경에 취약합니다.
typedef struct { int x; int y; } Point; int addPoint(Point p); // 자료구조 전체 전달 - 제어 결합(Control coupling)
- 제어 플래그/분기 조건을 전달하여 내부 로직 흐름을 밖에서 결정합니다.
- 호출자가 피호출자의 분기 내부까지 사실상 알고 있다는 뜻.
// mode 값(제어 요소)에 따라 내부 로직 변경 void process(int data, int mode /* 0=fast, 1=safe ... */); - 외부 결합(External coupling)
- 외부에 선언된 자원/환경(파일 포맷, 통신 프로토콜 상수 등)에 여러 모듈이 함께 의존합니다.
- 외부 스펙이 바뀌면 모듈들이 동시에 영향을 받습니다.
- 공통(공유) 결합(Common coupling)
- 전역 변수 같은 공용 저장소를 여러 모듈이 함께 읽고/수정합니다.
- 변경 파급 범위가 넓고, 테스트가 어려워집니다.
int g_count; // 공용 전역 상태에 의존 - 내용 결합(Content coupling) — 최악
- 다른 모듈의 내부 변수/내부 함수를 직접 접근하거나 가정합니다.
- 모듈 경계가 사실상 붕괴된 상태로, 유지보수 악몽.
// 다른 모듈 내부 배열의 인덱스를 직접 건드리는 식의 침범 extern int _internal_buf[]; // (안 됨) 내용에 직접 접근
응집도(Cohesion): 모듈 “안”의 응집력 끌어올리기
응집도는 모듈 내부 기능들이 하나의 목적을 향해 얼마나 밀접히 연결돼 있는지를 말합니다.
아래로 갈수록 좋은(높은) 응집입니다.
- 우연적 응집(Coincidental) — 최악
- 관련성 낮은 코드가 우연히 한 파일/함수에 묶임. “잡탕 모듈”.
- 논리적 응집(Logical)
- 비슷한 범주의 일을 조건으로 골라 수행. (예: process(kind))
- 내부에 분기가 많아지고, 테스트가 복잡해집니다.
- 시간적 응집(Temporal)
- 같은 시점에 실행된다는 이유로 묶음. (예: 시작 시 초기화 묶음)
- 기능 목적이 달라도 “동시에 한다”는 이유로만 함께 있음.
- 절차적 응집(Procedural)
- 모듈 안의 구성 요소들이 기능을 순차적으로 수행하는 경우
- 결과물의 단일 목적성은 약합니다.
- 통신적 응집(Communicational)
- 같은 데이터를 사용/생성한다는 이유로 묶음. 데이터 흐름 중심.
- 순차적 응집(Sequential)
- 모듈 내에서 한 활동으로부터 나온 출력값을 다른 활동이 사용흐름이 단일 목적을 향해 정돈됩니다.
- 기능적 응집(Functional) — 최상
- 모듈 전체가 하나의 명확한 기능을 수행. 입력→처리→출력이 단일 목적으로 이어짐.
728x90
반응형
LIST