C#은 일반적인 값 범위뿐만 아니라 null 값도 할당할 수 있는 특수한 데이터 타입인 nullable 타입(널 가능 형식)을 제공합니다.
nullable 타입은 C# 2.0에서 도입되었으며, 값 형식(value type) 변수에 null을 할당할 수 있도록 지원합니다. 선언 방법은 Nullable<T> 형태이며, 여기서 T는 기본 타입을 의미합니다. 축약 표현으로는 타입 뒤에 물음표(?)를 붙여 int?처럼 사용할 수 있습니다.
Nullable 타입의 주요 특징
nullable 타입은 값 형식(int, double, bool 등)에만 사용할 수 있습니다.
Value속성은 값이 null일 경우InvalidOperationException을 발생시키며, 값이 존재하면 해당 값을 반환합니다.HasValue속성은 변수에 값이 포함되어 있으면 true를, null이면 false를 반환합니다.nullable 타입에는 == 및 != 연산자만 직접 사용할 수 있으며, 그 외 비교 연산에는
Nullable정적 클래스를 활용해야 합니다.중첩된 nullable 타입은 허용되지 않습니다. 예를 들어
Nullable<Nullable<int>>로 선언하면 컴파일 오류가 발생합니다.
문자열을 nullable int로 변환하기
문자열을 nullable int로 변환하는 가장 안전한 방법은 int.TryParse를 활용하는 것입니다. 변환에 실패하면 예외를 던지는 대신 false를 반환하므로, 실패 시 null을 반환하는 확장 메서드로 깔끔하게 구현할 수 있습니다.
예제 1: 숫자 문자열 변환
static class Program{
static void Main(string[] args){
string s = "123";
System.Console.WriteLine(s.ToNullableInt());
Console.ReadLine();
}
static int? ToNullableInt(this string s){
int i;
if (int.TryParse(s, out i)) return i;
return null;
}
}출력
123
예제 2: null 문자열 처리
null이 확장 메서드에 전달되면 변환에 실패하여 아무 값도 출력되지 않습니다. 이처럼 int.TryParse는 잘못된 입력이나 null에 대해 예외를 발생시키지 않고 안전하게 처리한다는 장점이 있습니다.
static class Program{
static void Main(string[] args){
string s = null;
System.Console.WriteLine(s.ToNullableInt());
Console.ReadLine();
}
static int? ToNullableInt(this string s){
int i;
if (int.TryParse(s, out i)) return i;
return null;
}
}정리
문자열을 nullable int로 구문 분석할 때는 int.TryParse와 확장 메서드를 조합하는 것이 가장 권장되는 패턴입니다. 이 방식은 유효하지 않은 입력에서도 예외 없이 null을 반환하므로, 숫자 변환이 실패할 수 있는 상황에서 코드의 안정성과 가독성을 모두 높여줍니다.