질문 배경
Visual Basic의 열거형(Enum)은 코드의 가독성과 신뢰성을 높이기 위해 사용됩니다. Enum은 프로그램 논리를 위한 일련의 허용된 값을 설정하여 이름이 지정된 상수 집합을 정의할 수 있게 합니다.
문제
많은 사람들이 Enum이 변수의 값을 열거된 항목 중 하나로 완전히 제한한다고 생각하지만, 실제로 Enum 변수는 정수형 값을 저장하며 기본형에 대해 허용되는 모든 값을 할당할 수 있어 오류와 예기치 않은 동작을 초래할 수 있습니다.
해결책
VB.NET에서는 Enum 변수에 목록에 정의되지 않은 값을 할당하는 것이 금지되지 않습니다. 값의 안전한 반복을 위해서는 System.Enum.GetValues 함수를 사용합니다. 값의 유효성을 확인하기 위해 추가 검사를 수행합니다.
코드 예:
Enum Colors Red = 1 Green = 2 Blue = 3 End Enum Dim c As Colors = CType(4, Colors) ' 이것은 컴파일 오류가 아닙니다! For Each value As Colors In [Enum].GetValues(GetType(Colors)) Console.WriteLine(value) Next ' 확인 If [Enum].IsDefined(GetType(Colors), c) Then Console.WriteLine("OK") Else Console.WriteLine("잘못된 값입니다!") End If
주요 특징:
Enum 변수가 항상 선언된 값만 포함한다고 보장할 수 있습니까?
아니요. 언어 수준에서 Enum은 기본 숫자형에 대한 경량 래핑입니다. 특정 값의 유효성을 확인하는 것은 항상 IsDefined를 통해 명시적으로 수행해야 합니다.
상징적으로 Enum의 값을 통해 문자열 표현을 얻을 수 있습니까?
예. 존재하지 않는 값이 할당된 Enum의 ToString 메소드는 해당 숫자값의 문자열 표현을 반환합니다. 예를 들어, Colors = 4인 경우 결과는 "4"입니다.
Enum.GetValues로 모든 값을 열거한 후, Enum 변수에 열거된 범위를 벗어난 숫자를 할당하면 어떻게 됩니까?
GetValues 반복은 선언된 멤버만 반환하며, Enum 변수는 범위를 벗어난 임의의 숫자를 여전히 포함할 수 있습니다. 이는 문법 오류가 아닌 논리 오류가 됩니다.
화면에서 직접 입력한 값이 검증 없이 Enum으로 변환되어, 잘못된 값을 얻고 이후 단계에서 애플리케이션이 중단됩니다.
장점:
단점:
사용자 값을 먼저 Enum.IsDefined를 통해 검증하여, 잘못된 데이터에 대해서도 올바르게 처리됩니다.
장점:
단점: