반응형

※ 일반적으로 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

+ Recent posts