블록체인 학습
0 XP

중첩 mapping

mapping 의 value 로 또 다른 mapping 을 둘 수 있습니다. 이를 중첩 mapping(nested mapping) 이라고 합니다. "키 두 개로 하나의 값을 찾는" 상황, 즉 2차원 표 같은 구조가 필요할 때 유용합니다.

mapping(address => mapping(address => uint256)) public allowance;

위 선언은 "소유자(owner) → (사용자(spender) → 허용 금액)" 구조입니다. ERC-20 토큰의 allowance(A 가 B 에게 얼마까지 쓰도록 허락했는가)가 대표적인 예입니다.

접근할 때는 allowance[owner][spender] 처럼 대괄호를 연달아 씁니다. 첫 key 로 안쪽 mapping 을 고르고, 두 번째 key 로 그 안의 value 를 찾으니, 2차원 표를 행·열로 조회하는 것과 같습니다.

읽기·쓰기 예시

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Allowances {
    // owner => (spender => amount)
    mapping(address => mapping(address => uint256)) public allowance;
 
    function approve(address spender, uint256 amount) public {
        allowance[msg.sender][spender] = amount;
    }
 
    function check(address owner, address spender) public view returns (uint256) {
        return allowance[owner][spender];
    }
}

더 깊게 중첩하기

원리상 더 깊게 중첩할 수도 있습니다. 예를 들어 "게임 → 플레이어 → 아이템 → 보유 수량" 같은 구조도 가능합니다. 다만 깊이가 깊어질수록 가독성이 떨어지므로, 너무 깊어지면 struct 와 조합하는 설계를 고려하세요.

중첩 mapping 역시 key 목록을 저장하지 않으므로 순회가 불가능합니다. 어떤 owner/spender 쌍이 등록됐는지 알아야 한다면, 보통의 mapping 처럼 별도 목록을 함께 관리해야 합니다.

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

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