C#에서 ? 연산자란

C#에서 ? 연산자, 그리고 ?? 연산자는 null 값을 안전하게 사용할 수 있도록 해주는 연산자입니다. ? 를 사용하는 연산자는 크게 널 조건부 연산자(Null-conditional operator)와 널 병합 연산자(Null-coalescing operator)로 구분할 수 있습니다. 흔히 삼항 연산자로 불리는 ?: 연산자가 있지만, 이번에는 다루지 않겠습니다.

널 조건부 연산자 (Null-conditional operator)

널 조건부 연산자는 접미사로 쓰이며 해당 객체가 null 값인지 아닌지를 확인하고, null 값이 아닌 경우에만 특정 속성이나 메서드를 호출하도록 하는 연산자입니다.

아래의 일반적인 if 문을 활용한 예외처리를 한 번 살펴봅시다.

아주 단순한 코드이지만, 널 참조 예외(NullReferenceException)를 방지하기 위해 코드를 if 문을 이용해서 작성해야만 했습니다. 이때 ? 연산자를 사용하게 되면, 아래와 같이 보다 쉽게 null 값 여부를 확인하고 실행할 수 있습니다.

? 연산자는 배열에서도 사용할 수 있습니다. 사용법은 위와 비슷합니다.

이처럼 null 에서만큼은 굉장히 편리한 연산자이지만, ? 연산자는 단순하게 널 참조 예외만 출력되지 않기 때문에 실제로 코드를 작성할 때는 주의가 필요합니다. 단순하게 null 값의 여부만을 확인하고 객체에 접근하는 특성 때문에 해당 객체의 null 값으로 인한 오류를 빠르게 파악하기 어려울 수 있기 때문이죠.

또한 null 값이 아닐 때에만 실행되는 코드가 필요하다면 if 문 같이 확실하게 확인하고 코드를 작성하는 것이 오히려 좋을 수 있습니다.

? 연산자를 사용하고자 한다면 상황에 따라 신중하게 사용하는 것이 좋겠습니다.

널 병합 연산자 (Null-coalescing operator)

?? 널 병합 연산자는 해당 값이 null인 경우, 대체 값을 제공하는 데 사용되는 연산자입니다. 이 연산자는 왼쪽 피연산자가 null 값이면 오른쪽 피연산자의 값을 반환합니다.

이번에도 역시 if 문으로 예외 처리를 먼저 해봅시다.

‘Hello World’ 를 무사히 출력했습니다만, 단순한 코드가 너무 길게 느껴집니다. 이때 사용할 수 있는 것이 널 병합 연산자입니다. 아래의 예시처럼 사용하면 쉽게 ‘Hello World’를 출력할 수 있게됩니다.

추가로 ??= 널 병합 연산자를 사용할 수도 있습니다. ??= 연산자는 왼쪽 피연산자가 null 일때, 오른쪽 피연산자를 왼쪽에 대입하게 됩니다.

위의 예시를 조금 수정하면 아래처럼 표현할 수도 있습니다.

널 병합 연산자는 주로 변수에 기본 값을 설정할 때 유용합니다. null 값을 처리할 때 코드를 간결하게 작성할 수 있으며, 코드의 가독성을 높여줍니다.

참고자료

  • ? 연산자 관련 문서
  • ?? 연산자 관련 문서
1개의 좋아요