📌 소프트웨어 품질과 코드의 복잡도를 평가하기 위해 사용되는 대표적인 지표인 회전 복잡도(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 으로 문의주세요.
'정보처리기술사 > 03. SW공학' 카테고리의 다른 글
마이크로서비스 아키텍처(MSA)란? 쉽고 자세한 가이드 (1) | 2025.03.07 |
---|---|
객체지향 설계 원칙 (SOLID) 완벽 정리 (0) | 2025.03.04 |
객체지향 설계에서 캡슐화란? 쉽게 이해하는 개념 정리 (0) | 2025.03.03 |