본문 바로가기
프로그래밍 언어

C# 상수와 열거형

by do_ng 2024. 2. 29.

 

상수 : 데이터를 바꿀 수 없는 메모리 공간에 저장된 값

 

왜? 상수가 필요한가? 변수를 선언해놓고 바꾸지 않으면 상수처럼 쓰일 수 있지 않을까? 

변수를 선언할 때 특정 값으로 초기화해놓은 다음에 절대 바꾸지 않으면 상수는 쓸 이유가 없다. 

하지만, 수천줄 이상의 코드를 작성하다보면 어떤 변수는 변경해도 되고 어떤 변수는 변경하면 안 되는지 판단하기가 매우 힘들고 매번 이 변수는 상수로 쓰이니까 주석처리를 해주는 것도 매우 번거로운 작업이 된다. 심지어 개발자의 잘못으로 값이 변경됬을 때 컴파일 시점에 확인이 안되므로 런타임 시점에 확인을 해야 된다. 

 

열거 형식(enum) : 여러 개의 상수들을 묶어 하나의 클래스처럼 사용하는 방식

클래스를 사용하기 위해서는 new를 해서 인스턴스화 시킨 다음 데이터를 꺼내와야 하는데 

enum은 메소드(static) 영역에 저장되기 때문에 new 없이 바로 호출이 가능함

static 영역에 있는 것들은 어디서나 접근이 가능하기 때문에 enum도 외부 클래스에서 접근이 가능함

 

하나의 범주에 속한 상수가 여러개 있을 때 값이 중복되는 경우 문제가 발생할 수 있음

enum 키워드를 사용해서 하나의 카테고리로 묶으면 중복을 방지할 수 있음

 

const int RESULT_YES = 1;
const int RESULT_NO = 2;

const int RESULT_CONFIRM = 3;
const int RESULT_CANCEL = 1;

 

enum [열거 형식명] { 상수명1, 상수명2 ... } 

상수의 값을 지정하지 않으면 컴파일러가 자동으로 0부터 1씩 증가시키면서 초기화 시킴

 

 enum Result
{
    RESULT_YES, // 0 
    RESULT_NO,  // 1
    RESULT_CONFIRM, // 2
    RESULT_CANCEL // 3
}

 

enum은 정수 계열의 자료형만을 대상으로 만들어지기 때문에 문자열, 소수는 포함이 안됨

 

enum Result
{
    a = 'a', // 'a' 라는 문자는 아스키 코드표에 의해서 97이라는 숫자로 저장됨
    b = 2,
    // c = "name" (X)
    // d = 2.52 (X)
}

static void Main(string[] args)
{
	// 정수 계열로 변환하지 않으면 enum에 정의된 상수명을 뽑아냄
    Console.WriteLine(Result.a); // a
    Console.WriteLine((int)Result.a); // 97
    Console.WriteLine((int)Result.b); // 2
}

 

문자가 포함될 수 있는 이유는 아스키 코드표에 의해서 정수 형태로 저장되기 때문에 가능

 

Console.WriteLine(Result.a); // a

a를 출력하는데 문자형태의 값이 아니라 Result 열거형의 멤버인 a를 나타내는 것이다. 

열거형의 이름을 문자 또는 문자열로 가져오기 위해서는 다른 방식으로 변환이 필요함

'프로그래밍 언어' 카테고리의 다른 글

C# 추상 클래스  (0) 2024.03.05
C# 프로퍼티  (0) 2024.03.03
C# reflection  (0) 2024.02.28
객체지향 프로그래밍(OOP) 개념정리  (0) 2024.01.25
C# Delegate(대리자)  (0) 2023.11.10