[C#/.NET] Nullable : ? (Null 조건 연산자)
본문 바로가기
프로그래밍/C++ \ C#

[C#/.NET] Nullable : ? (Null 조건 연산자)

by [아마군] 2019. 9. 3.
반응형

코딩을 하다보면 인자로 넘긴 primitive 타입의 변수를 2가지 용도로 사용하는 경우가 있다.

 

예를 들면 int 형 변수를 갯수로 사용하기 위해 넘기되 그 값을 정상적인 상황에서 들어가지 않을 값으로 넣어서 예외처리를 하는 경우다.

 

1
2
3
4
5
6
7
8
9
10
public void TestFunc(int count)
{
    if (count == -1)    // or count == int.MaxValue
    {
        Reset();
        return;
    }
     
    m_cnt = count;
}
c#

또는 bool 형의 추가 인자를 넣어서 기능을 분리할 수도 있지만 어쨌든 이쁘지 않다.

 

이런 경우 Null 조건 연산자를 사용하면 훨씬 깔끔하게 처리할 수 있다.

 

단지 변수 선언 시 ? 하나만 추가해 주면 값 타입(value type) 인 int, float, bool, double 등의 primitive 자료형에 null 을 넣어줄 수 있게 된다.

1
2
3
4
5
6
7
8
9
10
public void TestFunc(int? count)
{
    if (count == null)
    {
        Reset();
        return;
    }
    
    m_cnt = (int)count;
}
c#

 

이 예에서는 크게 달라 보이지 않지만 잘 응용하면 훨씬 깔끔하고 직관적인 코드를 짤 수 있다.

 

추가로 매우 유용한 null 관련 연산자 들이 더 있다.


?. / ?[] 연산자

 

프로그래밍 하면서 매우 자주 마주치게 되는 null 의 예외처리 하는데 매우 유용한 연산자이다.

 

  • ?. 또는 ?[] 왼쪽의 변수가 null 일 경우 null 을 리턴
  • ?. 또는 ?[] 왼쪽의 변수가 null 이 아닐 경우 오른쪽의 속성을 리턴하거나 메서드를 실행
  • ?. 와 ?[] 의 차이는 일반 변수의 null 을 체크 할 것인가 아니면 배열 요소에 접근하느냐로 구분
1
2
3
4
5
6
7
string strName = null;
int? nameLen = strName?.Length;    // strName 은 null 이므로 .Length 에 접근하지 않고 null 을 리턴
 
List<MyPosition> positions = new List<MyPosition>();
//position 이 null 인지 체크 후 position[0] 이 null 인지 체크.
//position 이나 position[0] 이 null 이면 pos = null 이지만 아니라면 pos = position[0].pos
int? pos = position?[0]?.pos;    
c#

?? 연산자

 

?? 연산자 역시 null 예외처리 연산자 이지만 사용법이 조금 다르다.

 

  • ?? 왼쪽의 변수가 null 일 경우 오른쪽 값을 리턴
  • ?? 왼쪽의 변수가 null 이 아닐 경우 왼쪽 변수의 값을 리턴
1
2
3
int? count = null;
int cnt = count ?? 100;    //count 가 null 이므로 오른쪽 100 이 리턴되어 cnt = 100
                        //만약 count 가 null 이 아니고 값이 있다면 cnt = count
c#

Nullable 연산자를 활용하면 안전하면서 코드도 훨씬 간결해진다.

 

적극적으로 사용하자!

반응형

댓글