[C#] 널 조건 연산자 (Null-Conditional Operator)
널 조건 연산자란?
널 조건 연산자는 c# 6.0부터 사용가능한 연산자로 변수의 null 체크를 할 수 있는 편리한 기능이다. 기존에는 특정 객체가 null값인 상태로 참조하려 할 때 NullReferenceException이 발생하는 상황을 막기 위해 변수마다 예외처리를 해야만 했다. 하지만 널 조건 연산자를 사용하면 같은 기능을 수행하면서 보다 편리하고 가독성 있는 코드를 작성할 수 있게된다.
널 조건 연산자 사용 방법
사용 방법은 다음과 같다.
public string testFunc(string temp)
{
//temp가 null이라면 null 반환하고 아니라면 Replace 리턴 값 반환합니다.
return temp?.Replace("-","");
}
특정 인덱스를 참조하는 경우에도 사용 가능하다.
public string testFunc(List<string> temp)
{
//temp가 null이라면 nulll을 반환하고 아니라면 Replace() 리턴 값을 반환합니다.
return temp?[0].Replace("-","");
}
이 처럼 null 값을 체크하고자 하는 객체 뒤에 "?'를 붙여 예외처리가 가능하다. temp라는 변수가 null일 경우에는 "?" 뒤에 있는 동작을 더 이상 수행하지 않고 null을 반환하고 값이 있을 경우에는 그대로 동작을 수행함으로서 런타임중에 exception이 발생하지 않는다. if문을 사용하여 동일한 기능을 수행하기 위해서는 단순한 값 체크를 하는 코드가 길어지게 되기 때문에 코드의 전반적인 가독성이 하락하기 때문에 널 조건 연산자를 활용하면 많은 도움이 된다.
하지만 "?" 연산자는 참조하려는 객체가 null일 경우에 오직 null만을 반환하기 때문에 반환 타입이 null 값을 받을 수 없는 타입이라면 이를 해결하기 위해 또 다시 불필요한 코드 작성을 해야한다. 예를 들면,
public bool testFunc(string temp)
{
// 컴파일 에러
// 반환타입은 bool인데 널 조건 연산자는 null을 반환할 수도 있기때문
return temp?.Equals("test");
}
만약 위의 문제를 1차원적으로 해결한다면 아래와 같은 코드가 나올 것이다.
public bool testFunc(string temp)
{
if(temp?.Equals("test") == null)
{
return false;
}
else
{
return true;
}
}
예외 처리에 대한 코드를 줄임으로서 코드의 가독성을 향상시키기 위해 널 조건 연산자를 사용하는 것인데, 위와 같이 해결하면 사용하는 의미가 없다. 하지만 C#에서는 이러한 상황을 해결하기 위한 또 다른 연산자 "??" 를 제공한다.
"??" 연산자는 "?" 연산자를 통해 나온 값이 null일 경우 원하는 값을 반환할 수 있도록 하는 연산자이다. "??" 연산자를 사용해 위의 문제를 해결하면 다음과 같다.
public bool testFunc(string temp)
{
// "?" 연산자를 통해 null일 경우 false 값을 반환합니다.
return temp?.Equals("test") ?? false;
}
이 처럼 코드의 끝에 "??"를 사용하여 null일 경우 false를 반환 시켜 처음에 의도했던 기능을 다시 한 줄로 표현할 수 있다.
C#에서는 널 조건 연산자 뿐만 아니라 코딩을 위한 많은 편의기능이 존재하기 때문에 이를 잘 활용하면 개발 속도 뿐만 아니라 코드의 품질도 향상시킬 수 있다.