열거형 형식 사용하기
하나의 이름으로 서로 관련 있는 항목들을 묶어 관리할 수 있는 열거형 형식(열거형, Enumeration)에 대해 학습하겠습니다.
> // 열거형(Enumeration): 하나의 이름으로 서로 관련 있는 정수 값을 갖는 상수 집합을 정의
열거형 형식 사용하기
열거형 형식 사용하기
C#에서 열거형(Enumeration) 형식은 여러 개의 상수를 하나의 이름으로 묶어 관리하는 데이터 형식입니다. 줄여서 열거형이라고 하며, enum
키워드를 사용하여 선언합니다. 이늄 또는 이넘으로 읽습니다.
열거형을 활용하면 관련된 값들을 보다 직관적으로 표현할 수 있어 코드의 가독성과 유지보수성이 향상됩니다. 또한, 이미 .NET에서 제공하는 열거형을 자주 활용하지만, 직접 열거형을 정의하는 경우는 학습 초반에는 상대적으로 적습니다.
ConsoleColor
열거형으로 콘솔의 전경색 및 배경색 바꾸기
우선, .NET에 내장된 열거형을 사용해 보겠습니다.
ConsoleColor
열거형을 활용하면 콘솔의 글자색과 배경색을 쉽게 변경할 수 있습니다.
코드: ConsoleColorDemo.cs
// ConsoleColor 열거형으로 콘솔의 전경색 및 배경색 바꾸기
using System;
class ConsoleColorDemo
{
static void Main()
{
// 전경색 변경
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Blue");
Console.ResetColor();
// 배경색 변경
Console.BackgroundColor = ConsoleColor.Yellow;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Red");
Console.ResetColor();
}
}
위 코드를 작성 후 실행하면 다음 그림과 같이 콘솔의 텍스트와 배경색이 변경이 됩니다.
ConsoleColor
열거형은 Red, Green, Blue와 같은 색상 값을 기억하기 편하게합니다. ConsoleColor
열거형을 Console.ForegroundColor
속성과 Console.BackgroudColor
속성에 대입하면 글자색 및 배경색을 바꿀 수 있습니다.
Visual Studio에서 ConsoleColor
를 입력한 후 점(.
)을 누르면 ConsoleColor
열거형의 목록이 나타나서 콘솔에서 사용할 수 있는 색상 값을 편리하게 지정할 수 있습니다. 이처럼 ConsoleColor
와 같은 열거형을 사용하면 여러 개의 색상 항목들을 모두 기억할 필요없이 ConsoleColor
열거형 이름 하나만 기억하면 되기에 열거형이 프로그램 코드 작성시 편리함을 제공합니다.
TIP
현대 프로그래밍 환경에서는 Visual Studio의 인텔리센스와 ChatGPT 같은 코파일럿 도구가 널리 사용되고 있습니다. 모든 명령어를 외우기보다는 주요 카테고리나 핵심 키워드만을 알아두면, 이러한 도구의 도움을 받아 관련 목록을 쉽게 선택할 수 있습니다. 예를 들어, C#에서는 열거형을 활용하면 해당 열거형의 이름만 기억하고 있어도, 그 안의 항목들을 쉽게 찾아 선택할 수 있어 개발이 훨씬 편리해집니다.
열거형 만들기
이미 만들어 있는 열거형이 아닌 우리가 원하는 열거형을 직접 정의해서 사용할 수 있습니다. 이를 사용자 정의 열거형으로 부릅니다. 사용자 정의 열거형은 다음과 같이 enum
키워드를 사용하여 선언할 수 있습니다.
enum 열거형명
{
열거형상수1,
열거형상수2,
열거형상수3
}
열거형 선언시 기본값을 설정할 수 있습니다.
enum 열거형명
{
열거형상수1 = 기본값1,
열거형상수2 = 기본값2,
열거형상수3 = 기본값3
}
열거형 만들기
그럼 사용자 정의 열거형을 만들어 보겠습니다.
코드: EnumerationDemo.cs
using System;
// 우선순위를 묶어서 관리할 수 있는 Priority 열거형 생성
enum Priority
{
High,
Normal,
Low
}
class EnumerationDemo
{
static void Main()
{
Priority high = Priority.High; // 인텔리센스의 도움 받을 수 있어 편리함
Priority normal = Priority.Normal;
Priority low = Priority.Low;
Console.WriteLine($"{high}, {normal}, {low}");
}
}
High, Normal, Low
우선순위를 나타내는 Priority
열거형에 High
, Normal
, Low
의 3가지 항목을 줍니다. Priority high
변수에는 Priority.High
값을 주는 형태로 Priority
열거형을 사용할 수 있습니다. 열거형 변수의 값을 콘솔에서 문자열로 출력하면 열거형의 멤버 이름이 문자열로 출력됩니다.
EnumerationExam.java
코드: EnumerationExam.java
//[?] 열거형(Enumeration): 하나의 이름으로 서로 관련있는 정수 값을 갖는 상수 집합을 정의
// Color 열거형
enum Color {
Red,
Green,
Blue
}
public class EnumerationExam {
public static void main(String[] args) {
System.out.println(Color.Red.ordinal()); // 0
System.out.println(Color.Green.ordinal()); // 1
System.out.println(Color.Blue.ordinal()); // 2
}
}
0
1
2
열거형 항목에 상수 값 주기
방향을 나타내는 Align
열거형을 만든다고 가정해 보겠습니다. 다음과 같이 Top
, Bottom
, Left
, Right
항목을 멤버로 줄 수 있습니다.
enum Align
{
Top,
Bottom,
Left,
Right
}
```위와 같이 열거형을 선언하면 기본적으로 `Align.Top`은 `0`의 값을, `Align.Bottom`은 `1`, `Align.Left`는 `2`, `Align.Right`는 `3`의 상수 값을 가집니다.
만약, 기본값 이외의 값으로 설정하고자 하면 다음 코드 샘플과 같이 각각의 항목에 원하는 값을 지정하면 됩니다.
```csharp
enum Align
{
Top = 0,
Bottom = 2,
Left = 4,
Right = 8
}
요일에 대한 정보를 열거형으로 관리하면 다음과 같이 선언할 수 있습니다.
enum Weekday
{
Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}
마찬가지로 커피 사이즈에 대한 열거형은 다음과 같이 선언할 수 있습니다.
enum CoffeeSize
{
Small, Medium, Large
}
이처럼 열거형을 사용하면 여러 개로 이루어진 상수들을 하나의 열거형 이름으로 묶어 관리하기 편합니다.
23.3.1. 열거형으로 관련있는 항목을 묶어 관리하기
이번에는 열거형을 사용하여 편리하게 여러 항목을 하나의 이름으로 관리하는 내용을 알아보겠습니다.
참고로, 열거형은 특정 클래스 내에 선언해서 사용해도 됩니다.
코드: EnumAnimal.cs
using System;
class EnumAnimal
{
enum Animal { Mouse, Cow, Tiger }
static void Main()
{
Animal animal = Animal.Tiger;
Console.WriteLine(animal); // "Tiger"
if (animal == Animal.Tiger)
{
Console.WriteLine("호랑이");
}
}
}
Tiger
호랑이
프로그램 소스 코드를 작성할 때 Visual Studio는 자동으로 열거형의 목록을 인텔리센스로 제공해줍니다.
이처럼 열거형을 사용하면 여러 개의 항목을 하나의 이름(Animal)로 관리하여 프로그램 작성할 때 Visual Studio의 인텔리센스의 도움을 받아가면서 프로그램을 할 수 있는 편리함을 제공합니다.
23.3.2. 열거형의 값을 정수형 또는 문자열로 사용하기
열거형의 값을 정수형과 문자열로 표현하는 방법을 살펴보겠습니다. 열거형의 각각의 항목은 지정하는 순서대로 0번째 인덱스부터 정수형 값이 저장됩니다. 열거형의 값을 정수형으로 변환하면 각각의 인덱스를 반환합니다.
코드: EnumIndex.cs
using System;
namespace EnumIndex
{
enum Animal { Rabbit, Dragon, Snake }
class EnumIndex
{
static void Main()
{
Animal animal = Animal.Dragon;
int num = (int)animal; // 1
string str = animal.ToString(); // "Dragon"
Console.WriteLine($"Animal.Dragon : {num}, {str}");
}
}
}
Animal.Dragon : 1, Dragon
Animal
열거형은 3개의 멤버인 Rabbit
, Dragon
, Snake
를 가집니다. 각각의 멤버는 0, 1, 2
의 인덱스 값을 가집니다. 열거형 변수인 animal
을 정수형으로 변환하여 출력하면 각각의 멤버가 가지는 인덱스 값이 출력되고 문자열로 변환하여 출력하면 각각의 멤버 이름이 문자열로 출력됩니다.
23.3.3. 열거형의 인덱스 순서 변경하기
열거형의 인덱스는 기본값은 0, 1, 2
순서이지만 새로운 값으로 설정할 수 있습니다.
코드: EnumIndexChange.cs
using System;
enum Animal
{
Horse, // 0
Sheep = 5, // 1 => 5
Monkey // 2 => 6
}
class EnumIndexChange
{
static void Main()
{
Console.WriteLine((int)Animal.Monkey); // 6
}
}
6
Animal
열거형의 3가지 항목인 Horse
, Sheep
, Monkey
는 기본적으로 0, 1, 2
의 값을 가집니다. 만약, Sheep
값을 5
로 설정하면 Monkey
는 그 다음 값인 6
으로 자동 설정됩니다.
23.3.4. 열거형과 switch 문 함께 사용하기
열거형의 값을 비교할 때에는 switch
문을 사용하면 편리합니다.
코드: EnumSwitch.cs
using System;
namespace EnumSwitch
{
enum Animal { Chicken, Dog, Pig }
class EnumSwitch
{
static void Main()
{
Animal animal = Animal.Dog;
switch (animal)
{
case Animal.Chicken:
Console.WriteLine("닭");
break;
case Animal.Dog:
Console.WriteLine("개");
break;
case Animal.Pig:
Console.WriteLine("돼지");
break;
default:
Console.WriteLine("기본값 설정 영역");
break;
}
}
}
}
개
코드 자체로만 봐서는 값을 비교하는 코드가 길어보입니다. 하지만, Visual Studio에서는 열거형의 값을 switch
문에 대입하면 자동으로 열거형의 항목에 해당하는 case
문을 자동으로 만들어주는 기능도 제공하기에 이 역시 프로그래밍의 편리함을 제공해 주는 부분입니다.
byte
형식의 열거형 사용하기
기본적으로 열거형의 자료형은 int
이지만, 메모리를 절약하거나 특정 요구사항이 있을 때 byte
같은 다른 정수형으로 변경할 수 있습니다.
코드: ByteEnumExample.cs
using System;
enum Status : byte
{
Inactive = 0,
Active = 1,
Pending = 2
}
class ByteEnumExample
{
static void Main()
{
Status currentStatus = Status.Active;
Console.WriteLine($"현재 상태: {currentStatus}({(byte)currentStatus})");
currentStatus = Status.Pending;
Console.WriteLine($"현재 상태: {currentStatus}({(byte)currentStatus})");
}
}
현재 상태: Active(1)
현재 상태: Pending(2)
byte
열거형을 사용하면 메모리를 절약하고, 값의 범위를 0~255로 제한하여 효과적으로 관리할 수 있습니다.
열거형 관련 클래스 사용하기
열거형 관련 내장된 클래스인 Enum
클래스를 사용해 보겠습니다. 학습상 현재 시점에서 그리 중요한 내용도 아니고 이해가 어려울 수 있으니 다음 2개의 예제는 살펴보기 식으로 한번 작성 후 실행해 본 후 넘어가도 됩니다.
23.4.1. 지정된 열거형의 상수 리스트를 배열로 가져오기
Enum
클래스의 GeNames()
메서드를 사용하면 지정된 열거형에서 상수 이름의 배열을 검색합니다.
아래 실행 결과는 3개만 표현했습니다.
코드: EnumGetNames.cs
using System;
class EnumGetNames
{
static void Main()
{
// ConsoleColor 열거형의 Type을 cc 변수에 저장
Type cc = typeof(ConsoleColor);
// 모든 색상 이름을 반환
string[] colors = Enum.GetNames(cc);
// 출력
foreach (var color in colors)
{
Console.WriteLine(color);
}
}
}
Black
Yellow
White
ConsoleColor
와 같은 열거형의 모든 멤버를 문자열 배열로 얻고자할 때에는 Enum.GetNames()
메서드에 해당 열거형을 형식을 typeof
연산자를 통해서 지정하면 됩니다. 참고로 실행 결과는 다르게 나올 수 있습니다.
문자열을 특정 열거형으로 변환하기
Enum.Parse()
메서드를 사용하면 문자열을 가지고 실제 열거형의 만들어 낼 수 있습니다. 하나 이상의 열거된 상수의 이름이나 숫자 값의 문자열 표현을 해당하는 열거형 개체로 변환합니다.
코드: EnumParse.cs
using System;
class EnumParse
{
static void Main()
{
string color = "Red"; // 열거형에 없는 상수 문자열을 지정하면 예외
// [1] 문자열을 가지고 지정 문자열에 해당하는 열거 상수를 가져오기
Console.ForegroundColor = // ConsoleColor.Red;
(ConsoleColor)Enum.Parse(typeof(ConsoleColor), color);
Console.WriteLine("Red");
Console.ResetColor();
}
}
Red
[1]
번 코드 영역에서 직접 ConsoleColor.Red
를 지정하면 되는데, "Red" 문자열을 받으면 Red
상수로 "Black" 문자열을 받으면 Black
상수로 변경하는 등의 프로그램을 사용할 때에는 Enum.Parse()
메서드를 사용할 수 있습니다.
장 요약
열거형을 사용하면 변수에 어떤 값이 저장되어야하는지 명확한 값 목록을 제공합니다. 이때 Visual Studio의 인텔리센스 기능으로 점만 찍으면 해당 목록이 제공되여 편리함을 느낄 수 있습니다. 처음에 열거형을 만드는 수고는 큰 프로그램을 만들 때에 여러모로 도움이 되는 C#의 필수 기능입니다. 학습 초반에는 이미 있는 기능들을 위주로 사용하다가 점점 사용자 정의 열거형을 만들어 가면 좋습니다.