순환 복잡도 (cyclomatic complexity)

컴퓨터과학·AI
한 줄 정의: 프로그램의 제어 흐름에서 독립적인 경로가 몇 개인지로 코드 복잡도를 재는 지표입니다.

쉽게 풀면

코드가 얼마나 복잡한지를 조건문과 반복문의 개수로 헤아리는 방법입니다. 분기가 하나 늘 때마다 프로그램이 지날 수 있는 길이 하나씩 늘어나므로, 그 길의 수를 세어 복잡도로 삼습니다. 이 숫자는 그 함수를 완전히 검사하려면 최소 몇 개의 테스트가 필요한지에 대한 어림값이 되기도 합니다.

왜 중요한가

복잡도를 사람의 인상이 아니라 자동으로 계산되는 숫자로 바꿔 주기 때문에, 코드 품질 게이트나 리뷰 대상 선정에 실용적으로 쓰입니다. 값이 높은 함수일수록 결함이 많고 유지보수가 어렵다는 경험적 관계가 여러 연구에서 보고되었습니다. 정적 분석 도구들이 기본으로 제공하는 대표 지표입니다.

논문에서는 이렇게 쓰입니다

"순환 복잡도가 20을 초과하는 함수를 분리 대상으로 선정하고 리팩터링 후 평균값을 7까지 낮추었다."

분기가 지나치게 많은 함수를 골라 쪼개어 복잡도를 줄였다는 뜻입니다.

조금 더 깊게 보면

1976년 토머스 맥케이브가 제어 흐름 그래프의 간선 수에서 노드 수를 빼고 2를 더한 값으로 정의했으며, 실무에서는 판정 지점의 개수에 1을 더하는 방식으로 간단히 계산합니다. 이 값은 모든 분기를 최소 한 번씩 지나는 기저 경로 집합의 크기와 같아 경로 테스트 설계의 근거가 됩니다. 10 이하를 권장하고 20을 넘으면 분리를 검토하라는 기준이 널리 쓰이지만 절대적 기준은 아닙니다.

주의할 점

중첩 깊이나 이름의 명확성 같은 사람이 느끼는 어려움은 반영하지 못하므로, 낮은 값이 읽기 쉬운 코드를 보장하지는 않습니다. 시간복잡도와 빅오 표기법은 입력 크기에 따른 실행 시간 증가를 다루는 개념이므로 이름이 비슷해도 전혀 다른 지표입니다.

관련 용어