C# - Null 조건부 연산자 ?.

2025. 9. 21. 02:57·C#

Null 문제?

C# 프로그래밍을 하다 보면 NullReferenceException 이라는 오류를 종종 봤을 것이다.

이 오류는 객체가 null인데 그 객체의 메서드나 프로퍼티에 접근하려고 했을 때, 런타임에서 프로그램이 터져버리는 문제다.

 

예를 들어, 캐릭터를 형변환(as)했는데 실패하면 null이 반환된다.

그런 상황에서 그 캐릭터 클래스의 내부 데이터나 메서드에 접근하려고 하면 오류가 발생한다.

(party[0] as Hunter).Roll(); // 변환 실패 시 null.Roll() - NullReferenceException 발생

 

 

 

Null 조건부 연산자 (?.)

C# 6.0 부터 도입된 Null 조건부 연산자(?.)는, 객체가 null인지 아닌지를 간단히 확인하고, null일 경우 뒤에 메서드 호출이나 프로퍼티 접근을 건너뛰는 기능이다.

Javascript에서도 해당 기능을 볼 수 있다.

(party[0] as Hunter)?.Roll();

위 코드 블럭의 코드에서 party[0] as Hunter 변환을 성공하면 Hunter 타입 객체로 변환 후 Roll()을 실행할 수 있다.

하지만 변환 실패시 null이 반환되기 때문에 ?.를 통해 Roll()을 호출하지 않고 넘어가서 오류를 피할 수 있다.

프로그램이 오류를 마주할 때마다 터져버려서야 유저 입장에서는 너무 불편할 것이다.

이런 예외처리를 잘 해두는 것이 프로그래밍에서는 아주 중요하다.

 

abstract class Character
{
    public abstract void BaseAttack();
}

class Mage : Character
{
    public override void BaseAttack() => Console.WriteLine("스태프로 공격!");
    public void Teleport() => Console.WriteLine("텔레포트!");
}

class Hunter : Character
{
    public override void BaseAttack() => Console.WriteLine("총으로 공격!");
    public void Roll() => Console.WriteLine("구른다!");
}

class Program
{
    static void Main(string[] args)
    {
        Character[] party = { new Mage(), new Hunter() };

        // Null 조건부 연산자 사용
        (party[0] as Hunter)?.Roll(); // 출력 없음 (Mage는 Hunter가 아님 → null)
        (party[1] as Hunter)?.Roll(); // "구른다!" 출력
    }
}

 

 

is / as 와도 조합해서 사용할 수 있다.

foreach (var c in party)
{
    if (c is Mage)
        (c as Mage).Teleport();

    else if (c is Hunter)
        (c as Hunter).Roll();
}

// 위처럼 작성된 코드를 아래처럼 간단하게 바꿀 수 있다.

foreach (var c in party)
{
    (c as Mage)?.Teleport();
    (c as Hunter)?.Roll();
}

 

 

 

Nullable Value Type

?. 는 참조 타입뿐 아니라 Nullabel 값 타입에도 활용된다

예를들어 int?는 int에 null을 허용하는 타입이다.

int? score = null;
Console.WriteLine(score?.ToString() ?? "점수 없음");
// score가 null이면 "점수 없음" 출력

 

여기서 ??는 null 병합 연산자로, 왼쪽이 null이면 오른쪽 값을 반환한다.

즉 ?.와 함께 쓰면 안전하게 null 확인 + 기본값 제공 까지 쉽게 할 수 있다.

'C#' 카테고리의 다른 글

C# - 제네릭 (Generic)  (0) 2025.09.21
C# - 추상 클래스 실습 문제 풀이  (0) 2025.09.21
C# - 추상 클래스 (Abstract Class)  (0) 2025.09.21
C# - 오버로딩과 오버라이딩의 차이  (0) 2025.09.19
C# - 클래스 Static 실습 문제 풀이  (0) 2025.09.19
'C#' 카테고리의 다른 글
  • C# - 제네릭 (Generic)
  • C# - 추상 클래스 실습 문제 풀이
  • C# - 추상 클래스 (Abstract Class)
  • C# - 오버로딩과 오버라이딩의 차이
ellug
ellug
Web / App / Game Dev
  • ellug
    dev.ellug
    ellug
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • Javascript (React, Next) (1)
      • C# (66)
      • Graphics (1)
      • Unity (25)
      • 프로그래머스 (0)
        • Lv.0 (0)
        • Lv.1 (0)
        • Lv.2 (0)
        • Lv.3 (0)
      • AI Agent (0)
      • StableDiffusion (0)
      • ETC (1)
      • 잡담 (0)
      • 유머 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크
    struct
    inputsystem
    터미널
    추상 클래스
    C#
    큐
    stack
    Abstract
    Design Pattern
    최적화
    Queue
    콘솔
    function
    게임
    firebase
    delegate
    클래스
    interface
    useState
    Network
    자료구조
    class
    Photon
    알고리즘
    유니티
    스택
    console
    unity
    list
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ellug
C# - Null 조건부 연산자 ?.
상단으로

티스토리툴바