구조체와 클래스(Visual Basic)
Visual Basic은 구조체와 클래스의 구문을 통합하므로 두 엔터티 모두 대부분의 동일한 기능을 지원합니다. 그러나 구조체와 클래스 간에도 중요한 차이점이 있습니다.
클래스는 참조 형식이라는 장점이 있습니다. 참조를 전달하는 것이 모든 데이터와 함께 구조체 변수를 전달하는 것보다 더 효율적입니다. 반면에 구조체는 전역 힙에 메모리를 할당할 필요가 없습니다.
구조체에서 상속할 수 없기 때문에 구조체는 확장할 필요가 없는 개체에만 사용해야 합니다. 만들려는 개체의 인스턴스 크기가 작은 경우 구조체를 사용하고 클래스와 구조체의 성능 특성을 고려합니다.
유사점
구조체와 클래스는 다음 측면에서 유사합니다.
둘 다 컨테이너 형식입니다. 즉, 다른 형식을 멤버로 포함합니다.
두 가지 모두 생성자, 메서드, 속성, 필드, 상수, 열거형, 이벤트 및 이벤트 처리기를 포함할 수 있는 멤버를 가지고 있습니다.
두 멤버 모두 개별화된 액세스 수준을 가질 수 있습니다. 예를 들어, 한 멤버는
Public
으로 선언되고 다른 멤버는Private
으로 선언될 수 있습니다.둘 다 인터페이스를 구현할 수 있습니다.
둘 다 매개 변수 유무에 관계없이 공유 생성자를 가질 수 있습니다.
속성이 하나 이상의 매개 변수를 사용하는 경우 둘 다 기본 속성을 노출할 수 있습니다.
둘 다 이벤트를 선언하고 발생시킬 수 있으며 둘 다 대리자를 선언할 수 있습니다.
차이점
구조체와 클래스는 다음과 같은 점에서 다릅니다.
구조체는 값 형식입니다. 클래스는 참조 형식입니다. 구조체 형식의 변수에는 클래스 형식처럼 데이터에 대한 참조를 포함하는 대신 구조체의 데이터가 포함됩니다.
구조체는 스택 할당을 사용합니다. 클래스는 힙 할당을 사용합니다.
모든 구조체 요소는 기본적으로
Public
입니다. 클래스 변수와 상수는 기본적으로Private
이고 다른 클래스 멤버는 기본적으로Public
입니다. 클래스 멤버에 대한 이러한 동작은 Visual Basic 6.0 기본값 시스템과의 호환성을 제공합니다.구조체에는 비공유 변수나 비공유, 비사용자 지정 이벤트 요소가 하나 이상 있어야 합니다. 클래스는 완전히 비어 있을 수 있습니다.
구조체 요소는
Protected
로 선언될 수 없습니다. 클래스 멤버는 할 수 있습니다.구조체 프로시저는 Shared
Sub
프로시저인 경우에만 AddHandler 문을 통해서만 이벤트를 처리할 수 있습니다. 모든 클래스 프로시저는 Handles 키워드 또는AddHandler
문을 사용하여 이벤트를 처리할 수 있습니다. 자세한 내용은 Events을 참조하세요.구조체 변수 선언은 배열의 초기화나 초기 크기를 지정할 수 없습니다. 클래스 변수 선언이 가능합니다.
구조체는 암시적으로 System.ValueType 클래스에서 상속되며 다른 형식에서는 상속할 수 없습니다. 클래스는 System.ValueType 이외의 모든 클래스에서 상속할 수 있습니다.
구조체는 상속할 수 없습니다. 클래스는 다음과 같습니다.
구조체는 종료되지 않으므로 CLR(공용 언어 런타임)은 어떤 구조체에서도 Finalize 메서드를 호출하지 않습니다. 클래스는 GC(가비지 수집기)에 의해 종료됩니다. GC(가비지 수집기)는 남아 있는 활성 참조가 없음을 검색하면 클래스에 대해 Finalize를 호출합니다.
구조체에는 생성자가 필요하지 않습니다. 클래스가 수행합니다.
구조체는 매개 변수를 취하는 경우에만 비공유 생성자를 가질 수 있습니다. 클래스는 매개 변수가 있거나 없이 이를 가질 수 있습니다.
모든 구조체에는 매개 변수가 없는 암시적 공용 생성자가 있습니다. 이 생성자는 구조체의 모든 데이터 요소를 기본값으로 초기화합니다. 이 동작은 재정의할 수 없습니다.
인스턴스 및 변수
구조체는 값 형식이므로 각 구조체 변수는 개별 구조체 인스턴스에 영구적으로 바인딩됩니다. 그러나 클래스는 참조 형식이며 개체 변수는 서로 다른 시간에 다양한 클래스 인스턴스를 참조할 수 있습니다. 이러한 구분은 다음과 같은 방식으로 구조체 및 클래스 사용에 영향을 미칩니다.
초기화. 구조체 변수에는 구조체의 매개 변수 없는 생성자를 사용하여 요소의 초기화가 암시적으로 포함됩니다. 따라서
Dim s As struct1
은Dim s As struct1 = New struct1()
과 동등합니다.변수 할당. 하나의 구조체 변수를 다른 구조체 변수에 할당하거나 구조체 인스턴스를 프로시저 인수에 전달하면 모든 변수 요소의 현재 값이 새 구조체에 복사됩니다. 한 개체 변수를 다른 개체 변수에 할당하거나 개체 변수를 프로시저에 전달하면 참조 포인터만 복사됩니다.
아무것도 할당하지 않습니다. 구조체 변수에 Nothing 값을 할당할 수 있지만 인스턴스는 계속해서 변수와 연결됩니다. 변수 요소가 할당에 의해 다시 초기화되더라도 여전히 해당 메서드를 호출하고 해당 데이터 요소에 액세스할 수 있습니다.
반대로, 개체 변수를
Nothing
으로 설정하면 모든 클래스 인스턴스에서 해당 변수가 분리되고 다른 인스턴스를 할당할 때까지 변수를 통해 모든 멤버에 액세스할 수 없습니다.여러 인스턴스. 개체 변수는 서로 다른 클래스 인스턴스를 서로 다른 시간에 할당할 수 있으며, 여러 개체 변수는 동시에 동일한 클래스 인스턴스를 참조할 수 있습니다. 클래스 멤버 값을 변경하면 동일한 인스턴스를 가리키는 다른 변수를 통해 액세스할 때 해당 멤버에 영향을 줍니다.
그러나 구조체 요소는 자체 인스턴스 내에서 격리됩니다. 해당 값에 대한 변경 내용은 동일한
Structure
선언의 다른 인스턴스에서도 다른 구조체 변수에 반영되지 않습니다.같음 두 구조체의 동일성 테스트는 요소별 테스트를 통해 수행해야 합니다. Equals 메서드를 사용하여 두 개체 변수를 비교할 수 있습니다. Equals는 두 변수가 동일한 인스턴스를 가리키는지 여부를 나타냅니다.
참고 항목
.NET