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 같은 플래그 필드를 따로 두어야 안전합니다.