정보처리기사/소프트웨어 개발

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