※ 일반적으로 Value타입은 null이 없음. Reference타입은 null은 있음.
※ 필요한 사전지식 : 값/참조형식의 의해
Nullable 타입
Value타입(값 형식)에 NULL값을 설정할 수 있다는 새로운 형태의 Value타입(값 형식)
예) int i = null;
나오게 된 배경
Database 시스템과 프로그래밍 언어의 자료처리의 차이점
Database
모든 필드는 제약조건의 설정에 따라 null일 수 있다.
OOP 언어
데이터 타입은 값 형식과 참조 형식으로 구분됨.
값 형식은 null을 가질 수 없고 기본 값을 가짐.
참조형식은 null을 가질 수 있음.
데이터조회 예시
C#1.0의 예시
int iAge;
...
if( !dbReader.IsDBNull(dbReader.GetOrdinal("Age")) )
iAge = System.Convert.ToInt32(dbReader["Age"]);
else
iAge = ???; // 실제 DB에 값이 null일 경우? 보통 -1로 표현하기도 함.
C#2.0
int? iAge;
if( !dbReader.IsDBNull(dbReader.GetOrdinal("Age")) )
iAge = System.Convert.ToInt32(dbReader["Age"]);
else
iAge = null; // 값에 null을 표현 가능하다!
int otherValue = iAge ?? 0; // null이면 0으로 할당.
주의사항
값 형식에만 사용.
예시)
string? Message = "Hello, World!"; // compile error
MyClass? myClass; // compile error
형변환
int? x = null;
int y = x; // compile error
int y = (int)x; // null일 경우 Runtime Error!! -> InvalidOperationException
int y = x.Value; // null일 경우 Runtime Error!! -> InvalidOperationException
int y = x ?? 0; // 좋은 선택~
타입 정의방법
int i;
System.Int32 i = 0; // Common type system(CTS) 여러 언어에 대해...
int? x1 = 123;
System.Nullable<int> z1 = 10; // CLR 타입. 타입 제약조건으로 값형식만 받을 수 있다.
if(i1==null) i = 0; else i = (int)i1; // i1.HasValue를 이용할 수 있음.
값 형식과의 연산
int? i3 = null;
int? j3 = i3 + 100; // 결과는 null, null+-의 결과는 null
null에 대한 출력값은 '빈 문자열'이다.
Nullable 타입 실제 구현 예시
struct MyNullable<T> where T:struct
{
public T value;
private bool IsNull;
public bool HasValue
{
get
{
return !IsNull;
}
}
선언방법
선언 : T?
System.Nullable<T>
null 할당 가능 int? x = null;
null 확인
int? x;
...
if(x.HasValue) or if(x!=null)
?? Operator
int? x;
int y = x ?? 0;
값 형식과의 연산
int? x;
int? y = x + 1; // x가 null이면 y도 null
'C#' 카테고리의 다른 글
Iterator (0) | 2009.09.07 |
---|---|
Generic (0) | 2009.09.07 |
Partial Class (0) | 2009.08.29 |
C# 3장 간단 정리 (0) | 2009.07.30 |
C# 2장 간단 정리 (0) | 2009.07.30 |