본문 바로가기
Blockchain

[Solidity] 5. 구조체(Struct)와 열거형(Enum)

by clolee 2025. 4. 17.

✅ 5. 구조체(Struct)와 열거형(Enum)

Solidity에서 복잡한 데이터 구조를 표현할 수 있게 해줌.

이 둘은 단순히 문법적으로만 중요한 게 아니라, 실무에서

  • 사용자 정보
  • 주문 상태
  • NFT 메타데이터
  • 접근 권한 설정
    등의 도메인 모델링에 필수적입니다.

📌 1. 구조체(Struct)

✅ 정의

여러 변수들을 하나로 묶은 사용자 정의 타입

struct User {
    string name;
    uint age;
    address wallet;
}
  • Java의 class나 Python의 dict처럼 필드를 그룹화
  • 컨트랙트 내에서 재사용, 배열/매핑으로 조합 가능

✅ 선언 위치

  • contract 내부 또는 외부 가능
    (단, 외부에 선언 시 import 필요)
contract A {
    struct Item { ... }
}

✅ 사용 예시

User public user;
User[] public users;
mapping(address => User) public userMap;

✅ Struct 인스턴스 생성

User memory u = User("Alice", 25, msg.sender);

또는 필드 기반:

User memory u = User({
    name: "Bob",
    age: 30,
    wallet: msg.sender
});

✅ Struct 필드 접근

string memory userName = user.name;
user.age = 35;

✅ Struct와 배열/매핑 조합

mapping(uint => User) public idToUser;
User[] public userList;

📌 2. 열거형(Enum)

✅ 정의

값의 유한한 상태 집합을 정의할 때 사용

enum Status { Created, Shipped, Delivered, Cancelled }
  • 내부적으로 uint8로 저장됨 (Created = 0, Shipped = 1, ...)
  • 상태 머신 구현, 상태 기반 권한 체크 등에 유용

✅ 사용 예시

Status public currentStatus;

function ship() public {
    require(currentStatus == Status.Created);
    currentStatus = Status.Shipped;
}

✅ Enum 값 비교 & 변경

if (currentStatus == Status.Delivered) {
    ...
}

✅ Enum → 정수 변환

uint statusCode = uint(currentStatus); // enum to uint

✅ 실전 예제

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract OrderManager {
    enum OrderStatus { Created, Paid, Shipped, Delivered, Cancelled }

    struct Order {
        uint id;
        address buyer;
        uint amount;
        OrderStatus status;
    }

    mapping(uint => Order) public orders;
    uint public nextOrderId;

    function createOrder(uint amount) public {
        orders[nextOrderId] = Order(nextOrderId, msg.sender, amount, OrderStatus.Created);
        nextOrderId++;
    }

    function markAsShipped(uint id) public {
        require(orders[id].status == OrderStatus.Paid, "Must be paid first");
        orders[id].status = OrderStatus.Shipped;
    }
}

🧠 실무 팁 정리

항목 설명
Struct는 블록체인 상태 표현에 유용 사용자, 상품, 주문 등 도메인 모델 구성
Struct는 배열/매핑과 함께 자주 사용 상태 저장, 반복 조회에 강함
Enum은 상태 머신에 적합 if/require + enum 조합으로 상태 제한 가능
Enum 타입은 기본적으로 uint8 성능과 가스 비용에 효율적
Struct를 storage, memory로 사용할 때 반드시 메모리 위치 지정자 명시 필요 (memory, storage)

✅ [5단계 요약]

개념 설명
struct 복합 데이터 타입, 여러 속성 그룹화
enum 유한한 상태 표현
User[] 구조체 배열 선언
mapping(address => User) 주소별 사용자 정보 저장
상태 검사 require(status == Status.Paid) 같은 패턴 자주 사용

댓글