Nullable 값 형식(Visual Basic)

특정 상황에서 정의된 값이 없는 값 형식으로 작업하는 경우가 있습니다. 예를 들어 데이터베이스의 필드는 의미 있는 할당된 값이 있고 할당된 값이 없는 경우를 구분해야 할 수 있습니다. 값 형식은 정규 값 또는 null 값을 사용하도록 확장할 수 있습니다. 이러한 확장을 null 허용 형식이라고 합니다.

각 null 허용 값 형식은 제네릭 Nullable<T> 구조체에서 생성됩니다. 작업 관련 활동을 추적하는 데이터베이스를 고려합니다. 다음 예제에서는 null 허용 Boolean 형식을 생성하고 해당 형식의 변수를 선언합니다. 다음 세 가지 방법으로 선언을 작성할 수 있습니다.

Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

변수 ridesBusToWorkTrue의 값, False의 값을 보유하거나 값이 전혀 없을 수 있습니다. 초기 기본값은 전혀 값이 아니며, 이 경우 이 사용자에 대한 정보를 아직 얻지 못했음을 의미할 수 있습니다. 대조적으로, False은 정보를 얻고 사람이 출근하기 위해 버스를 타지 않는다는 것을 의미 할 수 있습니다.

null 허용 값 형식을 사용하여 변수 및 속성을 선언할 수 있으며 null 허용 값 형식의 요소를 사용하여 배열을 선언할 수 있습니다. null 허용 값 형식을 매개 변수로 사용하여 프로시저를 선언할 수 있으며 Function 프로시저에서 null 허용 값 형식을 반환할 수 있습니다.

배열, String, 클래스와 같은 참조 형식에서 null 허용 형식을 생성할 수 없습니다. 기본 형식은 값 형식이어야 합니다. 자세한 내용은 Value Types and Reference Types을 참조하세요.

Null 허용 형식 변수 사용

null 허용 값 형식의 가장 중요한 멤버는 해당 HasValueValue 속성입니다. null 허용 값 형식의 변수의 경우 HasValue은 변수에 대해 정의된 값이 포함되어 있는지 여부를 알려줍니다. HasValueTrue인 경우 Value에서 값을 읽을 수 있습니다. HasValueValue 둘 다 ReadOnly 속성입니다.

기본값

null 허용 값 형식으로 변수를 선언하면 해당 HasValue 속성의 기본값은 False입니다. 즉, 기본적으로 변수에는 기본 값 형식의 기본값 대신 정의된 값이 없습니다. 다음 예제에서는 Integer 형식의 기본값이 0인 경우에도 변수 numberOfChildren에 처음에는 정의된 값이 없습니다.

Dim numberOfChildren? As Integer

null 값은 정의되지 않거나 알 수 없는 값을 나타내는 데 유용합니다. numberOfChildrenInteger로 선언된 경우 현재 정보를 사용할 수 없음을 나타낼 수 있는 값이 없습니다.

값 저장

일반적으로 null 허용 값 형식의 변수 또는 속성에 값을 저장합니다. 다음 예제에서는 이전 예제에서 선언된 변수 numberOfChildren에 값을 할당합니다.

numberOfChildren = 2

null 허용 값 형식의 변수 또는 속성에 정의된 값이 포함된 경우 값이 할당되지 않은 초기 상태로 되돌릴 수 있습니다. 다음 예제와 같이 변수 또는 속성을 Nothing로 설정하여 이 작업을 수행합니다.

numberOfChildren = Nothing

참고 항목

Nothing을 null 허용 값 형식의 변수에 할당할 수 있지만 등호를 사용하여 Nothing에 대해 테스트할 수는 없습니다. 등호를 사용하는 비교, someVar = Nothing는 항상 Nothing로 계산됩니다. 변수의 HasValue 속성을 False테스트하거나 Is 또는 IsNot 연산자를 사용하여 테스트할 수 있습니다.

값 검색

null 허용 값 형식의 변수 값을 검색하려면 먼저 해당 HasValue 속성을 테스트하여 값이 있는지 확인해야 합니다. HasValueFalse일 때 값을 읽으려고 하면 Visual Basic에서 InvalidOperationException 예외가 throw됩니다. 다음 예제에서는 이전 예제의 numberOfChildren 변수를 읽는 권장 방법을 보여 줍니다.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Null 허용 형식 비교

부울 식에서 null 허용 Boolean 변수를 사용하는 경우 결과는 True, False, Nothing가 될 수 있습니다. 다음은 AndOr에 대한 진리 테이블입니다. b1b2는 이제 세 개의 가능한 값이 있으므로 평가할 9개의 조합이 있습니다.

b1 b2 b1 및 b2 b1 또는 b2
Nothing Nothing Nothing Nothing
Nothing True Nothing True
Nothing False False Nothing
True Nothing Nothing True
True True True True
True False False True
False Nothing False Nothing
False True False True
False False False False

부울 변수 또는 식의 값이 Nothing인 경우 true도 아니고 false도 아닙니다. 아래 예제를 고려해 보세요.

Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If

이 예제에서 b1 And b2Nothing로 평가됩니다. 결과적으로 Else 절은 각 If 문에서 실행되고 출력은 다음과 같습니다.

Expression is not true

Expression is not false

참고 항목

단락 평가를 사용하는 AndAlsoOrElse는 첫 번째 피연산자를 Nothing으로 계산할 때 두 번째 피연산자를 계산해야 합니다.

전파

산술, 비교, 시프트, 형식 연산의 피연산자 중 하나 또는 둘 다 null 허용 값 형식인 경우 작업의 결과는 null 허용 값 형식이기도 합니다. 두 피연산자 모두 값이 Nothing이 아닌 경우 연산은 null 허용 값 형식이 아닌 것처럼 피연산자의 기본 값에 대해 수행됩니다. 다음 예제에서는 compare1sum1 변수를 암시적으로 입력합니다. 마우스 포인터를 놓으면 컴파일러가 둘 다에 대해 null 허용 값 형식을 유추하는 것을 볼 수 있습니다.

' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3 > 2, but compare1 is inferred to be of 
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")

하나 또는 두 피연산자의 값이 Nothing이 있는 경우 결과는 Nothing가 됩니다.

' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays: 3 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")

데이터와 함께 Null 허용 형식 사용

데이터베이스는 null 허용 값 형식을 사용하는 가장 중요한 위치 중 하나입니다. 현재 모든 데이터베이스 개체가 null 허용 값 형식을 지원하지는 않지만 디자이너에서 생성된 테이블 어댑터는 지원합니다. Null 허용 형식에 대한 TableAdapter 지원을 참조하세요.

참고 항목