중첩 struct
struct 의 필드 타입으로 다른 struct 를 사용할 수 있습니다. 이를 중첩 struct 라고 합니다.
"사용자가 지갑을 가지고, 지갑은 잔액과 소유자를 가진다"처럼 데이터가 계층 구조를 이룰 때 자연스럽게 표현됩니다.
복잡한 도메인을 작은 struct 들로 쪼개 조립하면 가독성과 재사용성이 모두 좋아집니다.
struct Wallet {
address owner;
uint256 balance;
}
struct User {
string name;
Wallet wallet; // struct 안에 struct
}중첩된 필드는 점(.) 을 이어서 접근합니다. user.wallet.balance 처럼 깊이만큼 점을 이어 붙이면 됩니다.
중첩 필드 접근과 수정
상태 변수로 저장된 중첩 struct 는 필드별로 하나씩 채우는 방식이 가장 안전합니다.
이때 user 가 storage 상태 변수이므로, 점으로 접근한 변경은 곧바로 블록체인에 반영됩니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Nested {
struct Wallet {
address owner;
uint256 balance;
}
struct User {
string name;
Wallet wallet;
}
User public user;
function setUp() public {
user.name = "Alice";
user.wallet.owner = msg.sender;
user.wallet.balance = 100;
}
function deposit(uint256 _amount) public {
user.wallet.balance += _amount; // 중첩 필드 직접 수정
}
}한 번에 인스턴스 만들기
중첩 struct 를 인스턴스 생성으로 한 번에 만들 때는 안쪽 struct 도 함께 초기화해야 합니다.
User memory u = User({
name: "Bob",
wallet: Wallet({ owner: msg.sender, balance: 0 })
});안쪽 struct 를 빼먹으면 컴파일 오류가 납니다. 익숙해지기 전에는 위 setUp() 예제처럼 storage
상태 변수에 필드별로 하나씩 채우는 방식이 실수가 가장 적습니다.