C# 에서 ? 는 변수가 null을 가질 수 있는 타입임을 선언하는 기호입니다.
? ( nullable ) 선언
string text1 = null;
string? text2 = null;
두 변수 모두 null이지만,
text1.ToString() 을 호출하면 실행 중 null 값 참조 오류를 발생시킵니다.
text1 은 null 이므로 현재 아무것도 가리키고 있지 않습니다.
아무것도 가리키지 않는 변수에 .ToString() 으로 접근하려 하면 실행 중 오류가 발생합니다.
이 상황을 말로 풀어쓰면,
아무 생각이 없는 사람에게 "점심으로 뭘 먹을까요?" 라고 묻는 것과 같습니다.
애초에 아무 생각이 없는데, 그 사람에게 무슨 생각을 물어본다는 것 자체가 오류인 것입니다.
반면, text2 는 "이 변수는 null일 수 있다." 는 사실을 컴파일러가 인지하도록 도와줍니다.
하지만 단순히 컴파일러가 인지한다고 해서 예외가 자동으로 방지되는 것은 아닙니다.
이후에 접근하는 곳에서 ?.을 사용해 별도의 처리를 해 주어야 합니다.
?. ( null-conditional operator )
따라서 ? (nullable) 선언과 ?. (null-conditional operator) 는 구분할 수 있어야 합니다.
Console.WriteLine(text2?.ToString());
위 코드에서 ?.ToString() 은 text2가 null이면 .ToString() 을 호출하지 않고 null 을 반환합니다.
즉, null일 경우 객체의 멤버나 함수에 접근을 시도하지 않으므로 오류가 발생하지 않습니다.
이것을 위의 예로 말씀드리면, ?. 표시는 "나는 가끔 아무 생각을 하지 않기도 합니다" 라고 상대방에게 알려주는 기호입니다. 그래서 상대방은 생각을 하고 있을때와 안하고 있을때를 구분할 수 있게 됩니다.
생각을 하고 있다면 '무슨 생각을 하세요?' 라고 질문을 할 수 있게 되고, 아무 생각을 안하고 있는걸 알아차리게 된다면 '아 ~ 지금 이 사람은 아무 생각을 안하고 있으니 질문을 하지 말아야겠다' 라고 판단할 수 있게 되는 것입니다.
?? ( null 병합 연산자 )
? 로 선언된 변수가 현재 null이라면, 별도의 처리를 하거나 무시할 수도 있습니다.
이때 별도의 처리가 필요할 때 사용하는 기호가 ?? (null 병합 연산자) 입니다.
?? 는 "왼쪽 항이 null이면 오른쪽 항으로 처리해라." 라는 의미를 가집니다.
string text = null;
string result = text ?? "empty"; // text가 null이면 "empty" 할당
Console.WriteLine(result); // 출력: empty
그렇지만 대체로 ? (nullable) 과 함께 사용하면 더욱 안전한 코드가 됩니다.
string? text = null;
// text가 null이 아니면 ToString(), null이면 "empty"
string result = text?.ToString() ?? "empty";
Console.WriteLine(result); // 출력: empty
이처럼 ? / ?. / ?? 를 적절히 활용하면 null 을 안전하게 처리할 수 있습니다.
'C#' 카테고리의 다른 글
1. yield return 에 대해 (개념) (0) | 2025.03.09 |
---|---|
Action 과 Func 의 형변환 살펴보기 (0) | 2025.03.08 |
=> (람다 연산자) 이해하기 (0) | 2025.03.08 |
제네릭 (Generic) <T> 에 대해서 (0) | 2025.03.05 |
배열은 참조 타입입니다 (0) | 2025.03.05 |