구조체와 클래스(Visual Basic)

Visual Basic은 구조체와 클래스의 구문을 통합하므로 두 엔터티 모두 대부분의 동일한 기능을 지원합니다. 그러나 구조체와 클래스 간에도 중요한 차이점이 있습니다.

클래스는 참조 형식이라는 장점이 있습니다. 참조를 전달하는 것이 모든 데이터와 함께 구조체 변수를 전달하는 것보다 더 효율적입니다. 반면에 구조체는 전역 힙에 메모리를 할당할 필요가 없습니다.

구조체에서 상속할 수 없기 때문에 구조체는 확장할 필요가 없는 개체에만 사용해야 합니다. 만들려는 개체의 인스턴스 크기가 작은 경우 구조체를 사용하고 클래스와 구조체의 성능 특성을 고려합니다.

유사점

구조체와 클래스는 다음 측면에서 유사합니다.

  • 둘 다 컨테이너 형식입니다. 즉, 다른 형식을 멤버로 포함합니다.

  • 두 가지 모두 생성자, 메서드, 속성, 필드, 상수, 열거형, 이벤트 및 이벤트 처리기를 포함할 수 있는 멤버를 가지고 있습니다.

  • 두 멤버 모두 개별화된 액세스 수준을 가질 수 있습니다. 예를 들어, 한 멤버는 Public으로 선언되고 다른 멤버는 Private으로 선언될 수 있습니다.

  • 둘 다 인터페이스를 구현할 수 있습니다.

  • 둘 다 매개 변수 유무에 관계없이 공유 생성자를 가질 수 있습니다.

  • 속성이 하나 이상의 매개 변수를 사용하는 경우 둘 다 기본 속성을 노출할 수 있습니다.

  • 둘 다 이벤트를 선언하고 발생시킬 수 있으며 둘 다 대리자를 선언할 수 있습니다.

차이점

구조체와 클래스는 다음과 같은 점에서 다릅니다.

  • 구조체는 값 형식입니다. 클래스는 참조 형식입니다. 구조체 형식의 변수에는 클래스 형식처럼 데이터에 대한 참조를 포함하는 대신 구조체의 데이터가 포함됩니다.

  • 구조체는 스택 할당을 사용합니다. 클래스는 힙 할당을 사용합니다.

  • 모든 구조체 요소는 기본적으로 Public입니다. 클래스 변수와 상수는 기본적으로 Private이고 다른 클래스 멤버는 기본적으로 Public입니다. 클래스 멤버에 대한 이러한 동작은 Visual Basic 6.0 기본값 시스템과의 호환성을 제공합니다.

  • 구조체에는 비공유 변수나 비공유, 비사용자 지정 이벤트 요소가 하나 이상 있어야 합니다. 클래스는 완전히 비어 있을 수 있습니다.

  • 구조체 요소는 Protected로 선언될 수 없습니다. 클래스 멤버는 할 수 있습니다.

  • 구조체 프로시저는 SharedSub 프로시저인 경우에만 AddHandler 문을 통해서만 이벤트를 처리할 수 있습니다. 모든 클래스 프로시저는 Handles 키워드 또는 AddHandler 문을 사용하여 이벤트를 처리할 수 있습니다. 자세한 내용은 Events을 참조하세요.

  • 구조체 변수 선언은 배열의 초기화나 초기 크기를 지정할 수 없습니다. 클래스 변수 선언이 가능합니다.

  • 구조체는 암시적으로 System.ValueType 클래스에서 상속되며 다른 형식에서는 상속할 수 없습니다. 클래스는 System.ValueType 이외의 모든 클래스에서 상속할 수 있습니다.

  • 구조체는 상속할 수 없습니다. 클래스는 다음과 같습니다.

  • 구조체는 종료되지 않으므로 CLR(공용 언어 런타임)은 어떤 구조체에서도 Finalize 메서드를 호출하지 않습니다. 클래스는 GC(가비지 수집기)에 의해 종료됩니다. GC(가비지 수집기)는 남아 있는 활성 참조가 없음을 검색하면 클래스에 대해 Finalize를 호출합니다.

  • 구조체에는 생성자가 필요하지 않습니다. 클래스가 수행합니다.

  • 구조체는 매개 변수를 취하는 경우에만 비공유 생성자를 가질 수 있습니다. 클래스는 매개 변수가 있거나 없이 이를 가질 수 있습니다.

모든 구조체에는 매개 변수가 없는 암시적 공용 생성자가 있습니다. 이 생성자는 구조체의 모든 데이터 요소를 기본값으로 초기화합니다. 이 동작은 재정의할 수 없습니다.

인스턴스 및 변수

구조체는 값 형식이므로 각 구조체 변수는 개별 구조체 인스턴스에 영구적으로 바인딩됩니다. 그러나 클래스는 참조 형식이며 개체 변수는 서로 다른 시간에 다양한 클래스 인스턴스를 참조할 수 있습니다. 이러한 구분은 다음과 같은 방식으로 구조체 및 클래스 사용에 영향을 미칩니다.

  • 초기화. 구조체 변수에는 구조체의 매개 변수 없는 생성자를 사용하여 요소의 초기화가 암시적으로 포함됩니다. 따라서 Dim s As struct1Dim s As struct1 = New struct1()과 동등합니다.

  • 변수 할당. 하나의 구조체 변수를 다른 구조체 변수에 할당하거나 구조체 인스턴스를 프로시저 인수에 전달하면 모든 변수 요소의 현재 값이 새 구조체에 복사됩니다. 한 개체 변수를 다른 개체 변수에 할당하거나 개체 변수를 프로시저에 전달하면 참조 포인터만 복사됩니다.

  • 아무것도 할당하지 않습니다. 구조체 변수에 Nothing 값을 할당할 수 있지만 인스턴스는 계속해서 변수와 연결됩니다. 변수 요소가 할당에 의해 다시 초기화되더라도 여전히 해당 메서드를 호출하고 해당 데이터 요소에 액세스할 수 있습니다.

    반대로, 개체 변수를 Nothing으로 설정하면 모든 클래스 인스턴스에서 해당 변수가 분리되고 다른 인스턴스를 할당할 때까지 변수를 통해 모든 멤버에 액세스할 수 없습니다.

  • 여러 인스턴스. 개체 변수는 서로 다른 클래스 인스턴스를 서로 다른 시간에 할당할 수 있으며, 여러 개체 변수는 동시에 동일한 클래스 인스턴스를 참조할 수 있습니다. 클래스 멤버 값을 변경하면 동일한 인스턴스를 가리키는 다른 변수를 통해 액세스할 때 해당 멤버에 영향을 줍니다.

    그러나 구조체 요소는 자체 인스턴스 내에서 격리됩니다. 해당 값에 대한 변경 내용은 동일한 Structure 선언의 다른 인스턴스에서도 다른 구조체 변수에 반영되지 않습니다.

  • 같음 두 구조체의 동일성 테스트는 요소별 테스트를 통해 수행해야 합니다. Equals 메서드를 사용하여 두 개체 변수를 비교할 수 있습니다. Equals는 두 변수가 동일한 인스턴스를 가리키는지 여부를 나타냅니다.

참고 항목