게임 개발/C#

C#에서 ?와 ??의 의미, null을 판단하는 방법(null 조건부 연산자, null 병합 연산자)

UniCoti(유니코티) 2024. 7. 30. 01:15
반응형

오늘은 C#에서 null을 판단하는 방법에 대해서 알아보도록 하겠다.

많은 용도로, 많은 곳에서 편하게 쓸 수 있는 효과적인 연산자이다.

? 는 null 조건부 연산자라고 불리고,?? 는 null 병합 연산자라고 불린다.

 

둘 다 null인 경우에 예외 처리를 하기 위해서 존재하는 연산자이다.

? 에 대해서 먼저 알아보고,?? 에 대해서 알아보면서 글을 마치겠다.


1.? : null 조건부연산자

먼저 정의는 객체가 null인지 판단하여 null이라면 실행 자체가 되지 않는다.

흔히 일어나는 오류인 NullReferenceException을 방지할 수 있게 되며, 예외 처리에 용이하다.

코드로 설명하면 더욱 직관적으로 알 수 있을 것이다.

using System;

namespace unicoti {
    class Program {
        static void Main(string[] args) {
            string input = Console.ReadLine();
            string[] result = input.Select(c => c.ToString()).ToArray() ?? Array.Empty<string>();
        }
    }
}

 

만약 이런 코드가 있다고 가정하자. input이라는 변수로 한 줄을 읽어 들이고 저장한다.

이후 한 칸씩 나눠 result라는 문자열 배열에 저장하는 코드이다.

 

경고 화면

하지만 이걸 IDE에 넣어보면 이렇게 경고가 뜨는 걸 볼 수 있다.

null이 들어갈 수 있는 가능성이 있어서 경고가 뜨는 것이다. 이럴 때 우리가 배운 걸 응용해 주면 된다.

"객체"가 null일 때 뒤에?을 붙이면 null일 때 코드가 실행되지 않는다.

따라서 다음과 같이 고쳐보면 경고가 하나 사라지는 걸 볼 수 있다.

using System;

namespace unicoti {
    class Program {
        static void Main(string[] args) {
            string input = Console.ReadLine();
            string[] result = input?.Select(c => c.ToString()).ToArray() ?? Array.Empty<string>();
        }
    }
}

(input 뒤에?를 추가했다)

 

코드 사진

그러면 이렇게 input 쪽 경고가 사라진 걸 볼 수 있다.

null이 나올만한 상황을 없애버린 것이라 해석하면 된다.

2.?? : null 병합 연산자

이것도 비슷한 개념이지만 조금 더 쉽다. 삼항연산자와 약간 비슷하기도 한데 좀 더 쉬운 버전이다.

삼항연산자에서 조건에 null인지를 판단하는 코드를 넣은 것과 비슷하다.

이것도 코드로 쓰는 법을 알아보자.

경고 사진

이 코드를 보면 Console.ReadLine()에 경고가 있는 걸 볼 수 있다.

값이 null일 수 있어서 경고가 뜨는 것인데, 이때 null이면 기본값을 주도록 해보자.

 

뒤에 ??"기본값"이 추가되었다.

저렇게??"기본값"이라고 적어주게 되면, 앞의 객체가 null의 값을 가질 때 "기본값"으로

값이 정해지게 된다. null에서만 해당되는 예외처리 기법이라고 보면 편하다.

null에 대한 삼항연산자의 특징을 가지기도 하는 것 같다.

이게 더 사용하기 쉽기에 이건 익혀두었으면 좋겠다.

 

만약에 이걸 모르면 삼항연산자를 쓰거나, 더 기초적으로 생각하면 if문을 써야 한다.

사용도 편리하고 쓸모도 많으니까 익혀두었으면 좋겠다.


지금까지 null에 대한 예외처리 기법 2가지를 알아봤다.

? 와??로 둘 다 물음표를 사용했는데, 그러면??? 도 존재하지 않을까 싶다.

찾아봤더니 그런 건 없고??= 연산자는 있다고 한다. 나중에 다루면 좋을 것 같다.

근데 앞서 소개한 2가지로 대체할 수 있어서 굳이 싶기도 하다.

이 글이 도움이 되었으면 좋겠다. 연산자 모음집해서 공부해도 재밌을 것 같다.


이상으로 도움이 되었길 바라며,

 

끝.

반응형