개체 이니셜라이저: 명명된 형식과 익명 형식(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 클래스가 있어야 하며, 이 클래스에는 문자열 값을 받아들일 수 있는 Name 및 City라는 멤버가 있어야 합니다.

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

예를 들어 Customer 클래스가 Name의 값으로 보낼 수 있는 매개 변수가 있는 생성자를 포함하는 경우 다음과 같은 방법으로 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"}
    

    다음 예제에서는 cust3 및 cust4의 매개 변수가 있는 생성자를 사용하여 cust10 및 cust11을 선언하고 초기화합니다.

    Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
    ' --or--
    Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
    
  • 개체 이니셜라이저는 중첩될 수 있습니다. 다음 예제에서 AddressClass는 두 개의 속성, City와 State를 포함하는 클래스이고 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 다음에 데이터 형식의 이름이 지정되지 않는다는 점입니다. 그러나 결과는 완전히 다릅니다. 컴파일러는 두 개의 속성, Name과 City가 있는 새 익명 형식을 정의하고 지정된 값으로 해당 인스턴스를 만듭니다. 이 예제에서 Name과 City의 형식은 형식 유추에 의해 문자열로 결정됩니다.

경고

익명 형식의 이름은 컴파일러에서 생성되며 컴파일할 때마다 달라질 수 있습니다. 코드에서 익명 형식의 이름을 사용하거나 의존하면 안 됩니다.

형식의 이름을 사용할 수 없으므로 As 절을 사용하여 cust13을 선언할 수 없습니다. 해당 형식은 유추되어야 합니다. 따라서 런타임에 바인딩을 사용하지 않는 경우 지역 변수에만 익명 형식을 사용할 수 있습니다.

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

익명 형식에 대한 설명

  • 일반적으로 익명 형식 선언의 속성은 모두 또는 대부분 키 속성이며, Key 키워드를 속성 이름 앞에 입력하여 표시됩니다.

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

    키 속성에 대한 자세한 내용은 Key(Visual Basic)를 참조하십시오.

  • 명명된 형식과 마찬가지로 익명 형식 정의에 대한 이니셜라이저 목록에서 속성을 하나 이상 선언해야 합니다.

    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}
    

    익명 형식의 속성 정의 옵션에 대한 자세한 내용은 방법: 익명 형식 선언에서 속성 이름 및 형식 유추(Visual Basic)를 참조하십시오.

참고 항목

작업

방법: 익명 형식 선언에서 속성 이름 및 형식 유추(Visual Basic)

방법: 익명 형식의 인스턴스 선언(Visual Basic)

방법: 개체 이니셜라이저를 사용하여 개체 선언(Visual Basic)

참조

Key(Visual Basic)

개념

지역 형식 유추(Visual Basic)

익명 형식(Visual Basic)

Visual Basic의 LINQ 소개

명명된 형식과 익명 형식 비교(Visual Basic)