C#

[C#]열거형 사용 방법

DevStory 2022. 1. 17.

열거형이란?

열거형(Enum)은 미리 정의된 상수들이 나열된 집합입니다. 예를 들어 요일이라는 열거형은 월, 화, 수, 목, 금, 토, 일만 될 수 있으며, 성별이라는 열거형은 알 수 없음, 남자, 여자만 될 수 있습니다.

 

이번 포스팅에서는 열거형에 대해 소개합니다.

 


열거형의 필요성

다음은 열거형을 사용하지 않은 예제입니다. Person 클래스에는 Name과 Gender 속성이 존재하며, Gender의 값은 다음과 같이 정의됩니다.

  • 0: 성별을 알 수 없음
  • 1: 남자
  • 2: 여자
  • 0, 1, 2가 아닌 값은 잘못 입력된 값
public class Person
{
    public string Name { get; set; }
    public int Gender { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> person = new List<Person>();

        person.Add(new Person() { Name = "Tom", Gender = 0});
        person.Add(new Person() { Name = "Bob", Gender = 1 });
        person.Add(new Person() { Name = "Lina", Gender = 2 });
        person.Add(new Person() { Name = "Finish", Gender = 3 });
    }
}

Person 클래스의 값을 확인하기 위해 ToString() 함수를 재정의하였으며, 정수로 정의된 Gender 값에 대한 이름을 가져오는 getGenderName() 함수를 구현합니다.

public class Person
{
    public string Name { get; set; }
    public int Gender { get; set; }

    private string getGenderName(int gender)
    {
        switch(gender)
        {
            case 0:
                return "UnKonown";
            case 1:
                return "Male";
            case 2:
                return "Female";
            default:
                return "Invalid Gender";
        }
    }

    public override string ToString()
    {
        return "Name: " + Name + " / Gender: " + this.getGenderName(Gender);
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> person = new List<Person>();

        person.Add(new Person() { Name = "Tom", Gender = 0});
        person.Add(new Person() { Name = "Bob", Gender = 1 });
        person.Add(new Person() { Name = "Lina", Gender = 2 });
        person.Add(new Person() { Name = "Finish", Gender = 3 });

        foreach(Person list in person)
        {
            Console.WriteLine(list.ToString());
        }
    }
}

실행 결과

위 예제는 정상적으로 실행되지만, 성별(Gender)을 관리하기 어렵다는 문제가 발생합니다. 다음은 Gender에 정의된 값들을 열거형으로 정의하는 방법입니다.

 

우선, Gender로 정의된 열거형을 GenderEnum을 생성합니다.

public enum GenderEnum
{
    Unknown,
    Male,
    Female
}

열거형 GenderEnum을 추가하고 getGenderName() 함수의 case문을 열거형 값으로 변경합니다.

public enum GenderEnum
{
    Unknown,
    Male,
    Female
}

public class Person
{
    public string Name { get; set; }
    public int Gender { get; set; }

    private string getGenderName(int gender)
    {
        switch(gender)
        {
            case (int)GenderEnum.Unknown:
                return "UnKonown";
            case (int)GenderEnum.Male:
                return "Male";
            case (int)GenderEnum.Female:
                return "Female";
            default:
                return "Invalid Gender";
        }
    }

    public override string ToString()
    {
        return "Name: " + Name + " / Gender: " + this.getGenderName(Gender);
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> person = new List<Person>();

        person.Add(new Person() { Name = "Tom", Gender = 0});
        person.Add(new Person() { Name = "Bob", Gender = 1 });
        person.Add(new Person() { Name = "Lina", Gender = 2 });
        person.Add(new Person() { Name = "Finish", Gender = 3 });

        foreach(Person list in person)
        {
            Console.WriteLine(list.ToString());
        }
    }
}

위 예제처럼 열거형을 제대로 사용한다면, 프로그램을 가독성 있게 만들며 유지 보수를 쉽게 만듭니다.


열거형 특징

▶ 열거형의 기본 타입은 int이며, 값은 0부터 시작합니다.

public enum GenderEnum
{
    Unknown,
    Male,
    Female
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("GenderEnum.Unknown: " + (int)GenderEnum.Unknown);
        Console.WriteLine("GenderEnum.Male: " + (int)GenderEnum.Male);
        Console.WriteLine("GenderEnum.Female: " + (int)GenderEnum.Female);
    }
}

실행 결과

 

▶ 열거형 기본 타입은 다음과 같이 short형으로 변경할 수 있으며, 시작 값을 0이 아닌 다른 값으로 정의할 수 있습니다.

public enum GenderEnum : short
{
    Unknown = 10,
    Male,
    Female
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("GenderEnum.Unknown: " + (short)GenderEnum.Unknown);
        Console.WriteLine("GenderEnum.Male: " + (short)GenderEnum.Male);
        Console.WriteLine("GenderEnum.Female: " + (short)GenderEnum.Female);
    }
}

실행 결과

값은 1씩 증가합니다.

 

▶ 열거형의 모든 값이 순차적일 필요는 없습니다.

public enum GenderEnum : short
{
    Unknown = 10,
    Male = 20,
    Female = 30
}

 

▶ 열거형 값이 자료형의 범위를 벗어나는 경우 다음과 같이 컴파일 에러가 발생합니다.

short형의 최댓값은 32,767이므로 컴파일 에러가 발생합니다.

 

▶ 열거형 값을 정수로 변환하려면 명시적 변환이 필요합니다.

int numGenderValue = (int)GenderEnum.Unknown;으로 형변환 작업을 해주어야 합니다.


열거형에서 사용 가능한 함수

열거형(Enum)의 GetValues() 함수는 열거형의 값 리스트를 반환하며, GetNames() 함수는 값의 이름을 반환합니다.

public enum GenderEnum
{
    Unknown = 10,
    Male = 20,
    Female = 30
}

class Program
{
    static void Main(string[] args)
    {
        int[] Values = (int[])Enum.GetValues(typeof(GenderEnum));
        Console.WriteLine("GenderEnum의 값 리스트");
        foreach (int value in Values)
        {
            Console.WriteLine(value);
        }
        Console.WriteLine();

        string[] Names = Enum.GetNames(typeof(GenderEnum));
        Console.WriteLine("GenderEnum의 이름 리스트");
        foreach (string Name in Names)
        {
            Console.WriteLine(Name);
        }
    }
}

실행 결과

반응형

'C#' 카테고리의 다른 글

[C#]Mutable과 Immutable(가변과 불변)  (1) 2022.01.18
[C#]인덱서 사용 방법  (0) 2022.01.17
[C#]Hashtable 사용 방법  (0) 2022.01.12
[C#]콘솔(Console) 입력 및 출력  (0) 2022.01.09
[C#]ToString 재정의  (0) 2022.01.09

댓글