비주얼 베이직에서 열거형(Enum)은 이름이 붙은 정수 상수를 선언하는 데 사용되며, 이는 코드의 가독성과 유지보수성을 높입니다. 열거형은 다음과 같이 선언됩니다:
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
중요한 주의사항:
사용 예:
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("오류!") End If ' 존재하지 않는 값 할당 code = CType(5, StatusCode) ' 이것은 컴파일되지만 Enum에서 정의되지 않은 값입니다.
열거형 타입 변수에 Enum에 나열되지 않은 값을 할당할 수 있는가? 그 결과는 무엇일 수 있는가?
네, 비주얼 베이직(그리고 .NET 전반)에서 Enum 변수에 적절한(기본 타입에 따라) 숫자 값을 명시적 변환(
CType,DirectCast)을 통해 할당할 수 있습니다. 이는 컴파일 오류를 발생시키지 않지만, 추후 사용 시 잠재적인 문제를 일으킬 수 있습니다. 이는 해당 값이 Enum의 요소 이름에 매핑되지 않으며, ToString과 같은 메서드로 올바르게 해석할 수 없기 때문입니다. 예를 들어:
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' '42'가 출력되며 Enum의 요소 이름이 아닙니다.
이야기
하나의 대규모 프로젝트에서 개발자들은 WebAPI를 통해 상태를 int로 전달했으며, 클라이언트 측에서는 이를 Enum으로 변환했습니다. Enum에 추가되지 않은 새로운 값이 나타날 경우, 애플리케이션은 올바른 정보를 표시하지 않았습니다. 이는 Enum 값의 "유효성"에 대한 검사가 없었기 때문입니다.
이야기
Option Strict 없이 Enum을 사용하면 외부 소스에서 얻은 임의의 숫자 값이 암시적으로 Enum으로 변환되어, 런타임에서 추적하기 힘든 비즈니스 로직의 버그를 유발했습니다.
이야기
Enum의 기본 타입을 명시적으로 지정하지 않음(예: 메모리 절약을 위해 Byte 사용)은 Compact Framework의 좁은 마이크로컨트롤러 솔루션에서 정수 타입의 예기치 않은 오버플로우를 초래했습니다.