오류(Error) 또는 예외(Exception)란 프로그램 실행 도중 코드가 중단되어 최종 사용자가 기대한 결과를 얻지 못하는 상황을 가리킵니다. 오류가 발생하거나 발견되는 시점에 따라 크게 컴파일 타임 오류(Compile Time Error)와 런타임 오류(Runtime Error) 두 가지로 분류할 수 있습니다.
컴파일 타임 오류와 런타임 오류의 핵심 차이점
| 번호 | 구분 | 컴파일 타임 오류 | 런타임 오류 |
|---|---|---|---|
| 1 | 참조 대상 | 주로 문법(Syntax) 또는 의미(Semantics)와 관련된 오류를 의미합니다. | 코드가 실제로 실행되는 시점(runtime)에 발생하는 오류를 의미합니다. |
| 2 | 발견 시점 | 코드 개발 단계에서 컴파일러에 의해 즉시 발견됩니다. | 컴파일러가 감지하지 못하므로, 프로그램 실행 시점에 비로소 식별됩니다. |
| 3 | 수정 방식 | 개발 단계에서 바로 수정할 수 있습니다. | 코드 실행 후 오류가 확인된 이후에야 수정 작업이 진행됩니다. |
예제로 살펴보는 두 오류의 차이
1. 컴파일 타임 오류 예제
아래 코드는 printf 문 끝에 세미콜론(;)이 누락되어 컴파일러가 오류를 검출하는 대표적인 사례입니다.
CompileDemo.c
#include <stdio.h>
int main(void) {
int x = 100;
int y = 155;
// 세미콜론 누락
printf("%d", x + y)
return 0;
}
출력 결과
error: expected ';' before '}' token
컴파일러가 세미콜론이 빠진 위치를 정확히 알려주기 때문에, 개발자는 프로그램을 실행하기 전에 즉시 수정할 수 있습니다.
2. 런타임 오류 예제
아래 코드는 문법적으로는 올바르지만, 0으로 나누는 연산이 포함되어 있어 실행 시점에 문제가 발생합니다.
RuntimeDemo.c
#include <stdio.h>
int main(void) {
int n = 9;
int div = 0;
div = n / 0; // 런타임 오류: 0으로 나누기
printf("result = %d", div);
return 0;
}
출력 결과
warning: division by zero [-Wdiv-by-zero] div = n / 0;
이 코드는 컴파일 자체는 통과할 수 있지만, 실행 과정에서 0으로 나누는 연산 때문에 비정상 종료되거나 경고가 발생합니다. 이처럼 런타임 오류는 프로그램을 직접 실행해 보기 전에는 발견하기 어렵습니다.
정리
컴파일 타임 오류는 개발 단계에서 컴파일러가 미리 잡아주는 오류라 비교적 쉽게 수정할 수 있는 반면, 런타임 오류는 프로그램 실행 중에 나타나기 때문에 철저한 사전 테스트와 디버깅이 필수입니다. 두 오류의 특성을 정확히 이해하면 더욱 안정적인 C 프로그램을 작성할 수 있습니다.