열거형 디자인
참고 항목
이 콘텐츠는 Pearson Education, Inc.의 허가를 받아 프레임워크 디자인 지침: 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용어 및 패턴, 2판에서 재인쇄되었습니다. 이 버전은 2008년에 출판되었으며 이후 3판에서 완전히 개정되었습니다. 이 페이지의 정보 중 일부는 최신 정보가 아닐 수 있습니다.
열거형은 특별한 형식의 값 형식입니다. 열거형에는 단순 열거형과 플래그 열거형이라는 두 가지 종류가 있습니다.
단순 열거형은 작은 폐쇄형 선택 항목 집합을 나타냅니다. 간단한 열거형의 일반적인 예는 색 집합입니다.
플래그 열거형은 열거형 값에 대한 비트별 연산을 지원하도록 설계되었습니다. 플래그 열거형의 일반적인 예는 옵션 목록입니다.
✔️ 값 집합을 나타내는 매개 변수, 속성 및 반환 값을 강력하게 입력하려면 열거형을 사용하세요.
✔️ 정적 상수 대신 열거형을 사용하세요.
❌ 공개 집합(예: 운영 체제 버전, 친구 이름 등)에 열거형을 사용하지 마세요.
❌ 향후 사용을 위해 예약된 열거형 값을 제공하지 마세요.
이후 단계에서 언제든지 기존 열거형에 값을 추가할 수 있습니다. 열거형에 값 추가에 대한 자세한 내용은 열거형에 값 추가를 참조하세요. 예약된 값은 실제 값 집합을 오염시키고 사용자 오류로 이어지는 경향이 있습니다.
❌ 값이 하나만 있는 열거형을 공개적으로 노출하지 마세요.
C API의 향후 확장성을 보장하기 위한 일반적인 방법은 예약된 매개 변수를 메서드 서명에 추가하는 것입니다. 이러한 예약된 매개 변수는 단일 기본값을 갖는 열거형으로 표현될 수 있습니다. 관리 API에서는 이 작업을 수행하면 안 됩니다. 메서드 오버로딩을 통해 향후 릴리스에 매개 변수를 추가할 수 있습니다.
❌ 열거형에 센티널 값을 포함하지 마세요.
Sentinel 값은 프레임워크 개발자에게 도움이 되는 경우도 있지만 프레임워크 사용자에게는 혼동을 줍니다. 열거형으로 표시되는 집합의 값 중 하나가 아닌 열거형의 상태를 추적하는 데 사용됩니다.
✔️ 단순 열거형에 0 값을 입력하세요.
"없음"과 같은 값을 호출하는 것이 좋습니다. 이러한 값이 이 특정 열거형에 적절하지 않은 경우 열거형의 가장 일반적인 기본값에는 기본값인 0이 할당되어야 합니다.
✔️ 다음 중 하나라도 해당되지 않는 한 열거형의 기본 형식으로 Int32(대부분의 프로그래밍 언어에서 기본값)을 사용해 보세요.
열거형은 플래그 열거형이며 32개 이상의 플래그가 있거나 앞으로 더 많아질 것으로 예상됩니다.
다양한 크기의 열거형을 예상하는 비관리 코드와의 상호 운용성을 더 쉽게 하려면 기본 형식이 Int32와 달라야 합니다.
기본 형식이 작을수록 공간이 크게 절약됩니다. 열거형이 주로 제어 흐름에 대한 인수로 사용될 것으로 예상하는 경우 크기는 거의 차이가 없습니다. 다음과 같은 경우 크기 절약 효과가 클 수 있습니다.
열거형은 매우 자주 인스턴스화되는 구조체 또는 클래스에서 필드로 사용될 것으로 예상합니다.
사용자가 열거형 인스턴스의 대규모 배열이나 컬렉션을 만들 것으로 예상합니다.
많은 수의 열거형 인스턴스가 직렬화될 것으로 예상합니다.
메모리 내 사용의 경우 관리되는 개체는 항상 DWORD
정렬되므로 차이를 만들기 위해 더 작은 열거형을 패키징하려면 총 인스턴스 크기가 항상 DWORD
로 반올림되므로 인스턴스에 여러 열거형 또는 기타 작은 구조체가 효과적으로 필요합니다.
✔️ 복수 명사 또는 명사구가 있는 이름 플래그 열거형과 단수 명사 또는 명사구가 있는 단순 열거형을 사용하세요.
❌System.Enum을 직접 확장하지 마세요.
System.Enum은 CLR에서 사용자 정의 열거형을 만드는 데 사용되는 특수 형식입니다. 대부분의 프로그래밍 언어는 이 기능에 대한 액세스를 제공하는 프로그래밍 요소를 제공합니다. 예를 들어, C#에서는 enum
키워드가 열거형을 정의하는 데 사용됩니다.
플래그 열거형 디자인
✔️ 플래그 열거형에 System.FlagsAttribute를 적용하세요. 단순 열거형에는 이 특성을 적용하지 마세요.
✔️ 비트 OR 연산을 사용하여 자유롭게 결합할 수 있도록 플래그 열거형 값에 2의 거듭제곱을 사용하세요.
✔️ 일반적으로 사용되는 플래그 조합에 대해 특수 열거형 값을 제공해 보세요.
비트 연산은 고급 개념이므로 간단한 작업에는 필요하지 않습니다. ReadWrite는 이러한 특수 값의 예입니다.
❌ 특정 값 조합이 유효하지 않은 플래그 열거형을 만들지 마세요.
❌ 값이 "모든 플래그가 지워짐"을 나타내고 다음 지침에 규정된 대로 적절하게 이름이 지정되지 않는 한 플래그 열거형 값 0을 사용하지 마세요.
✔️ 플래그 열거형의 0값 이름을 None
으로 지정하세요. 플래그 열거형의 경우 값은 항상 "모든 플래그가 지워짐"을 의미해야 합니다.
열거형에 값 추가
이미 열거형을 제공한 후에 열거형에 값을 추가해야 한다는 사실을 발견하는 것은 매우 일반적입니다. 잘못 작성된 애플리케이션이 새 값을 올바르게 처리하지 못할 수 있으므로 새로 추가된 값이 기존 API에서 반환될 때 잠재적인 애플리케이션 호환성 문제가 있습니다.
✔️ 작은 호환성 위험에도 불구하고 열거형에 값을 추가해 보세요.
열거형 추가로 인해 발생한 애플리케이션 비호환성에 대한 실제 데이터가 있는 경우 새 값과 이전 값을 반환하는 새 API를 추가하고 이전 값만 계속 반환해야 하는 이전 API를 더 이상 사용하지 않는 것이 좋습니다. 이렇게 하면 기존 애플리케이션의 호환성이 유지됩니다.
Portions © 2005, 2009 Microsoft Corporation. All rights reserved.
Pearson Education, Inc의 동의로 재인쇄. 출처: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 작성자: Krzysztof Cwalina 및 Brad Abrams, 출판 정보: Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.