아무 것도 아닌(?) 팁이라고 해야 할까요?
사실 아무 것도 아닌 아주 간단한 팁입니다. 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;
처럼 말이죠.
이 널 병합 연산자는 저에게 매마른 대지에 단비 처럼.. 저의 복잡하고 읽기 힘든 코드를 깔끔하게 정리 하게 해준..... 정말 고마운 녀석입니다.
'Functional World > C#' 카테고리의 다른 글
C# SendMessage IPC (0) | 2015.06.25 |
---|---|
라운드 트립 서식... (0) | 2015.05.06 |
Collection Object Dispose() 쉽게 하기...... (0) | 2014.11.12 |
윈도우 8.1 에서의 장치 독립적 코드 작성을 위한 DPI 설정 방법 (0) | 2014.06.22 |
Form.ActiveForm (0) | 2013.11.07 |