열거형 (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 으로 컴파일됩니다.