블록체인 학습
0 XP

열거형 (enum)

열거형(enum) 은 미리 정해 둔 이름 있는 상수들의 집합을 하나의 타입으로 묶는 방법입니다. 상태(state)나 단계(step)처럼 "정해진 몇 가지 값 중 하나"를 표현할 때 숫자 대신 의미 있는 이름을 쓸 수 있어 코드 가독성이 크게 좋아집니다.

enum 선언

enum 키워드로 타입을 정의하고, 그 타입의 상태 변수를 선언합니다.

enum Status { Pending, Shipped, Delivered, Canceled }
 
Status public currentStatus;

enum 의 각 멤버는 0 부터 시작하는 정수에 차례로 대응됩니다. 위에서 Pending 은 0, Shipped 는 1, Delivered 는 2, Canceled 는 3 입니다.

기본값은 항상 첫 번째 멤버

초기화하지 않은 enum 변수는 0번 멤버, 즉 가장 먼저 선언한 멤버가 기본값입니다. 위 예시에서 currentStatus 는 별도 대입이 없으면 Status.Pending 입니다. 그래서 "초기/대기" 상태를 0번에 두는 것이 관례입니다.

상태 변수와 반환값에 사용

함수의 매개변수, 반환 타입, 상태 변수 어디에나 enum 타입을 쓸 수 있습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Order {
    enum Status { Pending, Shipped, Delivered, Canceled }
 
    Status public status; // 기본값 = Status.Pending (0)
 
    function ship() public {
        status = Status.Shipped;
    }
 
    function getStatus() public view returns (Status) {
        return status;
    }
}

uint 캐스팅

enum 은 내부적으로 정수이므로 명시적으로 정수 타입과 서로 변환할 수 있습니다. 이를 이용해 enum 값을 숫자로 외부에 노출하거나, 숫자를 enum 으로 되돌릴 수 있습니다.

Status s = Status.Delivered;
uint256 asNumber = uint256(s); // 2
 
uint8 raw = 1;
Status back = Status(raw);     // Status.Shipped

정수를 enum 으로 캐스팅할 때 멤버 개수를 벗어나는 값(예: 위 예시에서 4 이상)을 넣으면 런타임에 되돌려집니다(revert). 범위를 항상 확인하세요.

오른쪽 에디터에서 enum 을 직접 선언하고 setter 로 값을 바꿔보세요. Run 으로 컴파일됩니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.