블록체인 학습
0 XP

mapping 선언 문법

mapping 의 기본 문법은 다음과 같습니다. key 타입과 value 타입을 => 로 연결합니다.

mapping(KeyType => ValueType) 가시성 변수이름;
  • KeyType: key 로 쓸 타입. uint, int, bool, address, bytes32 같은 모든 값 타입과 더불어 bytes, string, 컨트랙트 타입, enum 타입을 쓸 수 있습니다.
  • ValueType: value 로 쓸 타입. 거의 모든 타입이 가능하며 다른 mapping, 배열, struct 도 들어갈 수 있습니다.

key 타입으로 쓸 수 없는 것은 mapping, struct, 배열 타입입니다. 한편 bytes 와 string 은 참조 타입이지만 예외적으로 key 로 쓸 수 있습니다. "참조 타입은 전부 안 된다" 고 외우면 틀리니, 위 허용 목록을 그대로 기억하세요.

다양한 선언 예시

실제로는 목적에 따라 key/value 조합을 바꿔가며 선언합니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract MappingShapes {
    // 주소 → 잔액
    mapping(address => uint256) public balances;
    // 주소 → 등록 여부
    mapping(address => bool) public isRegistered;
    // 숫자 ID → 이름
    mapping(uint256 => string) public names;
}

public mapping 의 getter

mapping 을 public 으로 선언하면 컴파일러가 key 를 인자로 받는 getter 함수를 자동으로 만들어 줍니다. 예를 들어 balances 를 선언하면 balances(address) 가 생기고, 외부에서 balances(someAddress) 로 값을 조회할 수 있습니다.

mapping 은 오직 storage 에만 존재합니다. 그래서 함수 안에서 새 mapping 을 만들 수 없고, memory 에 둘 수도 없으며, 일반 함수의 매개변수나 반환값으로 주고받을 수도 없습니다. 다만 mapping(address => uint256) storage b = balances; 처럼 이미 있는 상태 변수를 가리키는 storage 참조 지역 변수는 만들 수 있습니다.

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

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