Nothing 키워드(Visual Basic)

모든 데이터 형식의 기본값을 나타냅니다. 참조 형식의 경우 기본값은 null 참조입니다. 값 형식의 경우 기본값은 값 형식이 null을 허용하는지 여부에 따라 달라집니다.

참고 항목

null을 허용하지 않는 값 형식의 경우 Visual Basic의 Nothing은 The party that generated C#의 null과 다릅니다. Visual Basic에서 null을 허용하지 않는 값 형식의 변수를 Nothing으로 설정하면 변수는 선언된 형식의 기본값으로 설정됩니다. C#에서는 null을 허용하지 않는 값 형식의 변수를 null에 할당하면 컴파일 시간 오류가 발생합니다.

설명

Nothing은 데이터 형식의 기본값을 나타냅니다. 기본값은 변수가 값 형식인지 참조 형식인지에 따라 달라집니다.

값 형식의 변수는 해당 값을 직접 포함합니다. 값 형식에는 모든 숫자 데이터 형식, Boolean, Char, Date, 모든 구조체 및 모든 열거형이 포함됩니다. 참조 형식의 변수는 개체의 인스턴스에 대한 참조를 메모리에 저장합니다. 참조 형식에는 클래스, 배열, 대리자 및 문자열이 포함됩니다. 자세한 내용은 Value Types and Reference Types을 참조하세요.

변수가 값 형식인 경우 Nothing의 동작은 변수가 널 입력 가능 데이터 형식인지 여부에 따라 달라집니다. null 허용 값 형식을 나타내려면 형식 이름에 ? 한정자를 추가합니다. null 허용 변수에 Nothing을 할당하면 값이 null로 설정됩니다. 자세한 내용과 예는 null 허용 값 형식을 참조하세요.

변수가 null을 허용하지 않는 값 형식인 경우 변수에 Nothing을 할당하면 선언된 형식의 기본값으로 설정됩니다. 해당 형식에 변수 멤버가 포함되어 있으면 모두 기본값으로 설정됩니다. 다음 예에서는 스칼라 형식에 대해 이를 보여 줍니다.

Module Module1

    Sub Main()
        Dim ts As TestStruct
        Dim i As Integer
        Dim b As Boolean

        ' The following statement sets ts.Name to null and ts.Number to 0.
        ts = Nothing

        ' The following statements set i to 0 and b to False.
        i = Nothing
        b = Nothing

        Console.WriteLine($"ts.Name: {ts.Name}")
        Console.WriteLine($"ts.Number: {ts.Number}")
        Console.WriteLine($"i: {i}")
        Console.WriteLine($"b: {b}")

        Console.ReadKey()
    End Sub

    Public Structure TestStruct
        Public Name As String
        Public Number As Integer
    End Structure
End Module

변수가 참조 형식인 경우 변수에 Nothing을 할당하면 변수 형식의 null 참조로 설정됩니다. null 참조로 설정된 변수는 어떤 개체와도 연관되지 않습니다. 다음은 이에 대한 예입니다.

Module Module1

    Sub Main()

        Dim testObject As Object
        ' The following statement sets testObject so that it does not refer to
        ' any instance.
        testObject = Nothing

        Dim tc As New TestClass
        tc = Nothing
        ' The fields of tc cannot be accessed. The following statement causes 
        ' a NullReferenceException at run time. (Compare to the assignment of
        ' Nothing to structure ts in the previous example.)
        'Console.WriteLine(tc.Field1)

    End Sub

    Class TestClass
        Public Field1 As Integer
        ' . . .
    End Class
End Module

참조(또는 null 허용 값 형식) 변수가 null인지 확인하려면 항상 Is Nothing 또는 IsNot Nothing을 사용합니다. = Nothing 또는 <> Nothing은 사용하지 마세요.

Visual Basic 문자열의 경우 빈 문자열은 Nothing과 같습니다. 따라서 "" = Nothing은 true입니다. 이 사실은 문자열을 사용할 때 올바른 비교를 선택하는 것이 특히 중요합니다. myString = NothingmyString <> Nothing은 비어 있지 않은 값이 설정되었는지 여부를 나타내지만 이 목적으로는 String.IsNullOrEmpty(myString)을 사용하는 것이 좋습니다. 빈 문자열을 포함한 값이 설정되었는지 확인하려면 Is NothingIsNot Nothing을 사용합니다.

다음 예에서는 IsIsNot 연산자를 사용하는 비교를 보여 줍니다.

Module Module1
    Sub Main()

        Dim testObject As Object
        testObject = Nothing
        Console.WriteLine(testObject Is Nothing)
        ' Output: True

        Dim tc As New TestClass
        tc = Nothing
        Console.WriteLine(tc IsNot Nothing)
        ' Output: False

        ' Declare a nullable value type.
        Dim n? As Integer
        Console.WriteLine(n Is Nothing)
        ' Output: True

        n = 4
        Console.WriteLine(n Is Nothing)
        ' Output: False

        n = Nothing
        Console.WriteLine(n IsNot Nothing)
        ' Output: False

        Console.ReadKey()
    End Sub

    Class TestClass
        Public Field1 As Integer
        Private field2 As Boolean
    End Class
End Module

As 절을 사용하지 않고 변수를 선언하고 이를 Nothing으로 설정하면 변수는 Object 형식을 갖습니다. 이러한 예는 Dim something = Nothing과 같습니다. 이 경우 Option Strict가 켜져 있고 Option Infer가 꺼져 있으면 컴파일 시간 오류가 발생합니다.

개체 변수에 Nothing을 할당하면 더 이상 개체 인스턴스를 참조하지 않습니다. 변수가 이전에 인스턴스를 참조한 경우 이를 Nothing으로 설정해도 인스턴스 자체가 종료되지는 않습니다. GC(가비지 수집기)가 남아 있는 활성 참조가 없음을 검색한 후에만 인스턴스가 종료되고 인스턴스와 연결된 메모리 및 시스템 리소스가 해제됩니다.

Nothing은 초기화되지 않은 변형 또는 존재하지 않는 데이터베이스 열을 나타내는 DBNull 개체와 다릅니다.

참고 항목