# 순환 복잡도: 코드 복잡성을 제대로 측정하는 방법

URL: https://formula.dog/ko/journal/formula-dog-cyclomatic-complexity-ko
Type: blog
Locale: ko
Published: 2026-08-27
Updated: 2026-08-27

---

> 순환 복잡도(Cyclomatic Complexity)는 코드가 얼마나 복잡한지 수치화하는 지표입니다. 이 가이드에서 공식, 계산 방법, 실제 사례를 통해 배워보세요.

코드의 품질을 어떻게 객관적으로 측정할까요? 개발팀 내에서 코드가 복잡하다고 할 때, 사실 엄밀한 기준이 부족했습니다. 이 문제를 해결하기 위해 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개의 서로 다른 실행 경로가 필요하다는 뜻입니다.

![제어 흐름 그래프 예제](https://fdzlnqpwsaniezitwiuw.supabase.co/storage/v1/object/public/cms-media/formula-dog/2026-08/10095b-inline1.webp)

## 순환 복잡도 점수의 의미

산업 표준 기준: 1-10은 낮음, 11-15는 중간, 16-20은 높음, 21 이상은 매우 높음입니다. 1-10이 이상적이며, 이 범위의 함수는 유지보수하기 쉽고 버그가 적습니다. 21 이상은 긴급한 상태로, 버그가 숨어있을 가능성이 매우 높습니다. 팀의 평균 순환 복잡도를 추적하면 전체 코드 품질의 향상도 볼 수 있습니다.

## 순환 복잡도 vs. 인지적 복잡도

순환 복잡도는 제어 흐름의 경로 수를 센 것이고, 인지적 복잡도는 코드를 읽는 사람의 머릿속 부하를 측정합니다. 깊게 중첩된 조건문은 인지적 복잡도가 높지만 순환 복잡도는 낮을 수 있습니다. 따라서 두 지표를 함께 고려해야 좋은 코드를 만들 수 있습니다.

![코드 리뷰 현장](https://fdzlnqpwsaniezitwiuw.supabase.co/storage/v1/object/public/cms-media/formula-dog/2026-08/e9c9a1-inline2.webp)

## 엑셀 수식에서도 같은 문제가

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 파이프라인에 추가해 자동으로 복잡도를 추적하세요. 기존 코드베이스의 가장 복잡한 함수부터 리팩토링하면 효과가 있습니다. 팀 전체의 평균 복잡도를 월별로 기록하고 추세를 분석하세요. 점진적인 개선이 지속되면 몇 개월 후 코드 품질이 눈에 띄게 향상됩니다. 순환 복잡도 관리는 단순한 수치 게임이 아닙니다. 이는 팀의 생산성, 코드 품질, 그리고 개발 문화를 함께 개선하는 실질적인 전략입니다. 오늘부터 시작하세요.

## FAQ

### 순환 복잡도가 정확히 뭔가요?

순환 복잡도는 코드의 제어 흐름이 얼마나 복잡한지를 수치화하는 지표입니다. 조건문, 반복문, 예외 처리 등의 결정 지점을 세어서 표현합니다.

### 이상적인 순환 복잡도 점수는 얼마인가요?

일반적으로 1-10이 가장 좋습니다. 11-15는 관찰이 필요하고, 16-20은 리팩토링을 권장하며, 21 이상은 즉시 개선이 필요합니다.

### 순환 복잡도가 높으면 왜 문제인가요?

높은 순환 복잡도는 테스트하기 어렵고, 버그가 숨어있을 가능성이 높으며, 새로운 개발자가 이해하기 어렵다는 뜻입니다. 또한 유지보수 비용이 증가합니다.

### 순환 복잡도를 자동으로 계산할 수 있나요?

네, SonarQube, Codacy, pylint, ESLint 같은 도구들이 자동으로 측정합니다. 대부분의 IDE에도 내장 기능이 있습니다.

### 순환 복잡도와 인지적 복잡도의 차이는?

순환 복잡도는 코드의 경로 수를 센 것이고, 인지적 복잡도는 개발자의 이해도에 초점을 맞춥니다. 깊게 중첩된 조건문은 인지적 복잡도가 높지만 순환 복잡도는 낮을 수 있습니다.

### 엑셀 수식도 순환 복잡도가 높아질 수 있나요?

네, IF 함수가 중첩되면서 순환 복잡도가 올라갑니다. 복잡한 수식은 유지보수가 어렵고 오류가 나기 쉬우므로, 조회 테이블이나 헬퍼 컬럼을 사용하세요.

### 리팩토링할 때 어디서부터 시작해야 하나요?

순환 복잡도가 가장 높은 함수나 모듈부터 시작하세요. 가드 절, 함수 분리, 조회 테이블, early return 같은 방법들을 적용하면 됩니다.