Null 조건부 연산자 사용방법 정리 : _PopUp?.Close() 코드, ? (물음표)연산자
?. 연산자는 C#에서 Null 조건부 연산자 (Null-conditional operator)라고 불리며, 객체가 null인지 확인하고, null이 아닌 경우에만 해당 객체의 메서드나 속성을 호출하거나 접근하는 데 사용됩니다. 좀 더 자세하게 설명하면 Null 조건부 연산자(?.)는 C# 6.0에서 도입된 기능으로, 객체가 null인지 여부를 확인하고, null이 아닌 경우에만 해당 객체의 속성, 메서드, 또는 인덱서를 호출하거나 접근할 수 있게 합니다. 이 연산자는 null 참조 예외(NullReferenceException)를 피하면서도 코드를 간결하게 유지할 수 있도록 도와줍니다.
개발된 배경
C#에서 객체의 속성이나 메서드를 호출하기 전에 해당 객체가 null인지 확인하는 것은 매우 흔한 패턴입니다. 전통적인 방식에서는 이 작업을 위해 여러 번의 if 문을 사용해야 했는데, 이는 코드의 가독성을 떨어뜨리고 반복적인 작업을 유발할 수 있었습니다. null 참조 예외는 런타임 오류 중 가장 흔한 오류 중 하나로, 이를 방지하기 위한 코드를 간결하게 하기 위해 Null 조건부 연산자가 개발되었습니다.
- 사용할 수 있는 버전
- Null 조건부 연산자는 C# 6.0 (2015년에 발표) 이상에서 사용할 수 있습니다. 따라서 .NET Framework 4.6 이상 또는 .NET Core를 사용하는 프로젝트에서는 이 연산자를 사용할 수 있습니다.
_PopUp?.Close() 코드에서 사용한 이유
1. Null 참조 예외 방지: 객체가 null인 상태에서 메서드를 호출하면 NullReferenceException이 발생합니다. ?. 연산자를 사용하면 이 예외를 안전하게 방지할 수 있습니다.
// 예: 객체가 null인 경우 예외 발생
_PopUp.Close(); // 만약 _PopUp이 null이면 NullReferenceException 발생
// 예: null 안전하게 처리
_PopUp?.Close(); // _PopUp이 null이면 아무것도 하지 않음
2. 간결하고 읽기 쉬운 코드: ?. 연산자를 사용하면 null 체크를 위한 조건문(if)을 별도로 작성하지 않고도, 객체가 null인지를 안전하게 처리할 수 있어 코드가 간결해집니다.
// 전통적인 방법: if 문으로 null 체크
if (_LoadingPopUp != null)
{
_LoadingPopUp.Close();
}
// 간결한 방법: ?. 연산자 사용
_LoadingPopUp?.Close();
레퍼런스
Null 조건부 연산자와 관련된 공식 문서와 자세한 설명은 Microsoft의 C# 공식 문서에서 확인할 수 있습니다.
Null 조건부 연산자를 사용하는 방법
1. 객체의 속성 접근:
- 객체가 null인 경우, 그 속성에 접근하지 않고 null을 반환합니다.
var length = myString?.Length; // myString이 null이면 length는 null이 됩니다.
2. 메서드 호출:
- 객체가 null인 경우, 메서드를 호출하지 않습니다.
myObject?.DoSomething(); // myObject가 null이면 DoSomething()은 호출되지 않습니다.
3. 인덱서 접근:
- 객체가 null인 경우, 인덱서를 호출하지 않습니다.
var value = myDictionary?[key]; // myDictionary가 null이면 value는 null이 됩니다.
4. 데리게이트 호출:
- 데리게이트가 null이면 호출하지 않고 null을 반환합니다.
myDelegate?.Invoke(param); // myDelegate가 null이면 Invoke가 호출되지 않습니다.
* 예제 코드:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 예제 1: 객체의 속성 접근
string myString = null;
int? length = myString?.Length;
Console.WriteLine(length.HasValue ? length.Value.ToString() : "null"); // 출력: null
// 예제 2: 메서드 호출
MyClass myObject = null;
myObject?.PrintMessage(); // myObject가 null이므로 메서드가 호출되지 않음
// 예제 3: 인덱서 접근
Dictionary<string, string> myDictionary = null;
string value = myDictionary?["key"];
Console.WriteLine(value ?? "null"); // 출력: null
// 예제 4: 데리게이트 호출
Action myDelegate = null;
myDelegate?.Invoke(); // myDelegate가 null이므로 호출되지 않음
}
}
class MyClass
{
public void PrintMessage()
{
Console.WriteLine("Hello, World!");
}
}
'코딩취미 > C,C++' 카테고리의 다른 글
프로그래밍 goto의 오해와 진실, 구조적 패턴 10가지 (0) | 2024.08.27 |
---|---|
C#에서 예외 처리를 하는 5가지 방법(try-catch) (0) | 2024.08.09 |
Visual Studio의 개발 역사와 특이점 (0) | 2024.08.02 |
Visual Studio Code 특징과 Professional, Community 비교 + 적합한 /비적합한 개발분야 (0) | 2024.08.01 |
Microsoft Visual Studio Professional, Microsoft Visual Studio Community 의 특징과 차이점 (0) | 2024.08.01 |