프로그래밍VB/VB.NET 개발자

Visual Basic에서 사용자 정의 데이터 형식(User-Defined Types, UDTs)을 어떻게 구현하며, 클래스 대신 사용할 경우는 언제인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

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 인터페이스를 구현하지 않았습니다. 그 결과, 원격 객체가 직렬화될 수 없게 되어 프로세스 간 통신에서 오류가 발생했습니다.


이야기

기하학 작업 모듈에서 구조체가 배열에 대한 참조를 저장하고 있었습니다(변경 가능). 이 구조체의 여러 인스턴스는 내부의 참조가 동일한 데이터 배열을 가리키기 때문에 예기치 않은 효과를 발생시켰습니다 — 변형이 모든 복사본에 반영되었습니다!