정보처리기술사/03. SW공학

회전 복잡도(Cyclomatic Complexity)와 할스테드 지표(Halstead Metrics) 설명 및 활용 분야

남훈 멘토 2025. 2. 22. 18:07

📌 소프트웨어 품질과 코드의 복잡도를 평가하기 위해 사용되는 대표적인 지표인 회전 복잡도(Cyclomatic Complexity)와 할스테드 지표(Halstead Metrics) 입니다.

이 두 지표는 코드의 복잡도, 유지보수성, 오류 가능성을 분석하는 데 널리 활용됩니다.


🧮 1️⃣ 회전 복잡도 (Cyclomatic Complexity)

정의

회전 복잡도프로그램의 제어 흐름 복잡도를 측정하는 지표입니다.
즉, 코드 내 독립적인 실행 경로의 수를 나타내며, 테스트 시 필요한 최소 테스트 케이스 수를 알려줍니다.

🔢 계산 공식

M=E−N+2PM = E - N + 2P

  • M: 회전 복잡도
  • E: 제어 흐름 그래프의 간선(edge) 수
  • N: 노드(node) 수
  • P: 독립적인 제어 흐름 수(일반적으로 1)

🧪 간단한 예시 (if문 포함 코드)

def example(a, b):
    if a > b:
        return a
    else:
        return b

계산 방법

  • 조건문(if/else)이 1개 → 회전 복잡도 = 조건문 수 + 1 = 2
    해석
  • 최소 2개의 테스트 케이스가 필요하다는 의미 (조건 참/거짓)

🏆 회전 복잡도의 활용 분야

활용 분야 설명 예시

테스트 케이스 설계 코드의 모든 경로를 테스트할 수 있는 최소 케이스 수 파악 if/else 조건 분기 테스트
코드 복잡도 관리 복잡도가 높은 코드 발견 및 리팩토링 지표 제공 너무 많은 조건문 제거 권장
유지보수 비용 예측 복잡도가 높을수록 유지보수 비용 증가 코드 가독성 및 수정 용이성 향상
버그 발생 가능성 분석 복잡도가 높으면 오류 발생 가능성 증가 코드 품질 개선 필요 여부 판단

🧮 2️⃣ 할스테드 지표 (Halstead Metrics)

정의

할스테드 지표소스 코드의 연산자와 피연산자 수를 기반으로 소프트웨어의 크기, 복잡도, 개발 노력 등을 측정하는 지표입니다.
개발 시간, 유지보수 비용, 오류 가능성을 예측하는 데 유용합니다.


🔢 주요 지표 및 공식

지표 공식 설명

n₁ 사용된 연산자의 종류 수 +, -, if, return 등
n₂ 사용된 피연산자의 종류 수 변수, 상수 등
N₁ 연산자의 총 사용 횟수 코드 내 연산자 출현 횟수
N₂ 피연산자의 총 사용 횟수 코드 내 피연산자 출현 횟수
프로그램 길이(L) L = N₁ + N₂ 전체 코드 길이
어휘 수(Vocabulary) n = n₁ + n₂ 고유 연산자 및 피연산자 수
볼륨(Volume, V) V = L * log₂(n) 코드 크기 및 복잡도
난이도(Difficulty, D) D = (n₁/2) * (N₂/n₂) 코드 이해 난이도
노력(Effort, E) E = D * V 개발 및 유지보수 노력
개발 시간(T) T = E / 18 개발 시간 예측(초 단위)

🧪 간단한 예시

def add(a, b):
    return a + b

계산 과정

  • 연산자 종류(n₁): 2개 (return, +)
  • 피연산자 종류(n₂): 3개 (a, b, add)
  • 연산자 총 사용(N₁): 2회 (return, +)
  • 피연산자 총 사용(N₂): 3회 (a, b, add)

주요 지표 계산

  • 길이(L) = N₁ + N₂ = 5
  • 어휘 수(n) = n₁ + n₂ = 5
  • 볼륨(V) = L * log₂(n) ≈ 5 * 2.32 ≈ 11.6
  • 난이도(D) = (n₁/2) * (N₂/n₂) = (2/2)*(3/3) = 1
  • 노력(E) = D * V = 1 * 11.6 = 11.6
  • 개발 시간(T) ≈ 11.6 / 18 ≈ 0.64초

🏆 할스테드 지표의 활용 분야

활용 분야 설명 예시

개발 시간 및 비용 예측 소프트웨어 개발 노력 및 시간 추정 프로젝트 일정 계획
코드 복잡도 및 가독성 평가 코드 이해 난이도 및 오류 가능성 분석 가독성 낮은 코드 개선 권장
버그 발생 가능성 예측 복잡도가 높으면 오류 발생 가능성 증가 위험 코드 사전 탐지
코드 리팩토링 지표 제공 볼륨 및 난이도가 높은 코드 개선 유도 코드 최적화 필요성 파악

📝 회전 복잡도 vs 할스테드 지표 비교

항목 회전 복잡도 할스테드 지표

중점 코드의 제어 흐름 복잡도 코드의 연산/피연산자 기반 복잡도
주요 활용 테스트 케이스 설계, 오류 경로 파악 개발 시간 추정, 코드 유지보수 평가
측정 대상 조건문, 반복문, 분기 구조 코드의 어휘적 구조 (연산자/피연산자)
장점 테스트 및 오류 탐지에 유용 개발 노력 및 오류 예측에 강점
단점 코드 크기와 무관 제어 흐름을 직접 반영하지 않음

🎯 결론

  • 회전 복잡도(Cyclomatic Complexity)는 테스트 케이스 설계와 오류 경로 탐지에 유용합니다.
  • 할스테드 지표(Halstead Metrics)는 개발 시간 예측, 유지보수 비용 분석, 코드 오류 가능성 평가에 효과적입니다.
    💡 두 지표를 함께 활용하면 코드의 품질과 유지보수성을 보다 종합적으로 평가할 수 있습니다. 😊

 

더보기

대전과 서울에서 정보처리 기술사 멘토링을 하고 있습니다. 

관련해서 궁금하신 사항은 revelly@naver.com 으로 문의주세요.