개체 이니셜라이저: 명명된 형식과 익명 형식(Visual Basic)

개체 이니셜라이저를 사용하면 단일 식을 사용하여 복합 개체의 속성을 지정할 수 있습니다. 이것을 명명된 형식 인스턴스와 무명 형식 인스턴스를 만드는 데 사용할 수 있습니다.

선언

명명한 형식 인스턴스 선언과 무명 형식 인스턴스 선언은 거의 똑같아 보이지만 그 효과에는 차이가 있습니다. 각각의 범주에는 그만의 기능과 제한이 있습니다. 다음 예제에서는 개체 이니셜라이저 목록을 사용하여 명명된 클래스인 Customer의 인스턴스를 선언하고 초기화하는 편리한 방법을 보여줍니다. 해당 클래스 이름은 New 키워드를 따라 지정됩니다.

Dim namedCust = New Customer With {.Name = "Terry Adams"}

무명 형식에는 사용할 수 있는 이름이 없습니다. 그렇기 때문에 무명 형식의 인스턴스화에는 클래스 이름이 들어갈 수 없습니다.

Dim anonymousCust = New With {.Name = "Hugo Garcia"}

두 종류의 선언에 필요한 요구 사항과 선언으로 인한 결과는 서로 다릅니다. namedCust의 경우, Name 속성이 있는 Customer 클래스가 반드시 있어야 하며 선언은 해당 클래스의 인스턴스를 만듭니다. anonymousCust의 경우, 컴파일러가 Name이라는 문자열을 속성으로 가지고 있는 새 클래스를 정의하고 해당 클래스의 인스턴스를 새로 만듭니다.

명명된 형식

개체 이니셜라이저는 형식의 생성자를 호출한 다음 단일 문에서 일부 또는 모든 속성의 값을 설정하는 간단한 방법을 제공합니다. 컴파일러는 인수가 없는 경우 매개 변수가 없는 생성자를 호출하고 하나 이상의 인수가 전달되는 경우 매개 변수가 있는 생성자를 호출하여 문에 따라 적절한 생성자를 호출합니다. 그런 다음, 지정된 속성이 이니셜라이저 목록에 표시되는 순서에 따라 초기화됩니다.

이니셜라이저 목록의 초기화 각각은 클래스의 멤버에 대한 초기 값 할당으로 구성됩니다. 멤버의 이름과 데이터 형식은 클래스가 정의되면 결정됩니다. 다음 예제에서는 Customer 클래스가 반드시 존재해야 하며, 문자열 값을 허용하는 NameCity라는 멤버가 반드시 있어야 합니다.

Dim cust0 As Customer = New Customer With {.Name = "Toni Poe", 
                                           .City = "Louisville"}

아니면, 다음 코드를 사용하여 동일한 결과를 얻을 수도 있습니다.

Dim cust1 As New Customer With {.Name = "Toni Poe", 
                                .City = "Louisville"}

이들 각각의 선언은 매개 변수 없는 생성자를 사용하여 Customer 개체를 만든 다음 With 문을 사용하여 Name 속성과 City 속성의 초기 값을 지정하는 다음 예제와 동일합니다.

Dim cust2 As New Customer()
With cust2
    .Name = "Toni Poe"
    .City = "Louisville"
End With

Name에 대한 값을 보낼 수 있도록 하는 매개 변수화된 생성자가 Customer 클래스에 있으면, 예를 들어, 다음 방법을 통해 Customer 개체를 선언하여 초기화할 수도 있습니다.

Dim cust3 As Customer = 
    New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}

다음 코드에서와 같이 모든 속성을 초기화할 필요는 없습니다.

Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}

단, 초기화 목록은 비워 둘 수 없습니다. 초기화되지 않은 속성은 기본값을 유지합니다.

명명된 형식을 통한 형식 유추

개체 이니셜라이저와 로컬 형식 유추를 같이 사용하여 cust1 선언을 위한 코드를 줄일 수 있습니다. 이렇게 하면 변수 선언에 있어서 As 절을 생략할 수 있습니다. 변수의 데이터 형식은 할당으로 생긴 개체 형식을 통해 유추하게 됩니다. 다음 예제에서, cust6의 형식은 Customer입니다.

Dim cust6 = New Customer With {.Name = "Toni Poe", 
                               .City = "Louisville"}

명명된 형식에 대한 설명

  • 클래스 멤버는 개체 이니셜라이저 목록에서 두 번 이상 초기화할 수 없습니다. cust7 선언은 오류를 일으킵니다.

    '' This code does not compile because Name is initialized twice.
    ' Dim cust7 = New Customer With {.Name = "Toni Poe", 
    '                                .City = "Louisville",
    '                                .Name = "Blue Yonder Airlines"}
    
  • 멤버를 사용하여 자체적으로 초기화하거나 다른 필드를 초기화할 수 있습니다. cust8에 대한 다음의 선언에서와 같이 어떤 멤버가 초기화되기 전에 해당 멤버에 액세스하는 경우, 기본 값이 사용됩니다. 개체 이니셜라이저를 사용하는 선언을 처리할 때는 적절한 생성자를 호출하는 것이 최우선이라는 것을 명심합니다. 그런 다음에 이니셜라이저 목록의 개별 필드가 초기화됩니다. 다음 예제에서, Name의 기본값은 cust8에 대해 할당되고 초기화된 값은 cust9에 할당됩니다.

    Dim cust8 = New Customer With {.Name = .Name & ", President"}
    Dim cust9 = New Customer With {.Name = "Toni Poe", 
                                   .Title = .Name & ", President"}
    

    다음 예제에서는 cust3cust4에서 매개 변수화된 생성자를 사용하여 cust10cust11을 선언하고 초기화합니다.

    Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
    ' --or--
    Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
    
  • 개체 이니셜라이저는 중첩할 수 있습니다. 다음 예제에서, AddressClass라는 클래스에는 CityState라는 속성 두 가지가 있고 Customer 클래스에는 AddressClass의 인스턴스인 Address 속성이 있습니다.

    Dim cust12 = 
        New Customer With {.Name = "Toni Poe", 
                           .Address = 
                               New AddressClass With {.City = "Louisville", 
                                                      .State = "Kentucky"}}
    Console.WriteLine(cust12.Address.State)
    
  • 초기화 목록은 비워 둘 수 없습니다.

  • 초기화되는 인스턴스는 Object 형식일 수 없습니다.

  • 초기화되는 클래스 멤버는 공유 멤버, 읽기 전용 멤버, 상수 또는 메서드 호출일 수 없습니다.

  • 초기화되는 클래스 멤버는 인덱싱하거나 정규화할 수 없습니다. 다음 예제에서는 다음과 같은 컴파일러 오류가 발생합니다.

    '' Not valid.

    ' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}

    ' Dim c2 = New Customer with {.Address.City = "Springfield"}

익명 형식

무명 형식은 개체 이니셜라이저를 사용하여 명시적으로 정의하고 이름을 지정하지 않는 새 형식의 인스턴스를 만듭니다. 대신, 컴파일러는 개체 이니셜라이저 목록에서 지정한 속성에 따라 형식을 생성합니다. 형식 이름이 지정되지 않았기 때문에 무명 형식이라고 합니다. 예를 들어, 다음의 선언을 cust6과 관련된 이전 선언과 비교해 봅시다.

Dim cust13 = New With {.Name = "Toni Poe", 
                       .City = "Louisville"}

구문적으로 드러나는 유일한 차이점은 데이터 유형에서 New 뒤에 어떤 이름도 지정하지 않는 것입니다. 단, 그로 인한 결과는 매우 다릅니다. 컴파일러는 NameCity라는 두 속성이 있는 새로운 무명 형식을 정의한 다음 지정된 값을 이용해 그 인스턴스를 만듭니다. 형식 유추는 예제의 Name 형식과 City 형식이 문자열이 되도록 결정합니다.

주의

무명 형식의 이름은 컴파일러에서 생성되며 컴파일마다 다를 수 있습니다. 사용자의 코드는 무명 형식의 이름을 사용하거나 이용할 수 없습니다.

해당 형식의 이름을 사용할 수 없기 때문에 사용자는 As 절을 사용하여 cust13을 선언할 수 없습니다. 그 형식은 유추해야 합니다. 늦은 바인딩을 사용하지 않으면 이로 인해 무명 형식을 로컬 변수에 사용하는 것이 제한됩니다.

무명 형식은 LINQ 쿼리에 중요한 지원을 제공합니다. 쿼리에서 무명 형식을 사용하는 방법에 대한 자세한 내용은 무명 형식Visual Basic의 LINQ 소개를 참조하세요.

무명 형식에 대한 설명

  • 일반적으로 무명 형식 선언의 속성은 상당수 또는 전부가 키 속성으로서, 해당 속성의 이름 앞에 Key라는 키워드를 붙여 표시합니다.

    
    Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", 
                                   Key .City = "Louisville"}
    

    키 속성에 대한 자세한 내용은 를 참조하세요.

  • 명명된 형식과 마찬가지로 무명 형식 정의 관련 이니셜라이저 목록은 하나 이상의 속성을 선언해야 합니다.

    Dim anonymousCust = New With {.Name = "Hugo Garcia"}
    
  • 무명 형식의 인스턴스를 선언할 때 컴파일러는 그것과 일치하는 무명 형식 정의를 생성합니다. 속성의 이름과 데이터 형식은 인스턴스 선언에서 취해 오며 컴파일러에 의해 정의에 포함됩니다. 해당 속성은 명명된 형식을 위한 것이기 때문에 미리 명명되거나 정의되지 않습니다. 해당 형식은 유추됩니다. As 절을 사용하여 속성의 데이터 형식을 지정할 수 없습니다.

  • 무명 형식은 몇 가지 다른 방법으로 그 속성의 이름과 값을 설정할 수도 있습니다. 예를 들어, 무명 형식 속성은 어떤 변수의 이름과 값을 함께 이용할 수도 있고 다른 개체의 속성 이름과 값을 이용할 수도 있습니다.

    ' Create a variable, Name, and give it an initial value.
    Dim Name = "Hugo Garcia"
    
    ' Variable anonymousCust2 will have one property, Name, with 
    ' "Hugo Garcia" as its initial value.
    Dim anonymousCust2 = New With {Key Name}
    
    ' The next declaration uses a property from namedCust, defined
    ' in an earlier example. After the declaration, anonymousCust3 will
    ' have one property, Name, with "Terry Adams" as its value.
    Dim anonymousCust3 = New With {Key namedCust.Name}
    

    무명 형식의 속성을 정의하는 옵션에 대한 자세한 내용은 방법: 무명 형식 선언의 속성 이름과 형식 유추를 참조하세요.

참고 항목