[예제 문제]
다음 C 언어 코드 조각을 보고 할스테드의 소프트웨어 사이언스 지표 중 프로그램 어휘량(Vocabulary)과 부피(Volume)를 계산하시오. (단, $\log_2 16 = 4$로 계산한다.)
if (a > b)
x = y + 1;
else
x = y - 1;
1단계 연산자(Operator)와 피연산자(Operand) 분류
할스테드 측정의 핵심은 무엇이 연산자고 무엇이 피연산자인지 정확히 구분하는 것입니다.
- 연산자 ($n_1, N_1$) : 제어문, 산술 연산자, 할당문, 괄호, 세미콜론 등
- 피연산자 ($n_2, N_2$) : 변수명, 상수(숫자)
| 구분 | 종류 (Distinct) | 개수 (Total) |
| 연산자 ($n_1$) | if, else, ( ), >, =, +, -, ; | 8종류 ($n_1 = 8$) |
| 연산자 총수 ($N_1$) | (위에 열거한 것들이 코드에 나타난 총 횟수 중복은 제거) | 10개 ($N_1 = 10$) |
| 피연산자 ($n_2$) | a, b, x, y, 1 | 5종류 ($n_2 = 5$) |
| 피연산자 총수 ($N_2$) | a, b, x, y, 1, x, y, 1 | 8개 ($N_2 = 8$) |
<주의> 시험 문제에 따라 세미콜론(;)이나 중괄호({})를 포함하는 기준이 다를 수 있지만, 보통은 코드에 명시된 모든 기호를 연산자로 취급합니다.
| 지표 | 기호 | 계산 결과 | 항목 |
| 연산자 종류 | $n_1$ | 8 | if, else, (), >, =, +, -, ; |
| 피연산자 종류 | $n_2$ | 5 | a, b, x, y, 1 |
| 연산자 총수 | $N_1$ | 10 | if(1), else(1), () (1), > (1), =(2), +(1), -(1), ;(2) |
| 피연산자 총수 | $N_2$ | 8 | a(1), b(1), x(2), y(2), 1(2) |
2단계 공식 대입 및 계산
① 프로그램 어휘량 (Vocabulary, $n$)
공식: $n = n_1 + n_2$
$n = 8 + 5 = 13$
② 프로그램 전체 길이 (Length, $N$)
공식: $N = N_1 + N_2$
$N = 10 + 8 = 18$
③ 프로그램 부피 (Volume, $V$)
공식: $V = N \times \log_2 n$
$V = 18 \times \log_2 13$
$\log_2 13$은 약 3.7 정도이므로, $18\times 3.7 \approx 66.6$
(실제 시험에서는 계산 편의를 위해 $n$이 8, 16, 32처럼 2의 거듭제곱이 되도록 숫자를 맞춰서 출제하는 경우가 많습니다.)
🎯 감리사 시험 대비 포인트
- 중복 제거 여부 : $n_1, n_2$는 '종류'이므로 중복을 제거하고 세어야 합니다.
- 로그 계산 : $\log_2$ 계산이 나오므로 $2^3=8, 2^4=16, 2^5=32$ 정도의 값은 숙지하세요.
- McCabe와 비교 : "할스테드는 실행 경로를 고려한다"는 보기가 나오면 틀린 것입니다. 할스테드는 코드의 '양'만 따지는 정적 분석 도구입니다.