Solidity에서 함수 인자나 변수의 데이터 위치를 지정할 때 memorycalldata 키워드를 사용합니다. 이 둘은 데이터의 저장 위치와 특성 면에서 차이가 있으며, 적절한 사용은 컨트랙트의 효율성과 가스 비용에 영향을 미칩니다.

memorycalldata의 주요 차이점:

  1. 데이터 저장 위치 및 특성:
    • memory: 함수 실행 중에만 존재하는 임시 저장 공간으로, 함수가 종료되면 사라집니다. 이 공간에 저장된 데이터는 수정이 가능합니다.
    • calldata: 함수 호출 시 외부로부터 전달된 인자들이 저장되는 읽기 전용 영역입니다. 함수 내부에서 해당 데이터를 수정할 수 없으며, 함수 실행이 끝나면 사라집니다.
  2. 가스 비용:
    • 일반적으로 calldata를 사용하는 것이 memory보다 가스 비용이 적게 듭니다. 이는 calldata가 읽기 전용으로 설계되어 있어, 데이터를 복사하지 않고 직접 참조하기 때문입니다. 따라서, 함수 인자가 변경되지 않아야 하고, 외부로부터 전달된 데이터를 그대로 사용할 경우 calldata를 사용하는 것이 가스 비용 면에서 유리합니다.
  3. 사용 사례:
    • memory: 함수 내부에서 임시적으로 데이터를 저장하거나 수정해야 할 때 사용합니다. 예를 들어, 함수 내에서 배열을 생성하고 조작해야 하는 경우에 적합합니다.
    • calldata: 함수 인자로 전달된 데이터를 함수 내부에서 읽기만 하고 수정할 필요가 없을 때 사용합니다. 특히, 대용량 데이터나 배열을 인자로 받을 때 calldata를 사용하면 가스 비용을 절약할 수 있습니다.

예시 코드:

pragma solidity ^0.8.0;

contract DataLocationExample {
    // 상태 변수는 기본적으로 storage에 저장됩니다.
    struct MyStruct {
        uint num;
        string text;
    }
    mapping(address => MyStruct) public myStructs;

    // storage를 사용하여 상태 변수를 직접 수정
    function setStorage(address _addr, string calldata _text) external {
        MyStruct storage myStruct = myStructs[_addr];
        myStruct.text = _text;
    }

    // memory를 사용하여 상태 변수의 복사본을 수정 (원본에는 영향 없음)
    function setMemory(address _addr, string calldata _text) external view {
        MyStruct memory myStruct = myStructs[_addr];
        myStruct.text = _text; // 이 변경은 함수 종료 시 사라집니다.
    }
}

위 예시에서 setStorage 함수는 storage 키워드를 사용하여 상태 변수를 직접 수정하며, 이는 블록체인에 영구적으로 저장됩니다. 반면, setMemory 함수는 memory 키워드를 사용하여 상태 변수의 복사본을 수정하며, 이는 함수 실행 중에만 존재하고 함수 종료 시 사라집니다.

참고 자료:

위 자료들을 통해 memorycalldata의 차이점과 사용 방법을 더욱 자세히 이해할 수 있습니다.

+ Recent posts