블록체인 학습
0 XP

memory 배열

지금까지 다룬 배열은 모두 컨트랙트의 상태 변수, 즉 storage에 영구 저장되는 배열이었습니다. 하지만 함수 안에서 잠깐 계산용으로만 쓰는 배열까지 storage에 둘 필요는 없습니다. 이럴 때 memory 배열을 사용합니다.

storage와 memory의 차이

storage는 블록체인에 영구 저장되는 공간으로, 값을 쓸 때마다 비싼 가스가 듭니다. 반면 memory는 함수가 실행되는 동안에만 존재하는 임시 공간입니다. 함수 실행이 끝나면 memory 배열은 사라지기 때문에 저장 비용을 크게 아낄 수 있습니다.

사용자 목록처럼 영구히 남겨야 하는 데이터는 storage 동적 배열에 두고, 함수 안에서 결과를 모았다가 반환만 하는 임시 데이터는 memory 배열에 담습니다.

길이를 고정해서 만드는 memory 배열

memory 배열의 핵심 특징은 크기를 고정해서 생성해야 한다는 점입니다. new 타입[](길이) 문법으로 길이를 정해 만들며, 한 번 만든 뒤에는 push나 pop으로 길이를 바꿀 수 없습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract MemoryArray {
    // 0,1,2,...,n-1 을 담은 배열을 만들어 반환
    function buildRange(uint256 n) public pure returns (uint256[] memory) {
        uint256[] memory result = new uint256[](n); // 길이 n으로 고정
        for (uint256 i = 0; i < n; i++) {
            result[i] = i; // 인덱스로 채우기
        }
        return result;
    }
}

위 함수는 storage를 전혀 건드리지 않으므로 pure로 선언했고, 결과를 호출자에게 통째로 돌려주기 위해 반환 타입에 memory를 붙였습니다.

memory 배열에는 push를 사용할 수 없습니다. 생성 시 정한 길이만큼만 인덱스로 값을 채울 수 있습니다. 필요한 길이를 미리 계산해서 new로 만들어야 합니다.

언제 무엇을 쓰나

상황권장 위치
사용자 목록 등 영구 보관storage 동적 배열 (push/pop 가능)
함수 안 임시 계산·반환memory 배열 (new로 고정 길이)

정리하면, 영구 저장이 필요하면 storage 동적 배열을, 함수 안 임시 계산에는 memory 배열을 씁니다. memory 배열은 길이가 고정이라는 점을 늘 기억하세요.

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

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