블록체인 학습
0 XP

mapping + struct 조합

mapping 의 value 로 struct 를 두면, key 하나에 여러 필드를 묶어 저장할 수 있습니다. "사용자마다 이름·나이·등록 여부를 한꺼번에 관리" 하는 식으로, 실무 컨트랙트에서 가장 흔하게 쓰이는 조합입니다.

struct User {
    string name;
    uint256 age;
    bool active;
}
 
mapping(address => User) public users;

mapping 안의 struct 값은 storage 에 있으므로 users[msg.sender].age = 30; 처럼 필드를 점(.)으로 직접 고칠 수 있습니다. 통째로 새 값을 넣을 수도, 필드 하나만 바꿀 수도 있습니다.

읽기·쓰기 예시

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract UserRegistry {
    struct User {
        string name;
        uint256 age;
        bool active;
    }
 
    mapping(address => User) public users;
 
    function register(string memory name, uint256 age) public {
        users[msg.sender] = User(name, age, true);
    }
 
    function birthday() public {
        users[msg.sender].age += 1; // 필드 직접 수정
    }
}

storage 참조로 다루기

여러 필드를 연달아 수정할 때는 storage 참조를 잡아 두면 코드가 깔끔해집니다.

function activate() public {
    User storage u = users[msg.sender]; // storage 를 가리키는 참조
    u.active = true;                    // 원본이 바로 바뀐다
}

등록한 적 없는 key 를 조회하면 모든 필드가 기본값인 struct(빈 문자열, 0, false)가 돌아옵니다. 실제 등록 여부를 구분하려면 active 같은 플래그 필드를 따로 두어야 안전합니다.

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

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