본문 바로가기
Dev/notion

enum

by 괴발짜응 2025. 2. 19.
반응형

Enum은 관련 상수들을 하나의 타입으로 묶어 표현하며, 코드의 가독성과 안정성을 높이기 위해 사용한다.

 

1. 기본 개념

  • 상수 집합 표현 - enum (열거형)은 미리 정의된 여러 상수 값들을 의미 있는 이름으로 나열할 수 있다
enum Weekday {
	MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    STATURDAY,
    SUNDAY
};
  • 타입 안정성 제공 - enum을 사용하면, 변수에 미리 정해진 값들만 할당할 수 있도록 하여 잘못된 값이 사용되는 것을 막는다.

2. Rust에서의 Enum

Rust의 enum은 단순한 상수 나열을 넘어서, 알제브라적 데이터 타입(Algebraic Data Types)를 구현할 수 있는 강력한 기능을 제공한다. 각 variant에 데이터(값)를 추가로 포함할 수 있어, 여러 형태의 데이터를 안전하게 표현할 수 있다.

fn process_message(msg: Message) {
	match msg {
    	Message::Quit => println("프로그램 종료"),
        Message::Move { x, y } => println("이동: ({}, {})", x, y),
        Message::Write(text) => println("메시지: {}", text),
        Message::ChangeColor(r, g, b) => println("색상 변경: ({}, {}, {})", r, g, b),
    }
}

 

3. TypeSciprt에서의 enum

숫자형 enum - 기본적으로 enum의 각 멤버는 숫자 값을 갖게 되며, 별도로 값을 지정하지 않으면 첫번째 멤버는 0부터 시작하여 자동으로 증가한다.

enum Direction {
    Up,		// 0
    Down,	// 1
    Left,	// 2
    Right 	// 3
}

console.log(Direction.Up);      // 출력: 0
console.log(Direction.Down);	// 출력: 1

 

역방향 매핑(Reverse Mapping) - 숫자형 enum은 컴파일된 JavaScript 코드에서 값으로부터 이름을 조회할 수 있는 역방향 매핑을 지원한다.

console.log(Direction[0]); // 출력: "Up"

 

문자열 enum - 문자열 enum은 각 멤버에 문자열 값을 명시적으로 할당한다. 문자열 enum은 역방향 매핑을 지원하지 않는다.

enum Color {
    Red = "RED",
    Green = "GREEN",
    Blue = "BLUE"
}

console.log(Color.Red); // 출력 "RED"

 

const enum

const enum은 컴파일 시에 enum 멤버들이 인라인 값으로 대체되어, 런타임에 별도의 객체를 생성하지 않는다. 이는 코드 크기를 줄이고 성능을 향상 시킬 수 있다.

const enum Direction {
    Up,
    Down,
    Left,
    Right
}

let dir = Direction.Up; // 컴파일 시에 0으로 대체 됨.

 

실제 사용 예

enum Status {
    Pending,
    InProgress,
    Completed,
    Failed
}

function updateStatus(status: Status) {
    switch (status) {
        case Status.Pending:
            console.log("작업 대기중");
            break;
        case Status.InProgress:
        	console.log("작업 진행중");
            break;
        case Status.Completed:
            console.log("작업 완료");
            break;
        case Status.Failed:
            console.log("작업 실패");
            break;
    }
}

updateStatus(Status.InProgress); //출력: "작업 진행중"
반응형