오늘은 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가지로 대체할 수 있어서 굳이 싶기도 하다.
이 글이 도움이 되었으면 좋겠다. 연산자 모음집해서 공부해도 재밌을 것 같다.
이상으로 도움이 되었길 바라며,
끝.
'게임 개발 > C#' 카테고리의 다른 글
C# 에서 문자열을 반복하는 가장 간단한 방법 - new string (0) | 2024.11.03 |
---|---|
이스케이프(escape) - 특수문자를 문자열로 바꾸는 법, 출력하는 법. (0) | 2024.08.01 |
C# - Possible null reference argument for parameter 's' in 'int int.Parse(string s)'. 오류 해결법 (CS8600, CS8604 (0) | 2024.07.29 |
dynamic programming(dp)와 메모이제이션(memoization) - C# (0) | 2024.07.10 |
유니티 C# override, virtual (0) | 2022.11.21 |
댓글