블록체인 학습
0 XP

mapping 읽기·쓰기

mapping 의 값을 다루는 방법은 배열 의 인덱스 접근과 비슷합니다. 대괄호 [] 안에 key 를 넣어 value 를 읽거나 씁니다. 별도의 "추가/삭제" 메서드가 없고, 대입과 delete 만으로 모든 조작을 합니다.

값 쓰기

mapping[키] = 값 형태로 대입합니다. 산술 대입 연산자도 그대로 쓸 수 있습니다.

balances[msg.sender] = 100;        // 대입
balances[msg.sender] += 50;        // 누적 (기존 값 + 50)

값 읽기

uint256 my = balances[msg.sender]; // 값 가져오기

넣은 적 없는 key 를 읽어도 오류가 나지 않습니다. 해당 value 타입의 기본값(uint 은 0, bool 은 false, address 는 0 주소)이 반환됩니다. 그래서 balances[처음보는주소] += 50 은 0 + 50 으로 계산되어 정상 동작합니다.

값 삭제

delete 키워드는 해당 key 의 value 를 기본값으로 되돌립니다. key 자체가 사라지는 것이 아니라 값이 초기화될 뿐입니다(mapping 은 어차피 키 목록을 갖지 않습니다).

delete balances[msg.sender];       // balances[msg.sender] 가 0 이 됨

종합 예시

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Ledger {
    mapping(address => uint256) public balances;
 
    function deposit(uint256 amount) public {
        balances[msg.sender] += amount;
    }
 
    function balanceOf(address user) public view returns (uint256) {
        return balances[user];
    }
}

값을 "0 인지 아닌지"로 판단해 등록 여부를 가늠하는 패턴이 흔합니다. 하지만 의도적으로 0 을 저장한 경우와 구분이 안 되므로, 정확한 존재 여부가 필요하면 mapping(address => bool) 을 따로 두세요.

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

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