
1. 응집도 (Cohesion)
모듈 내부에 서로 관련이 있는 요소들이 얼마나 잘 묶여 있는지를 나타낸다. 응집도가 높다는 것은 모듈 내부의 요소들이 서로 잘 연관되어 있어 특정 기능을 수행하는데 집중되어 있다는 뜻이다. 하나의 모듈이 하나의 책임 또는 목적을 얼마나 잘 수행하느냐, '모듈 내부의 통일성'을 보는 개념
2. 결합도 (Coupling)
두 모듈 간에 서로 얼마나 의존적인지를 나타낸다. 결합도가 낮다는 것은 모듈 간의 의존성이 낮아 각 모듈이 독립적으로 동작할 수 있다는 것을 의미한다. 따라서 시스템의 유연성이 높아지고, 한 모듈의 변경이 다른 모듈에 미치는 영향이 줄어든다.
응집도는 높을수록 좋다. → 한 모듈은 한 가지 일만!
결합도는 낮출수록 좋다. → 모듈 간 의존 최소화!
3. 응집도의 종류 (좋은 설계 → 나쁜 설계)
기능적 응집도 (Functional) :하나의 명확한 목적을 위해 모든 기능이 협력 ✅
→ 순차적 응집도 (Sequential) : 앞 작업의 결과가 다음 작업에 쓰임
→ 통신적 응집도 (Communicational) : 동일한 데이터(또는 자료구조)를 사용
→ 절차적 응집도 (Procedural) : 특정 순서로 실행되지만, 기능 간 의미적 관련성 낮음
→ 시간적 응집도 (Temporal) : 동일한 시점에 수행되는 작업들이 모여 있음
→ 논리적 응집도 (Logica*) : 비슷한 종류의 작업이지만, 플래그나 조건으로 구분됨
→ 우연적 응집도 (Coincidental) : 관련 없는 기능들이 우연히 모여 있음 ❌
응집도 정리 순서 (낮음 → 높음)
우연적 < 논리적 < 시간적 < 절차적 < 통신적 < 순차적 < 기능적
1️⃣ 우연적 응집도 (❌ 가장 나쁨)
void utilityModule() {
printReport();
openFile();
connectDatabase();
playSound();
}
✔️ 서로 관련 없는 기능들을 모아놓은 덩어리
2️⃣ 논리적 응집도
void handleEvent(String eventType) {
if (eventType.equals("CLICK")) handleClick();
else if (eventType.equals("KEY")) handleKey();
}
✔️ 관련은 있지만 기능 구분이 조건문으로만 되어 있음
3️⃣ 시간적 응집도
void initSystem() {
initMemory();
loadFonts();
connectDB();
}
✔️ "프로그램 시작 시 실행"처럼 시간만 공통일 뿐, 목적은 다름
4️⃣ 절차적 응집도
void processOrder() {
calculateDiscount();
logTime();
printInvoice();
}
✔️ 순서상 붙어 있지만 각 기능이 논리적으로 밀접하진 않음
5️⃣ 통신적 응집도
void handleCustomer(Customer customer) {
updateAddress(customer);
sendEmail(customer);
}
✔️ 동일한 데이터를 공유함 → 어느 정도 밀접한 관련
6️⃣ 순차적 응집도
void processData() {
String raw = readRawData();
String cleaned = cleanData(raw);
saveData(cleaned);
}
✔️ 앞 작업의 결과가 다음 작업으로 전달됨 → 흐름 존재
7️⃣ 기능적 응집도 (✅ 가장 이상적)
void calculateTax() {
getIncomeData();
applyTaxRate();
returnFinalAmount();
}
✔️ 모두 하나의 목적("세금 계산")에 집중됨
4. 결합도의 종류(좋은 설계 → 나쁜 설계)
자료 결합도 (Data Coupling) ✅
→ 스탬프 결합도 (Stamp Coupling)
→ 제어 결합도 (Control Coupling)
→ 외부 결합도 (External Coupling)
→ 공통 결합도 (Common Coupling)
→ 내용 결합도 (Content Coupling) ❌
결합도 정리 순서 (낮음 → 높음)
자료 < 스탬프 < 제어 < 외부 < 공통 < 내용
1️⃣ 자료 결합도 (Data Coupling) – ⭐가장 이상적 (낮은 결합도)
단순한 값(변수, 리터럴 등)을 파라미터로 주고받는 경우
// 모듈 A
void printMessage(String msg) {
System.out.println(msg);
}
// 모듈 B
printMessage("Hello, world!");
✔️ 문자열 하나만 전달 → 서로 강하게 묶이지 않음
2️⃣ 스탬프 결합도 (Stamp Coupling)
구조체(struct), 객체(class), 배열 등 전체 자료구조를 전달
실제로는 일부 필드만 쓰는 경우
class User {
String name;
int age;
String address;
}
// 모듈 A
void printUserInfo(User user) {
System.out.println(user.name);
}
// 모듈 B
User user = new User("Dain", 25, "Seoul");
printUserInfo(user);
⚠️ printUserInfo()는 name만 쓰는데 전체 객체를 넘김 → 불필요한 결합
3️⃣ 제어 결합도 (Control Coupling)
어떤 모듈이 다른 모듈에 **처리 방식(제어 플래그)**을 넘겨줄 때
void printData(boolean isVerbose) {
if (isVerbose) {
System.out.println("Detailed info...");
} else {
System.out.println("Basic info.");
}
}
⚠️ 플래그 값에 따라 내부 로직이 바뀜 → 의존도 증가
4️⃣ 외부 결합도 (External Coupling)
모듈이 공통적으로 사용하는 외부 시스템에 의존할 때
(ex. 파일, 디바이스, DB, 환경설정 파일 등)
// A와 B가 같은 config.properties 파일을 읽음
Properties config = load("config.properties");
⚠️ 파일 포맷이나 위치 변경 시 여러 모듈에 영향
5️⃣ 공통 결합도 (Common Coupling)
**전역 변수(global variable)**를 여러 모듈이 공유하고 수정
// 전역 변수 선언
int sharedCount = 0;
// 모듈 A
void increase() {
sharedCount++;
}
// 모듈 B
void reset() {
sharedCount = 0;
}
⚠️ 어떤 모듈이 값을 바꿨는지 추적 어려움 → 버그 발생 가능성 높음
6️⃣ 내용 결합도 (Content Coupling) – ❌가장 나쁨 (강한 결합)
한 모듈이 다른 모듈의 내부를 직접 참조하거나 수정
// 모듈 A
class Engine {
int rpm = 0;
}
// 모듈 B
Engine engine = new Engine();
engine.rpm = 9999; // 외부에서 내부 직접 수정 (캡슐화 위반)
❌ 모듈 B가 모듈 A의 구현 세부사항에 의존 → 수정 시 리스크 큼
'정보처리기사' 카테고리의 다른 글
| [자바, C언어] 동적바인딩과 정적바인딩 차이 (2) | 2025.06.23 |
|---|---|
| [서브넷] 네트워크 주소 구하는 법 (정보처리기사 실기 25년 1차) (1) | 2025.05.13 |
| [C언어] 포인터, Call by Reference, 2차원 배열 행 대표주소, 구조체 정리 (0) | 2025.04.19 |
| [C언어] 변수의 유효범위, 논리연산자, 증감연산자, static 변수, global 변수 주의사항 정리 (3) | 2025.04.10 |
| [2024년 3회] 정보처리기사 실기 복원 문제 해설 (이건 누가 낸 문제야?🤯) (6) | 2025.04.07 |