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 참조 지역 변수는 만들 수 있습니다.