mapping vs 배열 비교
mapping 과 배열 은 둘 다 여러 값을 담지만, 쓰임새가 분명히 다릅니다.
| 구분 | mapping | 배열(array) |
|---|---|---|
| 접근 키 | 임의의 키(address, uint 등) | 0부터 시작하는 정수 인덱스 |
| 조회 속도 | 키로 즉시 조회 | 인덱스로 즉시 조회 |
| 전체 순회 | 불가능 (키 목록 없음) | 가능 (length 로 반복) |
| 길이(length) | 없음 | 있음 |
특정 키로 빠르게 찾아야 하면 mapping, 전체 목록을 순회해야 하면 배열 을 씁니다. 두 가지가 모두
필요하면 둘을 함께 씁니다.
순회할 수 없는 mapping
mapping 은 어떤 key 들이 저장됐는지 목록을 보관하지 않습니다. 그래서 for 문으로 전체
요소를 도는 iteration 이 불가능하고, .length 같은 길이 정보도 없습니다. 반면 배열 은
인덱스 0 부터 length - 1 까지 순서대로 순회할 수 있습니다.
함께 쓰는 패턴
mapping 은 순회가 안 되므로, key 목록을 배열 에 따로 보관하는 패턴을 자주 씁니다.
빠른 조회는 mapping 으로, 전체 순회는 배열 로 처리하는 역할 분담입니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Members {
mapping(address => bool) public isMember;
address[] public memberList;
function join() public {
if (!isMember[msg.sender]) {
isMember[msg.sender] = true;
memberList.push(msg.sender); // 순회용 목록에도 추가
}
}
function memberCount() public view returns (uint256) {
return memberList.length;
}
}배열 전체를 순회하는 함수는 요소가 많아질수록 가스가 늘어 결국 블록 가스 한도에 막힐 수
있습니다. 가능하면 조회는 mapping 으로 처리하고, 순회는 꼭 필요할 때만 신중하게 설계하세요.