다음을 통해 공유


Enum 구조체

열거형에 대한 기본 클래스를 제공합니다.

네임스페이스: System
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public MustInherit Class Enum
    Inherits ValueType
    Implements IComparable, IFormattable, IConvertible
‘사용 방법
Dim instance As Enum
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public ref class Enum abstract : public ValueType, IComparable, IFormattable, IConvertible
/** @attribute SerializableAttribute() */ 
/** @attribute ComVisibleAttribute(true) */ 
public abstract class Enum extends ValueType implements IComparable, IFormattable, 
    IConvertible
SerializableAttribute 
ComVisibleAttribute(true) 
public abstract class Enum extends ValueType implements IComparable, IFormattable, 
    IConvertible

설명

열거형은 해당 내부 형식이 Char를 제외한 정수 계열 형식인 명명된 상수입니다. 내부 형식이 명시적으로 선언되지 않은 경우 Int32가 사용됩니다. 일반적으로 프로그래밍 언어에서는 명명된 상수 집합 및 해당 값 집합으로 구성된 열거형을 선언하는 구문을 제공합니다.

Enum은 이 클래스의 인스턴스를 비교하고, 인스턴스의 값을 문자열 표현으로 변환하고, 숫자의 문자열 표현을 이 클래스의 인스턴스로 변환하고, 지정된 열거형 및 값의 인스턴스를 만드는 메서드를 제공합니다.

열거형을 비트 필드로 처리할 수도 있습니다. 자세한 내용은 FlagsAttribute를 참조하십시오.

구현된 인터페이스

이 클래스는 ValueType에서 상속되며, IComparable, IFormattableIConvertible 인터페이스를 구현합니다. 변환을 위해 이 클래스의 명시적 인터페이스 멤버 구현 IConvertible 대신 Convert 클래스를 사용합니다.

FlagsAttribute 및 열거형 지침

  • 숫자 값에 대해 비트 연산(AND, OR, EXCLUSIVE OR)이 수행될 경우에만 열거형에 FlagsAttribute 사용자 지정 특성을 사용합니다.

  • 열거형 상수를 2의 거듭제곱(즉, 1, 2, 4, 8 등)으로 정의합니다. 이렇게 하면 조합된 열거형 상수의 개별 플래그가 겹치지 않게 됩니다.

  • 주로 사용되는 플래그 조합에 대한 열거형 상수를 만드는 것이 좋습니다. 예를 들어, 열거형 상수 Read = 1Write = 2가 들어 있는 열거형이 파일 I/O 작업에 사용되는 경우 ReadWrite 플래그를 조합한 열거형 상수 ReadWrite = Read OR Write를 만드는 것이 좋습니다. 또한 플래그를 조합하는 데 사용되는 비트 OR 연산은 일부 경우에 단순 작업에 필요하지 않은 고급 개념으로 간주될 수 있습니다.

  • 여러 플래그 위치가 1로 설정될 수 있으므로 음수를 플래그 열거형 상수로 정의할 때는 주의해야 합니다. 코드가 혼동스러워지고 코딩 오류가 발생할 수 있습니다.

  • 숫자 값에 플래그가 설정되어 있는지 여부를 테스트하는 편리한 방법은 숫자 값과 플래그 열거형 상수 간에 비트 AND 연산을 수행하여 숫자 값에서 플래그에 해당하지 않는 모든 비트를 0으로 설정한 다음 해당 연산의 결과가 플래그 열거형 상수와 같은지 여부를 테스트하는 것입니다.

  • 값이 0인 플래그 열거형 상수의 이름으로 None을 사용합니다. 플래그를 테스트할 때는 비트 AND 연산에 None 열거형 상수를 사용할 수 없습니다. 결과가 항상 0이 되기 때문입니다. 그러나 숫자 값과 None 열거형 상수 간에 비트 비교가 아닌 논리 비교를 수행하여 숫자 값의 모든 비트가 설정되었는지 여부를 확인할 수 있습니다.

    플래그 열거형 대신 값 열거형을 만드는 경우에도 None 열거형 상수를 만드는 것이 좋습니다. 기본적으로 열거형에 사용되는 메모리는 공용 언어 런타임에서 0으로 초기화되기 때문입니다. 따라서 값이 0인 상수를 정의하지 않으면 열거형이 만들어질 때 열거형에 잘못된 값이 포함됩니다.

    응용 프로그램에서 나타내야 하는 명확한 기본 경우가 있으면 값이 0인 열거형 상수를 사용하여 기본값을 나타내는 것이 좋습니다. 기본 경우가 없으면 다른 열거형 상수가 나타내지 않는 경우를 의미하는 0을 값으로 갖는 열거형 상수를 사용하는 것이 좋습니다.

  • 단지 열거형 자체의 상태를 미러링하기 위해 열거형 값을 정의하지 마십시오. 예를 들어, 단지 열거형의 끝을 표시하는 열거형 상수를 정의하지 마십시오. 열거형의 마지막 값을 확인할 경우에는 해당 값을 명시적으로 확인해야 합니다. 또한 범위 내의 모든 값이 유효한 경우 첫 번째 열거형 상수와 마지막 열거형 상수의 범위를 확인할 수 있습니다.

  • 나중에 사용하기 위해 예약된 열거형 상수는 지정하지 마십시오.

  • 열거형 상수를 값으로 사용하는 메서드나 속성을 정의할 때는 값의 유효성을 검사하는 것이 좋습니다. 열거형에 정의되어 있지 않은 숫자 값이라도 열거형 형식으로 캐스팅할 수 있기 때문입니다.

예제

다음 코드 예제에서는 열거형을 사용하여 명명된 값을 나타내고 다른 열거형을 사용하여 명명된 비트 필드를 나타내는 방법을 보여 줍니다.

Imports System

Public Class EnumTest
    
    Enum Days
        Saturday
        Sunday
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
    End Enum 'Days
    
    Enum BoilingPoints
        Celcius = 100
        Fahrenheit = 212
    End Enum 'BoilingPoints
    
    <FlagsAttribute()> _
    Enum Colors
        Red = 1
        Green = 2
        Blue = 4
        Yellow = 8
    End Enum 'Colors

    Public Shared Sub Main()
        Dim weekdays As Type = GetType(Days)
        Dim boiling As Type = GetType(BoilingPoints)

        Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:")

        Dim s As String
        For Each s In  [Enum].GetNames(weekdays)
            Console.WriteLine("{0,-11} = {1}", s, [Enum].Format(weekdays, [Enum].Parse(weekdays, s), "d"))
        
        Next s
        Console.WriteLine()
        Console.WriteLine("Enums can also be created which have values that represent some meaningful amount.")
        Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:")

        For Each s In  [Enum].GetNames(boiling)
            Console.WriteLine("{0,-11} = {1}", s, [Enum].Format(boiling, [Enum].Parse(boiling, s), "d"))
        Next s

        Dim myColors As Colors = Colors.Red Or Colors.Blue Or Colors.Yellow
        Console.WriteLine()
        Console.WriteLine("myColors holds a combination of colors. Namely: {0}", myColors)
    End Sub 'Main
End Class 'EnumTest
using System;

public class EnumTest {
    enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
    enum BoilingPoints { Celcius = 100, Fahrenheit = 212 };
    [FlagsAttribute]
    enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };

    public static void Main() {

        Type weekdays = typeof(Days);
        Type boiling = typeof(BoilingPoints);

        Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:");

        foreach ( string s in Enum.GetNames(weekdays) )
            Console.WriteLine( "{0,-11}= {1}", s, Enum.Format( weekdays, Enum.Parse(weekdays, s), "d"));

        Console.WriteLine();
        Console.WriteLine("Enums can also be created which have values that represent some meaningful amount.");
        Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:");

        foreach ( string s in Enum.GetNames(boiling) )
            Console.WriteLine( "{0,-11}= {1}", s, Enum.Format(boiling, Enum.Parse(boiling, s), "d"));

        Colors myColors = Colors.Red | Colors.Blue | Colors.Yellow;
        Console.WriteLine();
        Console.WriteLine("myColors holds a combination of colors. Namely: {0}", myColors);
    }
}
using namespace System;
enum class Days
{
   Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
};

enum class BoilingPoints
{
   Celcius = 100,
   Fahrenheit = 212
};

[FlagsAttribute]

enum class Colors
{
   Red = 1,
   Green = 2,
   Blue = 4,
   Yellow = 8
};

int main()
{
   Type^ weekdays = Days::typeid;
   Type^ boiling = BoilingPoints::typeid;
   Console::WriteLine(  "The days of the week, and their corresponding values in the Days Enum are:" );
   Array^ a = Enum::GetNames( weekdays );
   Int32 i = 0;
   do
   {
      Object^ o = a->GetValue( i );
      Console::WriteLine(  "{0,-11}= {1}", o->ToString(), Enum::Format( weekdays, Enum::Parse( weekdays, o->ToString() ),  "d" ) );
   }
   while ( ++i < a->Length );

   Console::WriteLine();
   Console::WriteLine(  "Enums can also be created which have values that represent some meaningful amount." );
   Console::WriteLine(  "The BoilingPoints Enum defines the following items, and corresponding values:" );
   i = 0;
   Array^ b = Enum::GetNames( boiling );
   do
   {
      Object^ o = b->GetValue( i );
      Console::WriteLine(  "{0,-11}= {1}", o->ToString(), Enum::Format( boiling, Enum::Parse( boiling, o->ToString() ),  "d" ) );
   }
   while ( ++i < b->Length );

   Array^ c = Enum::GetNames( Colors::typeid );
   Colors myColors = Colors::Red | Colors::Blue | Colors::Yellow;
   Console::WriteLine();
   Console::Write(  "myColors holds a combination of colors. Namely:" );
   for ( i = 0; i < 3; i++ )
      Console::Write(  " {0}", c->GetValue( i ) );
}
import System.*;

public class EnumTest
{
    enum Days
    {
        saturday (0),
        sunday (1),
        monday (2),
        tuesday (3),
        wednesday (4),
        thursday (5),
        friday (6);
    } //Days

    enum BoilingPoints
    {
        celsius (100),
        fahrenheit (212);
    } //BoilingPoints

    /** @attribute FlagsAttribute()
     */
    enum Colors
    {
        red (1),
        green (2),
        blue (4),
        yellow (8);
    } //Colors

    public static void main(String[] args)
    {
        Type weekdays = Days.class.ToType();
        Type boiling = BoilingPoints.class.ToType();

        Console.WriteLine("The days of the week, and their corresponding"
            + " values in the Days Enum are:");
        String s[] = Enum.GetNames(weekdays);
        for (int iCtr = 0; iCtr < s.length; iCtr++) {
            Console.WriteLine("{0,-11}= {1}", s[iCtr],
                Enum.Format(weekdays, Enum.Parse(weekdays, s[iCtr]), "d"));
        }

        Console.WriteLine();
        Console.WriteLine("Enums can also be created which have values that"
            + " represent some meaningful amount.");
        Console.WriteLine("The BoilingPoints Enum defines the following items,"
            + " and corresponding values:");
        String s1[] = Enum.GetNames(boiling);
        for (int iCtr = 0; iCtr < s1.length; iCtr++) {
            Console.WriteLine("{0,-11}= {1}", s1[iCtr], 
                Enum.Format(boiling, Enum.Parse(boiling, s1[iCtr]), "d"));
        }
        Colors myColors = Colors.red | Colors.blue | Colors.yellow;
        Console.WriteLine();
        Console.WriteLine("myColors holds a combination of colors. Namely: {0}",
            myColors);
    } //main
} //EnumTest
import System;

public class EnumTest {
    enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
    enum BoilingPoints { Celcius = 100, Fahrenheit = 212 };
    FlagsAttribute
    enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };

    public static function Main() {

        var weekdays : Type = Days;
        var boiling : Type = BoilingPoints;

        Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:");

        for( var i : int in Enum.GetNames(weekdays) )
            Console.WriteLine( "{0,-11}= {1}", Enum.GetNames(weekdays).GetValue(i), 
            Enum.Format( weekdays, Enum.Parse(weekdays, Enum.GetNames(weekdays).GetValue(i)), "d"));

        Console.WriteLine();
        Console.WriteLine("Enums can also be created which have values that represent some meaningful amount.");
        Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:");

        for ( var j : int in Enum.GetNames(boiling) )
            Console.WriteLine( "{0,-11}= {1}", Enum.GetNames(boiling).GetValue(j), 
            Enum.Format(boiling, Enum.Parse(boiling, Enum.GetNames(boiling).GetValue(j)), "d"));

        var myColors : Colors = Colors.Red | Colors.Blue | Colors.Yellow;
        Console.WriteLine();
        Console.WriteLine("myColors holds a combination of colors. Namely: {0}", myColors);
    }
}

스레드로부터의 안전성

이 형식은 다중 스레드 작업을 수행하는 데 안전합니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

Enum 멤버
System 네임스페이스
ValueType
FlagsAttribute
Char 구조체
Int32