다음을 통해 공유


열거형 디자인

비고

이 콘텐츠는 프레임워크 디자인 지침: 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용구 및 패턴, 2판에서 Pearson Education, Inc.의 권한으로 다시 인쇄됩니다. 이 버전은 2008년에 출판되었으며, 이후 세 번째 에디션에서 완전히 수정되었습니다. 이 페이지의 일부 정보는 오래된 것일 수 있습니다.

열거형은 특수한 종류의 값 형식입니다. 열거형에는 단순 열거형과 플래그 열거형의 두 종류가 있습니다.

단순 열거형은 작은 닫힌 선택 집합을 나타냅니다. 단순 열거형의 일반적인 예는 색 집합입니다.

플래그 열거형은 열거형 값에 대한 비트 연산을 지원하도록 설계되었습니다. 플래그 열거형의 일반적인 예는 옵션 목록입니다.

✔️ DO는 열거형을 사용하여 값 집합을 나타내는 매개 변수, 속성 및 반환 값을 강력하게 입력합니다.

✔️ 정적 상수 대신 열거형을 사용하는 것이 좋습니다.

❌ 열려 있는 집합(예: 운영 체제 버전, 친구 이름 등)에 열거형을 사용하지 마세요.

❌ 나중에 사용하기 위한 예약된 열거형 값을 제공하지 마세요.

언제든지 나중에 기존 열거형에 값을 추가할 수 있습니다. 열거형에 값을 추가하는 방법에 대한 자세한 내용은 열거형에 값 추가를 참조하세요. 예약된 값은 실제 값 집합을 오염시키고 사용자 오류로 이어지는 경향이 있습니다.

❌ 값이 하나만 있는 열거형을 공개적으로 노출하지 않도록 합니다.

C API의 향후 확장성을 보장하기 위한 일반적인 방법은 메서드 서명에 예약된 매개 변수를 추가하는 것입니다. 이러한 예약된 매개 변수는 단일 기본값을 가진 열거형으로 표현할 수 있습니다. 관리되는 API에서는 이 작업을 수행해서는 안 됩니다. 메서드 오버로드를 사용하면 이후 릴리스에서 매개 변수를 추가할 수 있습니다.

❌ 열거형에 sentinel 값을 포함하지 마세요.

프레임워크 개발자에게 도움이 되는 경우도 있지만, sentinel 값은 프레임워크 사용자에게 혼동을 줍니다. 열거형이 나타내는 집합의 값 중 하나가 아닌 열거형의 상태를 추적하는 데 사용됩니다.

✔️ DO는 단순 열거형에 대해 0 값을 제공합니다.

"없음"처럼 값을 호출하는 것이 좋습니다. 이러한 값이 이 특정 열거형에 적합하지 않은 경우 열거형의 가장 일반적인 기본값은 0의 기본값으로 할당되어야 합니다.

✔️ 다음 중 어느 것이라도 true가 아니면 열거형의 기본 형식으로 (대부분의 프로그래밍 언어에서 기본값) 사용하는 Int32 것이 좋습니다.

  • 열거형은 플래그 열거형이며 32개 이상의 플래그가 있거나 앞으로 더 많은 플래그가 있을 것으로 예상됩니다.

  • 기본 형식은 서로 다른 크기의 열거형을 예상하는 관리되지 않는 코드와의 상호 운용성을 더 쉽게 하기 위해, Int32와 달라야 합니다.

  • 기본 형식이 작을수록 공간을 크게 절약할 수 있습니다. 열거형이 주로 제어 흐름에 대한 인수로 사용될 것으로 예상하는 경우 크기는 거의 차이가 나지 않습니다. 다음과 같은 경우 크기 절감이 중요할 수 있습니다.

    • 열거형이 매우 자주 인스턴스화된 구조체 또는 클래스의 필드로 사용될 것으로 예상합니다.

    • 사용자가 열거형 인스턴스의 큰 배열 또는 컬렉션을 만들 것으로 예상합니다.

    • 열거형 인스턴스가 많은 수로 직렬화될 것으로 예상됩니다.

메모리 내 사용의 경우, 관리되는 개체는 항상 DWORD-정렬이므로, 인스턴스에서 더 작은 열거형을 효율적으로 활용하려면 여러 열거형이나 작은 구조체가 필요합니다. 이는 총 인스턴스 크기가 항상 DWORD로 반올림되기 때문입니다.

✔️ 플래그 열거형에는 복수 명사 또는 명사구를 사용하고, 단순 열거형에는 단수 명사 또는 명사구를 사용하라.

❌ 직접 확장 System.Enum 하지 마세요.

System.Enum 는 CLR에서 사용자 정의 열거형을 만드는 데 사용하는 특수 형식입니다. 대부분의 프로그래밍 언어는 이 기능에 액세스할 수 있는 프로그래밍 요소를 제공합니다. 예를 들어 C# enum 에서 키워드는 열거형을 정의하는 데 사용됩니다.

플래그 열거형을 디자인하기

✔️ 플래그 열거형에 System.FlagsAttribute를 반드시 적용하세요. 이 특성을 단순 열거형에 적용하지 마세요.

✔️ 비트 OR 연산을 사용하여 자유롭게 결합할 수 있도록 플래그 열거형 값에는 2의 거듭제곱을 사용하세요.

✔️ 일반적으로 사용되는 플래그 조합에 특수 열거형 값을 제공하는 것이 좋습니다.

비트 연산은 고급 개념이며 간단한 작업에는 필요하지 않습니다. ReadWrite 는 이러한 특수 값의 예입니다.

❌ 특정 값 조합이 잘못된 플래그 열거형을 만들지 마십시오.

❌ 다음 지침에 따라 값이 "모든 플래그가 지워집니다"를 나타내고 적절하게 이름이 지정되지 않는 한 플래그 열거형 값은 0으로 사용하지 마세요.

✔️ DO 이름을 플래그 열거형의 0 값으로 지정합니다.None 플래그 열거형의 경우 값은 항상 "모든 플래그가 지워집니다."를 의미해야 합니다.

열거형에 값 추가

이미 선적한 후 열거형에 값을 추가해야 한다는 것을 발견하는 것이 매우 일반적입니다. 새로 추가된 값이 기존 API에서 반환될 때 애플리케이션 호환성 문제가 발생할 수 있습니다. 잘못 작성된 애플리케이션이 새 값을 올바르게 처리하지 못할 수 있기 때문입니다.

✔️ 작은 호환성 위험에도 불구하고 열거형에 값을 추가하는 것이 좋습니다.

열거형 추가로 인한 애플리케이션 비호환에 대한 실제 데이터가 있는 경우 새 값과 이전 값을 반환하는 새 API를 추가하고 이전 API를 더 이상 사용하지 않는 것이 좋습니다. 이 API는 이전 값만 계속 반환해야 합니다. 이렇게 하면 기존 애플리케이션이 호환성을 유지할 수 있습니다.

Microsoft Corporation의 일부 저작권 2005, 2009. 모든 권리 보유.

프레임워크 디자인 지침에서 Pearson Education, Inc.의 권한으로 재인쇄 : 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용구 및 패턴, Krzysztof Cwalina 및 Brad Abrams의 제2판, Microsoft Windows 개발 시리즈의 일환으로 Addison-Wesley Professional이 2008년 10월 22일 출판했습니다.

참고하십시오