다음 글은 연산자 &,&& 그리고 |,|| 에 대해 나일수님이 정리해 주신 글입니다
나일수님의 닷넷, 특히 윈도우응용프로그램에 스킬과 열정을 가진 닷넷개발자이며 저의 가까운 지인이기도 합니다
---------------------------------------------------------------------------------------------------------------------------------------
닷넷 프레임웍 2.0 부터 널 허용 형식(Nullable Type)이란 타입이 나왔었다.
이것은 값형식(Value Type) 도 참조형식 처럼(Reference Type) null 을 할당 할 수 있는 값형식이다.
널 허용 형식에 대한 이야기는 범위를 벗어나기 때문에 생략하고 널 허용 형식에 대해 기본적 지식이 있다는
전제하에 글을 쓴다.
우선 널 허용 형식 변수에 보면 Value 라는 프로퍼티와 HasValue 라는 프로퍼티가 있다.
하나씩 살펴보면 HasValue 는 이 변수에 값이 있다면 true 를 null 이라면 false 를 리턴한다.
Value 는 이 변수의 값을 리턴한다.
예를 들어보자.
int? i = null;
int j;
j = i;
이 구문은 얼핏 봐도 에러가 예상된다.
int 형 변수 j 에 null 을 대입하려는 시도가 컴파일 타임 에러를 발생시킨다.
에러를 걷어내보자.
int? i = null;
int j;
if(i.HasValue)
j = i.Value
else
j = 0;
이제 안전해 졌다.
이 구문은 아래와 같이 3항연산자를 이용할 수도 있다.
int? i = null;
int j;
j = i.HasValue ? i.Value : 0;
이 구문은 아래와 같이 ?? 연산자를 이용할 수도 있다.
?? 연산자에 대해 알아보자.
null 허용 형식은 값을 포함하거나, 정의되지 않은 상태일 수 있다.
?? 연산자는 null 허용 형식(위 예에서 i)이 null을 허용하지 않는 형식(위 예에서 j)에 할당될 때 반환할
기본값을 정의한다. 사용 방식은 이렇다.
null을 허용하지 않는 형식 = null 허용 형식 ?? 기본값
이것은 널 허용 형식이 null 일 경우 기본값을 null 이, 아닐 경우 null 허용 형식이 가지고 있는 Value 를 대입한다.
위 예를 ?? 연산자로 바꿔보자.
int? i = null;
int j;
j = i ?? 0;
구문이 한결 간결해 졌다.
사용방법이 어렵지도 않고 연산자의 의미만 잘 알고 있다면 굉장히 편리하게 사용할 수 있는 연산자 이다.
또한 ?? 연산자는 값형식 뿐만 아니라 참조형식에도 사용할 수 있다.
기억하는가? 위에서 살펴본 ?? 연산자의 정의를 말이다. 다시한번 살펴보자.
null을 허용하지 않는 형식 = null 허용 형식 ?? 기본값
(여기서 null 허용 형식이라 함은 nullable Type 도 해당 되지만 당연히 Reference Type 도 해당된다.)
string str = null;
string a;
a = str ?? "기본값";
여기쯤에서 참고로 알아둘 만한 리터럴 키워드가 있다.
default 가 그것인데 일단 다음을 살펴보자.
int? i = null;
int j;
j = i ?? default(int);
뭔가 좀 이상하지 않은가? default 라는 키워드는 흔히 switch 문에서만 봐오던 것인데 이렇게도 쓰이다니 말이다.
이 또한 닷넷 프레임웍 2.0 부터 지원하는데 2.0 부터는 switch 문의 기본 레이블을 지정하는것 뿐만 아니라
제네릭 코드로 사용될 때는 형식 매개 변수의 기본값을 지정한다.
제네릭에 대한 이야기 또한 이 글의 주제에서 벗어나므로 사용방법만 알아두자.
default(Type) 을 쓰면 기본값은 Type 이 참조 형식의 경우 null이고 값 형식의 경우 0 이다.
여기까지 ?? 연산자에 대해 알아보았다.
연산자에 대한 의미를 확실히 알고 쓴다면 보다 간결한 코드를 작성할 수 있다.