0Pricing
C# Academy · 강의

널 조건부 연산자

?.로 안전하게 접근해 보세요.

널 조건부 연산자은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

널 연쇄 참조의 문제

null 참조의 멤버에 접근하면 NullReferenceException이 발생합니다. 이는 C#에서 가장 흔한 실행 중 충돌 중 하나입니다.

user.Address.City처럼 호출을 연결하면 연쇄된 각 부분이 널일 수 있습니다. 예전에는 여러 if 검사문을 겹겹이 작성해 이 문제를 해결했습니다.

널 조건부 연산자 ?. 알아보기

널 조건부 연산자 ?.는 전체 식의 평가를 중단합니다. 왼쪽이 null이면 예외 대신 null을 결과로 반환합니다.

이는 "개체가 널이 아닐 때만 이 멤버에 접근한다"는 의미로 읽으면 됩니다.

string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);

결과가 널 허용 형식이 됩니다

?.는 null을 반환할 수 있으므로 결과 형식이 널 허용 형식이 됩니다. name?.Length는 int가 아니라 int?입니다.

따라서 이 결과를 일반 int가 아닌 int?에 저장해야 합니다.

string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);

실행 가능한 예제

이 프로그램은 개체가 있으면 ?.가 값을 반환하고, 개체가 없으면 null을 반환하는 모습을 보여 줍니다.

실행해 보고 예외가 한 번도 발생하지 않는다는 점을 확인해 보세요.

using System;

class Program
{
    static void Main()
    {
        string a = "world";
        string b = null;
        Console.WriteLine(a?.ToUpper());
        Console.WriteLine(b?.ToUpper() ?? "(null)");
    }
}

여러 ?. 연산자 연결하기

여러 멤버에 걸쳐 ?.를 연결할 수 있습니다. 어느 한 부분이라도 null이 되면 전체 연쇄가 즉시 중단되고 null을 반환합니다.

따라서 customer?.Order?.Total은 customer나 Order가 널이어도 안전합니다.

string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);

널 조건부 인덱서 ?[]

배열과 목록에는 ?[]라는 인덱서 형식도 사용할 수 있습니다. 컬렉션이 null이면 인덱스 접근이 충돌하지 않고 null을 반환합니다.

참고로 이 기능은 컬렉션이 널인 경우를 처리할 뿐, 범위를 벗어난 인덱스는 처리하지 않습니다.

int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);

메서드를 안전하게 호출하기

?.는 메서드 호출도 보호합니다. list?.Clear()는 list가 널이 아닐 때만 Clear를 호출하고, 그렇지 않으면 아무 작업도 하지 않습니다.

void를 반환하는 메서드에서는 널일 때 전체 문이 단순히 아무 작업도 하지 않는 동작이 됩니다.

System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");

스레드로부터 안전한 이벤트 발생

대표적인 사용 사례는 이벤트를 발생시키는 것입니다. SomeEvent?.Invoke(this, args)는 하나 이상의 처리기가 구독되어 있을 때만 이벤트를 안전하게 발생시킵니다.

이 방식은 검사와 호출 사이에 경쟁 상태가 발생할 수 있었던 예전의 널 확인 방식을 대신합니다.

System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");

??와 함께 사용하기

?.는 널 병합 연산자인 ??와 자연스럽게 함께 사용하여 연쇄 결과가 널일 때 대체값을 제공할 수 있습니다.

name?.Length ?? 0은 이름의 길이를 반환하고, name이 널이면 0을 반환합니다.

string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);

주의해야 할 미묘한 함정

최종 값 형식이 널을 허용하지 않더라도 ?.를 사용하면 식은 널 허용 형식이 됩니다. list?.Count는 int가 아니라 int?입니다.

일반 int가 필요하다면 뒤에 ?? 0을 추가하거나 GetValueOrDefault()를 사용하세요.

var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);

전체 비교

이 프로그램은 장황한 if 방식과 간결한 ?. 방식을 비교합니다. 두 방식 모두 예외를 방지하지만, ?. 쪽이 훨씬 깔끔합니다.

using System;

class Program
{
    static void Main()
    {
        string s = null;
        int len = s != null ? s.Length : -1;
        Console.WriteLine(len);
        Console.WriteLine(s?.Length ?? -1);
    }
}

빠른 확인

널 조건부 연산자에 대한 이해를 확인해 보세요.

정리

널 조건부 연산자 ?.와 인덱서 ?[]는 개체가 null일 때 멤버 접근을 중단하고, 예외를 발생시키는 대신 null을 반환합니다.

결과는 널 허용 형식이 되므로 ??와 함께 사용해 대체값을 제공하세요.

자주 묻는 질문

“널 조건부 연산자” 강의는 무료인가요?

네 — “널 조건부 연산자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“널 조건부 연산자”에서 뭘 배우나요?

?.로 안전하게 접근해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“널 조건부 연산자” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 널 허용 값 형식
  2. 널 조건부 연산자
  3. 널 병합 연산자
  4. 널 방어하기
← C# Academy(으)로 돌아가기