C#/이것이 C#이닀

7. Nullable, HasValue, Value

Rainbow🌈Coder 2022. 2. 7. 14:42
728x90

< Nullable > : λΉ„μ–΄ μžˆλŠ” μƒνƒœκ°€ λ  μˆ˜ μžˆλŠ” ν˜•식

 

Null(λΉ„μ–΄μžˆλŠ”) + able(~될 수 μžˆλŠ”) = "λΉ„μ–΄ μžˆλŠ” μƒνƒœκ°€ 될 수 μžˆλŠ”"

using System;
using System.Text;
using static System.Console;

namespace Hello
{

    class MainApp
    {
        static void Main(string[] args)
        {
            int? a = null;
            int? b = null;
            int? c = null;
            //int d = null; 컴파일 였λ₯˜!
        }
    }
}

ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ‹€ 보면 μ–΄λ–€ 값도 κ°€μ§€μ§€ μ•ŠλŠ” λ³€μˆ˜κ°€ ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€.

0이 μ•„λ‹Œ λΉ„μ–΄μžˆλŠ” λ³€μˆ˜,

즉 null μƒνƒœμΈ λ³€μˆ˜λ₯Ό μ›ν•œλ‹€λ©΄

λ³€μˆ˜μ—κ²Œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ 곡간을 λΉ„μ›Œλ‘˜ 수 μžˆλ„λ‘ Nullable ν˜•μ‹μ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€.(κ°’ ν˜•μ‹μ— ν•œν•˜μ—¬)

 

Nullable ν˜•μ‹μ˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” μ›λž˜μ˜ 데이터 ν˜•μ‹ 이름 뒀에 '?'만 λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

 

λ°μ΄ν„°ν˜•μ‹ ? λ³€μˆ˜μ΄λ¦„;

 

 

int d = null;κ°€ 컴파일 였λ₯˜κ°€ λ‚˜λŠ” μ΄μœ λŠ”

int ν˜•μ‹μ€ λΉ„μ›Œλ‘˜ 수 μ—†κ³ (null 값을 κ°€μ§ˆ 수 μ—†λŠ”) 데이터 ν˜•μ‹μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

 

 

< HasValue, Value >

λͺ¨λ“  Nullable ν˜•μ‹μ€ HasValue와 Value 두 κ°€μ§€ 속성을 κ°–κ³  μžˆλ‹€. (intλŠ” 컴파일 μ—λŸ¬!)

HasValue 속성은 ν•΄λ‹Ή λ³€μˆ˜κ°€ 값을 κ°–κ³  μžˆλŠ”μ§€ λ˜λŠ” κ·Έλ ‡μ§€ μ•Šμ€μ§€λ₯Ό λ‚˜νƒ€λ‚΄κ³ ,

Vlaue 속성은 λ³€μˆ˜μ— 담겨 μžˆλŠ” 값을 보여쀀닀.

using System;
using System.Text;
using static System.Console;

namespace Hello
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int? a = null;
            int? b = 10;
            WriteLine(a.HasValue); //False
            WriteLine(b.HasValue); //True
            WriteLine(b.Value); //10
            a = 8;
            WriteLine(a.HasValue); //True
            WriteLine(a.Value); //8
        }
    }
}

 

비정상적인 μ ‘κ·Ό μ‹œλ„:  μ–΄λ–€ Nullable ν˜•μ‹ λ³€μˆ˜μ˜ HasValue 속성이 False 값을 κ°–κ³  μžˆλ‹€λ©΄

κ·Έ λ³€μˆ˜λŠ” λΉ„μ–΄ μžˆλ‹€λŠ” λœ»μ΄λ‹€.

이 λ³€μˆ˜μ— λŒ€ν•΄ Value 속성을 μ΄μš©ν•˜μ—¬ 값을 κΊΌλ‚΄λ € μ‹œλ„ν•˜λ©΄

CLR은 InvaildOperation Exception μ˜ˆμ™Έλ₯Ό λ„μšΈ 것이닀.

using System;
using System.Text;
using static System.Console;

namespace Hello
{

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

            WriteLine(a.HasValue); //False
            WriteLine(a.Value); 
        }
    }
}

좜λ ₯

False

μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μ˜ˆμ™Έ: System.InvalidOperationException: Null ν—ˆμš© κ°œμ²΄μ—λŠ” 값이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
   μœ„μΉ˜: System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   μœ„μΉ˜: System.Nullable`1.get_Value()

λ”°λΌμ„œ Nullable ν˜•μ‹μ„ μ‚¬μš©ν•  λ•ŒλŠ” HasValue 속성을 ν™•μΈν•˜κ±°λ‚˜ nullκ³Ό 같은지λ₯Ό λΉ„κ΅ν•˜μ—¬

λ³€μˆ˜κ°€ λΉ„μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 사전 검사가 ν•„μš”ν•˜λ‹€. 

728x90