정보처리기사/소프트웨어 개발
McCabe의 Cyclomatic Complexity(순환 복잡도)
glorypang
2025. 10. 20. 23:30
728x90
반응형
SMALL
- 정의: 프로그램의 제어 흐름에 따라 복잡도를 측정하는 지표
그래프 버전
계산 공식
- V(G) = E(간선 수) - N(노드 수) + 2P
- V(G) = 면의 수 + 1
의미
- 독립 경로 수 = 최소 테스트 케이스 수
- V(G)가 클수록 → 분기 많음 → 복잡도·오류 위험·테스트 비용 증가
예시
그래프가 아래와 같을
cyclomatic 수는 ?


cyclomatic 수 = 6(간선 수) - 4(노드 수) + 2 = 3(면의 수) + 1 = 4
코드 버전
계산 공식
- 결정문 개수 세기 + 1
결정문 가산표
| 구문 | 가산값 | 비고 |
| if | +1 | 조건 분기 |
| else if | +1 | 새로운 if로 간주 |
| else | +0 | 분기 아님 |
| for | +1 | 반복문 |
| while | +1 | 반복문 |
| do-while | +1 | 반복문 |
| switch 각 case | +1 | case마다 가산 |
| ? : (삼항) | +1 | 조건 연산자 |
| catch | +1 | 예외 분기 |
| &&, ` | ` |
예시
예시 1: 단순 조건문
if (A && B) {
// ...
}
계산: if(1) + &&(1) = 2 → V(G) = 3
예시 2: 다중 조건문
if (A) {
// ...
} else if (B) {
// ...
} else {
// ...
}
if (C) {
// ...
}
계산: if(1) + else if(1) + if(1) = 3 → V(G) = 4
예시 3: switch문
switch(x) {
case 1: break;
case 2: break;
default: break;
}
계산: case(3개) = 3 → V(G) = 4
예시 4: 중첩 구조
for (int i = 0; i < n; i++) {
if (p) {
// ...
}
}
계산: for(1) + if(1) = 2 → V(G) = 3
주의사항
가산하지 않는 것들
- else (단독 분기 아님)
- return, break, continue (자체로는 결정문 아님)
주의할 점
- &&, ||: 도구마다 다르지만, 시험에선 포함해서 계산하는 것이 안전
- 여러 독립 그래프: P > 1일 때 V(G) = E - N + 2P 사용
품질 기준
| V(G) | 범위 | 평가조치 |
| 1 ~ 4 | 단순/보통 | 양호 |
| 5 ~ 7 | 복잡 | 리팩터링 고려 |
| 8 이상 | 과복잡 | 함수 분리·로직 단순화 권장 |
728x90
반응형
LIST