string을 function 내에서 쓰려면 memory라는 키워드가 필요함.

솔리디티는 storage, memory, calldata, stack 이렇게 4개의 저장 영역으로 나뉨.

storage

대부분의 변수, 함수들이 저장되며, 영속적으로 저장이 되어 가스 비용이 비쌈.

memory

함수의 파라미터, 리턴값, 레퍼런스 타입이 주로 저장됨. storage처럼 영속적이지 않고, 함수 내에서만 유효하기에 storage보다 가스 비용이 저렴.

calldata

주로 external function의 파라미터에서 사용됨. 함수를 실행할 때 파라미터의 값 자체를 calldata로 받을 수 있음. calldata로 받게 된다면, 값은 변경할 수 없고 읽기만 가능함.

stack

EVM(Ethereum Virtual Machine)에서 stack data를 관리할 때 스는 영역. 1024개의 data를 제한적으로 저장하여 사용할 수 있음. 함수를 실행할 때 로컬 변수 같은 것들을 잠시 기억할 때 EVM이 사용함.

string을 쓰기 위해서는 일시적으로 저장하는 memory 키워드를 써야함.

string은 레퍼런스 타입으로 볼수 있어 memory 키워드를 넣어줘야 함.

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;

contract String {
    function get_string(string memory _string)
        public
        pure
        returns (string memory)
    {
        return _string;
    }
}

위의 예제를 통해 결과를 확인하면 string을 받아서 그대로 리턴함.

pure를 사용한 이유는, 파라미터 받은 걸 바로 리턴하기 때문에, storage에 저장된 변수들을 읽지 않았기 떄문임.