✅ 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) 같은 패턴 자주 사용 |
'Blockchain' 카테고리의 다른 글
[Solidity] 7. 접근 제어 패턴과 `modifier` (0) | 2025.04.18 |
---|---|
[Solidity] 6.매핑(Mapping)과 배열(Array) (0) | 2025.04.17 |
[Solidity] 4. 제어 구조 & 연산자 (조건문, 반복문, 오류 처리) (0) | 2025.04.17 |
[Solidity] 3. 함수(Function) 정의와 실행 흐름 (0) | 2025.04.17 |
[Solidity] 2. 상태 변수와 데이터 타입 (0) | 2025.04.17 |
댓글