순환 복잡도: 코드 복잡성을 제대로 측정하는 방법
요약
순환 복잡도의 정의와 계산 방법, 산업 표준 임계값, 실제 파이썬 코드 예제와 복잡도를 효과적으로 낮추는 5가지 리팩토링 기법을 완벽하게 설명합니다.
코드의 품질을 어떻게 객관적으로 측정할까요? 개발팀 내에서 코드가 복잡하다고 할 때, 사실 엄밀한 기준이 부족했습니다. 이 문제를 해결하기 위해 1976년 소프트웨어 공학자 토머스 맥케이브가 제안한 개념이 바로 순환 복잡도입니다. 이는 단순한 이론이 아니라 실제로 업계에서 40년 이상 표준처럼 사용되어온 검증된 지표입니다. 코드 품질 관리의 첫 걸음은 측정입니다. 순환 복잡도를 이해하고 관리하면 팀의 코드 품질이 눈에 띄게 개선됩니다.
순환 복잡도는 무엇인가?
코드를 짤 때 가장 많이 하는 실수 중 하나가 조건문을 너무 많이 넣는 것입니다. if, for, while이 중첩되면서 코드가 복잡해지고, 테스트도 어려워집니다. 순환 복잡도(Cyclomatic Complexity)는 이 복잡함을 숫자로 재는 지표입니다. 간단하게 말하면 순환 복잡도 = 결정 지점(decision point)의 개수 + 1입니다. 이것이 기본 개념입니다. 결정 지점이란 if, switch, for, while, catch 같은 제어 흐름 문장을 의미합니다. 이 값이 높을수록 코드의 분기가 많다는 뜻이고, 테스트해야 하는 경로도 그만큼 많아집니다.
순환 복잡도 계산 공식
정확한 공식은 다음과 같습니다: M = E - N + 2P. 여기서 M은 순환 복잡도, E는 간선의 개수, N은 노드의 개수, P는 연결된 컴포넌트의 개수입니다. 하지만 실무에서는 간단히 조건문의 개수를 세면 충분합니다.
실제 코드로 계산해보기
다음 파이썬 함수를 보세요:
def process_order(quantity, price, is_member):
total = quantity * price
if is_member:
total *= 0.9
if total > 100:
total *= 0.95
if total < 10:
return None
return total이 함수의 순환 복잡도는: 함수 시작 1점 + if 조건문 3개 = 총 4점입니다. 이는 완전히 테스트하려면 최소 4개의 서로 다른 실행 경로가 필요하다는 뜻입니다.

순환 복잡도 점수의 의미
산업 표준 기준: 1-10은 낮음, 11-15는 중간, 16-20은 높음, 21 이상은 매우 높음입니다. 1-10이 이상적이며, 이 범위의 함수는 유지보수하기 쉽고 버그가 적습니다. 21 이상은 긴급한 상태로, 버그가 숨어있을 가능성이 매우 높습니다. 팀의 평균 순환 복잡도를 추적하면 전체 코드 품질의 향상도 볼 수 있습니다.
순환 복잡도 vs. 인지적 복잡도
순환 복잡도는 제어 흐름의 경로 수를 센 것이고, 인지적 복잡도는 코드를 읽는 사람의 머릿속 부하를 측정합니다. 깊게 중첩된 조건문은 인지적 복잡도가 높지만 순환 복잡도는 낮을 수 있습니다. 따라서 두 지표를 함께 고려해야 좋은 코드를 만들 수 있습니다.

엑셀 수식에서도 같은 문제가
IF 함수가 중첩되면서 수식이 복잡해집니다. 예: =IF(AND(A1>100, B1>50), IF(C1=Y, OK, NO), SKIP). 이런 수식은 유지보수가 어렵습니다. 데이터 테이블로 변환하거나 VBA 함수로 대체하는 것이 낫습니다.
복잡도를 낮추는 5가지 방법
1. 가드 절(Guard Clause) 사용
조건을 먼저 확인하고 빠져나옵니다. 예외 케이스를 먼저 처리하면 main logic이 깔끔해집니다.
2. 함수 분리(Extract Function)
복잡한 로직을 별도 함수로 빼냅니다. 각 함수가 하나의 책임만 가지도록 분리하면 테스트와 재사용이 모두 쉬워집니다.
3. 조회 테이블(Lookup Table) 활용
조건 대신 데이터를 사용합니다. 딕셔너리로 매핑하면 로직이 훨씬 간단해집니다.
4. Early Return 활용
예외 케이스를 먼저 처리합니다. 이는 가드 절과 유사하지만 중간에도 사용 가능합니다.
5. 정책 패턴(Strategy Pattern)
동작을 객체로 캡슐화합니다. 복잡한 조건 대신 다양한 전략 객체를 사용합니다.
자동으로 측정하는 도구들
SonarQube는 가장 널리 쓰이는 도구로, GitHub, GitLab, Azure DevOps와 통합됩니다. 엔터프라이즈 환경에서도 널리 사용됩니다. Codacy는 자동 코드 리뷰 플랫폼입니다. pylint(Python), ESLint(JavaScript), Jetbrains IDE 모두 순환 복잡도를 검사할 수 있습니다.
복잡도를 낮추면 뭐가 좋아?
테스트 케이스가 적어도 됩니다. 버그 발생 확률이 낮아집니다. 새 팀원이 코드를 이해하기 쉬워집니다. 유지보수 비용이 줄어듭니다. 성능과 확장성이 개선됩니다. 코드를 읽고 수정하는 일이 빨라지고, 리뷰 시간도 단축되며, 새로운 기능 추가도 안전해집니다. 순환 복잡도가 높다는 것은 이 코드는 테스트하기 힘들고 버그가 숨어있을 가능성이 높다는 신호입니다. 지표를 신뢰하고 리팩토링에 투자하세요. 실무에서는 SonarQube를 CI/CD 파이프라인에 추가해 자동으로 복잡도를 추적하세요. 기존 코드베이스의 가장 복잡한 함수부터 리팩토링하면 효과가 있습니다. 팀 전체의 평균 복잡도를 월별로 기록하고 추세를 분석하세요. 점진적인 개선이 지속되면 몇 개월 후 코드 품질이 눈에 띄게 향상됩니다. 순환 복잡도 관리는 단순한 수치 게임이 아닙니다. 이는 팀의 생산성, 코드 품질, 그리고 개발 문화를 함께 개선하는 실질적인 전략입니다. 오늘부터 시작하세요.