페이지

2026년 5월 27일 수요일

맥케이브 순환복잡도(McCabe’s Cyclomatic Complexity)


1. 소프트웨어 품질 측정의 정량적 척도, 맥케이브 순환복잡도의 개요

가. 맥케이브 순환복잡도(McCabe’s Cyclomatic Complexity)의 정의

  • 프로그램 소스 코드의 제어 흐름을 제어 흐름 그래프(Control Flow Graph)로 모델링하여, 소스 코드의 복잡도를 정량적으로 측정하는 대표적인 소프트웨어 공학적 지표.

  • 화이트박스 테스트의 기법인 기본 경로 커버리지(Basis Path Coverage)의 기준이 되며, 프로그램 내에 존재하는 선형적으로 독립적인 경로(Independent Paths)의 수를 나타냄.

나. 순환복잡도의 핵심 목적 및 필요성

  • 테스트 케이스 개수 산정: 기본 경로 테스트를 수행하기 위해 도출해야 하는 최소 테스트 케이스(TC) 수 결정.

  • 유지보수 용이성 평가: 복잡도가 높은 소스 코드를 사전에 식별하여 리팩토링(Refactoring) 대상을 선정하는 기준선 제공.

2. 순환복잡도 산정을 위한 제어 흐름 그래프 구성 및 3대 계산 공식

가. 제어 흐름 그래프(Control Flow Graph)의 구성 요소

  • 노드 (Node, $V$): 실행 가능한 명령문, 구문, 또는 순차적 코드 블록.

  • 간선 (Edge, $E$): 제어의 흐름(조건 분기, 순차 실행 등)을 나타내는 노드 간의 연결선.

  • 영역 (Region, $R$): 노드와 간선에 의해 둘러싸인 닫힌 공간과 그래프 외부의 열린 공간을 포함한 영역.

나. 순환복잡도($V(G)$) 측정을 위한 3가지 계산 공식

  1. 간선과 노드 기반 공식 (기본 공식):

    $$V(G) = E - N + 2P$$
    • ($E$: 간선의 수, $N$: 노드의 수, $P$: 분리된 연결 성분의 수. 단일 프로그램의 경우 $P=1$이므로 보통 $V(G) = E - N + 2$ 적용)

  2. 술어 노드(Condition/Predicate Node) 기반 공식:

    $$V(G) = P + 1$$
    • ($P$: 조건문, 반복문 등 제어가 분기되는 결정 노드/술어 노드의 개수)

  3. 영역(Region) 기반 공식:

    $$V(G) = \text{그래프에 의해 분할된 평면 영역의 개수}(R)$$

3. 순환복잡도 계산 실무 적용 사례 (소스 코드 코드 분석)

다음과 같은 조건문이 포함된 가상의 자바스크립트/자바 코드를 기반으로 순환복잡도를 도출한다.

JavaScript
1: if (A > 10) {
2:     if (B > 20) {
3:         X = 1;
4:     } else {
5:         X = 2;
6:     }
7: }
8: print(X);

가. 제어 흐름 그래프 매핑 및 공식 적용

  • 노드($N$) 도출: [1, 2, 3, 4, 5, 6, 7, 8] $\rightarrow$ 총 8개 구문 단위로 그래프 매핑 시 복잡도 분석에 따라 가용 노드 가시화.

  • 실제 계산 대입 (간단히 도해상 3대 공식 검증):

    • 술어 노드($P$) 기준: 조건문 구문이 A > 10B > 20으로 총 2개 존재함.

    • 공식 대입: $V(G) = P + 1 = 2 + 1 = 3$

    • 결론: 해당 소스 코드를 100% 검증하기 위한 독립적인 기본 경로는 총 3개이며, 최소 3개의 테스트 케이스가 필요함.

4. 순환복잡도 지표 기반의 품질 위험도 관리 기준 및 활용 방안

가. 복잡도 레벨에 따른 위험도 가이드라인

순환복잡도 값 (V(G))프로그램 상태 및 위험도실무적 관리 대책 (Action Item)
1 ~ 10구조가 단순하고 안정적인 코드안정적인 상태, 일반적인 테스트 수행
11 ~ 20복잡해지기 시작하는 코드구조 검토 요망, 테스트 케이스 상세 설계 필요
21 ~ 50매우 복잡하여 위험성이 높은 코드리팩토링(Refactoring) 필수 권고, 함수 분할
51 이상비정상적이며 구조적 결함이 있는 코드코드 재작성(Rewrite) 수준의 구조 개선 요구

나. 개발 전수 수명주기(SDLC)에서의 실무적 활용 방안

  • CI/CD 파이프라인 내 정적 분석 통합: SonarQube 등 정적 소스 코드 분석 도구를 빌드 파이프라인에 연동하여, 개발자가 작성한 소스 코드의 순환복잡도가 기준치(예: 10)를 초과할 경우 배포를 차단하는 Quality Gate 설정.

  • 테스트 비용 및 일정 산정: 프로젝트 초기 모듈별 순환복잡도를 예측/측정하여, 복잡도가 높은 코어 모듈(예: 결제, 인증 로직)에 고급 테스트 인력을 전진 배치하고 화이트박스 테스트 공수(M/M)를 차별화하여 투입하는 리스크 기반 테스팅(RBT)의 근거로 활용.

댓글 없음: