블록체인 학습
0 XP

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 으로 처리하고, 순회는 꼭 필요할 때만 신중하게 설계하세요.

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

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