널 병합 연산자..... :: iopeni - Think of C#

아무 것도 아닌(?) 팁이라고 해야 할까요?


사실 아무 것도 아닌 아주 간단한 팁입니다. C# 1에는 아주 특수한 타입이 하나 있습니다.


System.Type 을 상속 받은 값 형식의 자료형들은 null을 대입 할 수 없습니다.


그런데 이게 좀 곤란한 상황이 발생 할 때가 있습니다. 정의 할 수 없는 상태의 값들이 바로 그렇습니다. 사람이 살아 있는데 사망일을 기록하여야 한다면 DB에는 아마도 null을 대입하게 될 것입니다.


이 null을 어플리케이션 레이어로 들고 나와서 DateTime 타입의 변수에 저장 하려고 하면 값 형식 이기 때문에 대입 할 수 없고 이 상황은 오류를 발생 시킵니다.


이 문제를 해결 하기 위하여 Nullable 이라는 아주 특수한 자료형이 있습니다. 


Nullable<DateTime> a = null; 


과 같이 DateTime 자료형에 null을 대입 할 수 있도록 하는 아주 특수한 자료형이죠!


이 자료형이 C# 2 로 오면서 좀 더 사용하기 쉬워졌습니다.


DateTime? a = null;


과 같이 말이죠 Type 에 ?을 적어 줌으로 인해서 null을 대입 할 수 있습니다.


오늘 이야기를 하려고 하는 것은 Nullable 자료형을 이야기 하려고 하는 것은 아닙니다.


널인 값을 널이 대입될 수 없는 값 형식 자료형에 대입 하려고 하면 오류가 리턴 될 것이고, 이 변수가 널인지 아닌지 우리는 if else 문 또는 bool ? true : false;의 3항 연산자를 사용하게 됩니다.


참 이런 문장을 쓸 때 마다 답답합니다. 특히나 DB에서 들고 나와야 하는 필드가 무지 많은 상황이고 쿼리에 NVL을 이용한 널 처리를 하지 않았다면 또는 DateTime에 아주 특수한 의미의 MagicValue 라고 불리우는 개발자 나름대로의 규칙 즉 지금은 사용하지 않을 어떤 값을 특수한 목적의 상태를 가리키는 값으로 활용 아직 죽지 않은 사람이라면 사망일에 1년 1월 1일 과 같은 값을 대입하고 어플리케이션에서 1년 1월 1일 인 사람은 살아 있다고 판단하게 하는 ....


뭐 이런 상황이라면 각 필드 별로 많은 조건 판단을 하게 됩니다. 


이런 상황에서 만약 널이 아니면 값을 그대로 대입하고 널이라면 다른 값을 대입하라 라는 삼항연산자의 조건을 조금 더 쉽게 정리 할 수 있는 식이 있다면 얼마나 좋을까요?


Microsoft는 기대를 저버리지 않았습니다.


바로 널 병합 연산자라고 불리우는 ?? 가 바로 그것 입니다.


아래 와 같은 문법이죠..


int? a = null;

int b = a ?? 5;


와 같이 쓰는 거죠. 이 녀석은 중첩 될 수 있습니다.


int b = null ?? null ?? null ?? ........ ?? 5;


처럼 말이죠.


이 널 병합 연산자는 저에게 매마른 대지에 단비 처럼.. 저의 복잡하고 읽기 힘든 코드를 깔끔하게 정리 하게 해준..... 정말 고마운 녀석입니다.

Posted by 프로그래머란 카페인을 코드로 변환하는 기계다
,