Visual Basic에서 사용자 정의 데이터 형식(Type는 VB6, Structure는 VB.NET) 는 여러 개의 서로 다른 데이터 형식을 포함하는 사용자 정의 복합 데이터 형식을 정의할 수 있게 해줍니다. 이것은 관련 데이터를 포장하는 데 유용합니다.
UDTs (VB6):
Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "알렉세이" employee.Age = 32 employee.Height = 1.85
구조체 (VB.NET):
Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "알렉세이"
사용할 때:
대비하여: 클래스는 로직의 캡슐화, 상속, 다형성 또는 인터페이스 구현이 필요한 경우 사용합니다.
VB.NET에서 구조체에
Nothing값을 할당할 수 없는 이유는 무엇인가요?
답변: 오직 클래스 변수(객체)만 Nothing 값을 가질 수 있습니다. 왜냐면 클래스는 참조를 저장하기 때문입니다. 구조체는 값 형식(value-type)으로 항상 값의 집합을 포함하기 때문에; Nothing 값을 할당하려고 하면 컴파일 오류가 발생합니다.
Dim s As Person = Nothing '오류! 구조체는 Nothing을 가질 수 없습니다 (Nullable(Of T) 제외)
이야기
오래된 프로젝트에서 원시 배열을 여러 필드가 있는 구조체로 교체하기로 했으나 새로운 코드가 예상치 않게 느려졌습니다. 이유는 구조체의 크기가 매우 커서 함수를 호출할 때 마다 자주 복사되었기 때문입니다. 클래스를 사용했더라면 전체 구조체가 아닌 참조만 복사되었을 것입니다.
이야기
VB6-UDT를 VB.NET으로 이식한 후 한 개발자가 원격 호출에서 구조체를 위한
ISerializable인터페이스를 구현하지 않았습니다. 그 결과, 원격 객체가 직렬화될 수 없게 되어 프로세스 간 통신에서 오류가 발생했습니다.
이야기
기하학 작업 모듈에서 구조체가 배열에 대한 참조를 저장하고 있었습니다(변경 가능). 이 구조체의 여러 인스턴스는 내부의 참조가 동일한 데이터 배열을 가리키기 때문에 예기치 않은 효과를 발생시켰습니다 — 변형이 모든 복사본에 반영되었습니다!