블록체인 학습
0 XP

중첩 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 상태 변수에 필드별로 하나씩 채우는 방식이 실수가 가장 적습니다.

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

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