본문 바로가기

프로그래밍/C#

[C#] 널 자료형과 연산자 ( Nullable, Elvis 등 )

반응형

이 글은 C에서는 쓰이지 않는 Null과 관련된 내용들을 정리하기 위해 작성하였습니다.

글에서는 아래 3가지 개념을 소개할 것입니다.

1. Nullable

2. 널 조건부 연산자 ( Elvis operator )

3. Null 병합 연산자

기존에 자주 사용하던 C에서는 보지 못한 개념들이지만,

이것들을 잘 이용하면 효율적인 프로그램을 작성할 수 있을것 같다는 생각이 듭니다.

1. Nullable

C#의 자료형에는 값 타입과 참조 타입이 있습니다.

값 타입 : 스택에 데이터를 저장하며, 코드 블록이 끝나면 사라짐

참조 타입 : 힙 메모리에 데이터를 저장하며 스택에서 이 데이터를 가리키는 주소를 저장함. 힙 메모리에 저장된 값은 코드 블록이 끝나도 사라지지 않음

참조 타입은 현재 가리키고 있는 데이터가 없음을 나타내는 'null'이라는 값을 가질 수 있지만,

변수 그 자체가 특정 데이터를 가지고 있는 값 타입에서는 null을 가질 수 없습니다.

여기서 Nullable은 기본적으로 '값 타입'에 사용하는 형식으로,

일반적으로 변수명 그 자체가 특정 데이터를 가리키는 '값 타입' 데이터에

'데이터 없음'을 의미하는 null 변수를 선언할 수 있게하는 형식입니다.

 


int? i = null

 

선언은 위와 같이 사용하고자 하는 값 타입에 '?' 기호를 붙인 형태입니다.

nullable형은 이 외에도 'Hasvalue'와 'Value'라는 두 가지 속성을 가지고 있습니다.


a = 1;
WriteLine(a.HasValue); // true
WriteLine(a.Value); // 1


 

HasValue은 해당 변수가 값을 갖고 있는지 아닌지를 나타내고,

Value는 그 변수에 담겨 있는 값을 의미합니다.

예제


        static void Main(string[] args)
        {
            int? a = null;

            while (true)
            {
                try
                {
                    a = int.Parse(Console.ReadLine());
                }
                catch {
                    Console.WriteLine("숫자를 입력해주세요.");
                }

                if (a.HasValue) break;
                else Console.WriteLine("데이터가 입력되지 않았습니다.");
            }
        }

출력


(엔터)
숫자를 입력해주세요.
데이터가 입력되지 않았습니다.
a (엔터)
숫자를 입력해주세요.
데이터가 입력되지 않았습니다.
! (엔터)
숫자를 입력해주세요.
데이터가 입력되지 않았습니다.
2
계속하려면 아무 키나 누르십시오 . . .


 

 

Null 허용 값 형식 - C# 참조

C# nullable 값 형식 및 사용 방법 알아보기

docs.microsoft.com

 

2. 널 조건부 연산자 ( Elivs operator )

이번에 소개할 것은 가수 앨비스의 이름을 따서 'Elvis operator'라고 불리고 있는 널 조건부 연산자입니다.

이 연산자는 객체 멤버 연산시 해당 객체가 null인지 아닌지 판단하고 값을 넘겨주는 역할을 합니다.

i = a?.data; // a가 null이면 null을 반환, 값을 가지고 있다면 data를 변환 j = b?[n]; // b가 null이면 null을 반환, 값을 가지고 있다면 b[n]을 반환

이 널 조건부 연산자는 해당 데이터가 null이 아닌 경우 버그가 발생하지 않도록 해주며,

그 버그를 막기 위한 코드를 정말 간단하고 보기 편하게 작성해주는 기능을 가지고 있습니다.

아래 예제를 널 조건부 연산자를 사용하지 않고 코딩해본다고 생각해보세요!

예제


    class nullTest
    {
        public bool helloNull = true;
    }

    class Program
    {
        static void Main(string[] args)
        {
            nullTest testNull_1 = null;
            nullTest testNull_2 = new nullTest();
            bool? isNull = null;

            Console.WriteLine("Test1");
            isNull = testNull_1?.helloNull;
            NullTest(isNull);

            Console.WriteLine("Test2");
            isNull = testNull_2.helloNull;
            NullTest(isNull);

        }

        static void NullTest(bool? target)
        {
            if (target.HasValue) Console.WriteLine("값이 있습니다.");
            else Console.WriteLine("값이 없습니다..\n");
        }
    }

출력


Test1
값이 없습니다..

Test2
값이 있습니다.
계속하려면 아무 키나 누르십시오 . . .

 

3. 널 병합 연산자

널 병합 연산자인 '??' 연산자는 null 검사와 데이터 교환을 간결하게 만들어줍니다.

 

 


int? i = a ?? 1

 

위와 같이 사용하며, a가 null일 경우 i에는 1이, 반대의 경우에는 i에 a라는 값이 입력됩니다.

반응형