본문 바로가기
코딩취미/C,C++

Null 조건부 연산자 사용방법 정리 : _PopUp?.Close() 코드, ? (물음표)연산자

by 브링블링 2024. 8. 8.
반응형

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!");
    }
}

 

반응형