열거형 디자인

참고 항목

이 콘텐츠는 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.

참고 항목