열거형이란?
열거형(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 |
댓글