본문 바로가기
IT/C#(CS)

CS 기초강좌 8. Nullable ?표현

by 신림83 2020. 11. 14.
반응형

CS 기초강좌 8. Nullable ?표현

아래 코드를 봅시다.

using System;

class classPoint 
{
    public int x = 0;
    public int y = 0;
}

public struct structPoint
{
    public int x;
    public int y;
}

class Program
{
    static void Main(string[] args)
    {
        classPoint cp1 = new classPoint();
        classPoint cp2 = null; //a

        structPoint sp1 = new structPoint();
        structPoint sp2 = null; //b
    }
}

class와 struct를 하나씩 정의하고 아래에서 각기 생성 시켜 봅니다. 이전에

'CS 기초강좌 6. 값 타입과 참조 타입, 스택과 힙, struct와 class' 이란 글에서 설명했듯이, class를 생성 시 참조 객체가 힙에 할당된 객체를 포인팅 하는 것이고 struct 생성 시에는 스택에 값 자체라고 하였습니다. 해당 내용이 어려우시면 아래 관령 링크로

관령링크

a 와 같이 참조 객체에 null을 대입하면 그것은 해당 참조 객체가 참조하는 객체가 없다는 표현을 할 수 있죠. 많이 쓸 수밖에 없는 표현입니다. 

b는 error입니다. 기본적인 값 객체의 생성 표현으로는 값 객체의 값없음을 표현할 수 없습니다. 값 객체의 값없음을 표현하기 위해서는 NUllable이라는 표현을 써야 합니다.

 

nullalbe 의 사용

다음 코드를 봅시다.

structPoint sp1 = new structPoint();
//structPoint sp2 = null; //b error
Nullable<structPoint> sp2 = null; //c 

if (sp2 == null) //d
{	}

위와 같이 Nullable<T> T에 형식명을 넣으면 됩니다. 그렇게 사용하면 아래 d와 같이 null 비교 또한 가능해집니다.

 

Nullable<T> 를 사용한다는 것은 내부적으로 해당 객체 + bool 형태를 사용한다는 것입니다. 위의 경우에는 structPoint + bool 의 형태입니다. 추가로 bool이 존재하여 데이터의 유무를 기록하고 사용할 수 있는 것입니다.

 

축약표현

단축하여 표현할 수도 있습니다.

다음 코드를 봅시다.

Nullable<structPoint> sp2 = null;   //c 
structPoint? sp3 = null;            //d 

d는 c의 축약 표현입니다. 객채명 뒤에 ? 붙이므로 똑같은 표현을 할 수 있습니다.

 

이럴 경우에 유용

Nullable 이걸 어떻게 쓸까라는 생각을 가지실 껀데, 한 가지 유용한 예를 보겠습니다.

다음 코드를 봅시다.

int f1(int p)
{
  if (false)
       return -1;

    return p;
}

 이런 형태의 함수를 작성할 일이 종종 있습니다. 리턴형은 int인데 내부에서 먼가 처리가 실패합니다. 이럴 때, return int로 뭔가 잘못된 결과임을 알려주는 행위를 해야 하는데, nullable을 사용하지 않은면, 먼가 사용자끼리 약속하고 마법의 수를 넘기게 됩니다. 주로 -1, 0등을..

 

 이런 경우 명시적으로 nullable을 이용해서 처리해주면 더 좋은 코드를 만들 수 있습니다. 의도의 명확성이 훨씬 올라갑니다. 수정해 볼까요?

int? f1(int p)
{
  if (false)
    return null;

    return p;
}

nullable와? 표현에 대하여 알아둡시다.

 

공부합시다.

봐주셔서 감사합니다.

반응형

댓글