C# NullReferenceException(널 참조 예외)이란?
NullReferenceException은 C#에서 가장 자주 만나게 되는 런타임 예외 중 하나입니다. 이 예외는 값이 null인 객체의 멤버 필드나 메서드에 접근하려고 할 때 발생합니다. 즉, 실제 인스턴스가 존재하지 않는 참조 변수를 사용하려는 순간 런타임에서 오류를 던지게 됩니다.
예를 들어, 문자열 변수에 null을 할당한 뒤 해당 변수의 Length 속성에 접근하면 객체가 실제로 존재하지 않기 때문에 예외가 발생합니다.
예제 코드
아래 코드는 null인 문자열의 길이를 확인하려다 NullReferenceException이 발생하는 대표적인 사례입니다.
using System;
class Demo {
static void Main() {
string str = null;
// str은 null이므로 Length 속성에 접근하는 순간 예외 발생
if (str.Length > 0) {
Console.WriteLine(str);
}
}
}실행 결과
위 코드를 실행하면 다음과 같이 Unhandled Exception(처리되지 않은 예외) 형태로 프로그램이 비정상 종료됩니다. null을 가리키는 멤버에 접근했기 때문입니다.
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object at Demo.Main () [0x00002] in <0bc5fbf292484d5194a19866ae5c2018>:0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object at Demo.Main () [0x00002] in <0bc5fbf292484d5194a19866ae5c2018>:0
NullReferenceException 예방 방법
이러한 오류를 방지하려면 객체를 사용하기 전에 반드시 null 여부를 확인해야 합니다.
1. 명시적인 null 검사
if (str != null && str.Length > 0) {
Console.WriteLine(str);
}2. null 조건부 연산자(?.) 사용
C# 6.0부터 도입된 ?. 연산자를 사용하면 참조가 null일 때 예외 대신 null을 반환합니다.
int? length = str?.Length;
3. null 병합 연산자(??) 활용
string result = str ?? "기본값";
이처럼 null 검사 습관과 안전한 연산자를 활용하면 NullReferenceException으로 인한 런타임 오류를 효과적으로 줄일 수 있습니다.