Nullable 값 형식(Visual Basic)

정의된 값이 없는 값 형식을 사용하는 경우가 있습니다. 예를 들어 데이터베이스의 필드는 의미 있는 값이 할당된 경우와 값이 할당되지 않은 경우를 구분해야 합니다. 일반 값이나 Null 값 중 하나를 사용하도록 값 형식을 확장할 수 있습니다. 이러한 확장을 Nullable 형식이라고 합니다.

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

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

ridesBusToWork 변수에는 True 값이나 False 값을 지정할 수 있으며 값을 지정하지 않을 수도 있습니다. 초기 기본값은 값 없음이며 이 경우 이 사람에 대한 정보를 아직 얻지 못했음을 의미할 수 있습니다. 반대로 False는 정보를 얻었지만 이 사람이 버스로 통근하지 않음을 의미할 수 있습니다.

변수와 속성을 Nullable 형식으로 선언하고 배열을 Null 허용 형식의 요소로 선언할 수 있습니다. Nullable 형식의 프로시저를 매개 변수로 선언하고 Function 프로시저에서 Null 허용 형식을 반환할 수 있습니다.

배열, String 또는 클래스와 같은 참조 형식에는 Nullable 형식을 생성할 수 없으며 내부 형식이 값 형식이어야 합니다. 자세한 내용은 데이터 형식 구현(Visual Basic)을 참조하십시오.

Nullable 형식 변수 사용

Nullable 형식의 가장 중요한 멤버는 해당 HasValueValue 속성입니다. Nullable 형식 변수의 경우 HasValue는 변수에 정의된 값이 포함되어 있는지 여부를 알려 줍니다. HasValue가 True이면 Value에서 값을 읽을 수 있습니다. HasValueValue 모두 ReadOnly 속성입니다.

기본값

변수를 Nullable 형식으로 선언하면 해당 HasValue 속성에 기본값 False가 지정됩니다. 즉, 기본적으로 변수에는 내부 값 형식의 기본값 대신 정의된 값이 없습니다. 다음 예제에서는 Integer 형식의 기본값이 0임에도 불구하고 numberOfChildren 변수에 기본적으로 정의된 값이 없습니다.

Dim numberOfChildren? As Integer

Null 값은 정의되지 않은 값이나 알 수 없는 값을 나타내는 데 유용합니다. numberOfChildren을 Integer로 선언하면 해당 정보를 현재 사용할 수 없음을 나타낼 수 있는 값이 없게 됩니다.

값 저장

Nullable 형식의 변수나 속성에 일반적인 방법으로 값을 저장합니다. 다음 예제에서는 앞의 예제에서 선언한 numberOfChildren 변수에 값을 할당합니다.

numberOfChildren = 2

Nullable 형식의 변수나 속성이 정의된 값을 포함하는 경우 값이 할당되지 않은 초기 상태로 이러한 변수나 속성을 되돌릴 수 있습니다. 다음 예와 같이 변수나 속성을 Nothing으로 설정하여 이를 수행할 수 있습니다.

numberOfChildren = Nothing

참고

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

값 검색

Nullable 형식의 변수 값을 검색하려면 먼저 해당 HasValue 속성을 테스트하여 값이 있는지 확인해야 합니다. HasValue가 False일 때 값을 읽으려고 하면 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

Nullable 형식 비교

Nullable Boolean 변수를 부울 식에 사용하는 경우 결과는 True, False 또는 Nothing일 수 있습니다. 아래에는 And 및 Or의 참 테이블이 나와 있습니다. b1 및 b2에 세 개의 값을 사용할 수 있으므로 총 9개 조합을 평가해야 합니다.

b1

b2

b1 And b2

b1 Or 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 b2는 Nothing이 됩니다. 따라서 각 If 문에서 Else 절이 실행되며 출력은 다음과 같습니다.

Expression is not true

Expression is not false

참고

단락 계산을 사용하는 AndAlso 및 OrElse는 첫 번째 피연산자가 Nothing일 때 두 번째 피연산자를 계산해야 합니다.

전파

산술, 비교, 시프트 또는 형식 연산의 피연산자 중 하나 또는 둘 다가 Nullable이면 연산 결과도 Nullable입니다. 두 피연산자에 모두 Nothing이 아닌 값이 있는 경우 둘 다 Nullable 형식이 아닌 것처럼 피연산자의 내부 값에 연산이 수행됩니다. 다음 예제에서 compare1 및 sum1 변수는 암시적으로 형식화되어 있습니다. 변수 위에 마우스 포인터를 놓고 컴파일러에서 두 변수에 대해 Nullable 형식을 유추하는지 확인합니다.

' 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 * * *
Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)

데이터에 Nullable 형식 사용

데이터베이스는 Nullable 형식 사용이 가장 중요한 위치 중 하나입니다. 현재 일부 데이터베이스 개체는 Nullable 형식을 지원하지 않지만 디자이너에서 생성한 테이블 어댑터는 Null 허용 형식을 지원합니다. TableAdapter 개요의 "TableAdapter의 Null 허용 형식 지원"을 참조하십시오.

참고 항목

작업

데이터 형식 문제 해결(Visual Basic)

참조

InvalidOperationException

If 연산자(Visual Basic)

Is 연산자(Visual Basic)

IsNot 연산자(Visual Basic)

HasValue

개념

Visual Basic의 데이터 형식

TableAdapter 개요

지역 형식 유추(Visual Basic)

기타 리소스

데이터 형식 구현(Visual Basic)