프로그래밍VB.NET 개발자, 아키텍트

Visual Basic에서 구조체(Structure)의 특징과 올바른 사용법을 클래스(Class)와 비교하여 설명하십시오. 적용할 때 어떤 제한이 있으며 메모리 관리 및 동작 측면에서 클래스와 어떻게 다른가요?

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

답변

Visual Basic에서 구조체는 Structure 키워드를 사용하여 정의됩니다. 그들은:

  • 값 유형(value type)입니다: 스택에 배치되거나 다른 객체 내에 위치합니다;
  • 다른 사용자 정의 유형으로부터 상속을 지원하지 않습니다(하지만 인터페이스를 구현할 수 있습니다);
  • 구조체 본체 외에도 매개변수가 없는 생성자를 가질 수 없습니다;
  • MustInherit(추상)로 선언되거나 파이널라이저를 포함할 수 없습니다;
  • 메모리를 절약하는 작은 불변 객체에 적합한 선택입니다.

예제

Public Structure Point Public X As Integer Public Y As Integer Public Sub New(x As Integer, y As Integer) Me.X = x Me.Y = y End Sub End Structure Dim p1 As New Point(1, 2) Dim p2 = p1 ' 값이 복사됨, 참조 아님! p2.X = 5 ' p1.X = 1, p2.X = 5

제한사항

  • 구조체는 서로 상속될 수 없으며, 오직 System.ValueType에서만 상속될 수 있습니다.
  • 매개변수가 없는 자동 생성자만 허용됩니다.
  • 구현 가능한 인터페이스만 허용됩니다.
  • 구조체가 참조 멤버를 포함하고 있을 경우, 복사 및 변형의 미묘함 때문에 주의가 필요합니다.

함정 질문

Q: ByVal 및 ByRef로 함수를 호출할 때 구조체는 어떻게 작동하나요? 클래스와의 차이점은 무엇인가요?

A: 구조체를 ByVal로 전달하면 구조체의 전체 복사본이 생성됩니다. 함수 내의 변경사항은 원본에 영향을 주지 않습니다. ByRef로 전달 시, 원본 변수가 변경됩니다. 클래스는 비록 ByVal로 전달하더라도 참조가 전달되지만, 구조체는 ByVal로 완전히 복사되어 성능 및 동작에 영향을 주게 됩니다.

Sub MutateByVal(p As Point) p.X = 100 End Sub Sub MutateByRef(ByRef p As Point) p.X = 100 End Sub Dim s As New Point(3, 4) MutateByVal(s) ' s.X는 여전히 3 MutateByRef(s) ' s.X는 이제 100

역사

1. 대규모 라이브러리 프로젝트에서 구조체는 ByVal 인터페이스를 통해 대용량 데이터 배열을 전달하는 데 사용되었습니다. 이로 인해 스택에서 대용량 구조체가 여러 번 복사되어 성능이 저하되었습니다. 문제를 해결하기 위해 구조체를 불변 클래스으로 교체했습니다.


역사

2. GIS 개발 프로젝트에서는 참조 필드를 포함하는 구조체의 복사 시 혼란이 발생했습니다. 구조체 내의 배열을 수정하면서 개발자는 배열이 복사된 모든 곳에서 원본이 변경될 것이라고 예상하지 않았습니다, 비록 “값 유형”임에도 불구하고.


역사

3. 회계 소프트웨어에서 비즈니스 엔티티를 위해 구조체와 클래스를 혼합했습니다: 구조체에 대한 상속을 구현하려는 시도가 컴파일 오류로 끝났고, 시스템 아키텍처를 재조직해야 했으며, 구조체와 클래스 간의 잘못된 선택으로 인해 많은 비용이 소모되었습니다.