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