이더리움의 Solidity에서 "memory" 키워드를 사용하는 이유가 무엇인가요?

조회수 2101회

이더리움에서 제공하는 샘플 스마트 컨트렉트를 볼 때에 배열들이 함수에서 "memory"로 선언된 경우도 있고 그렇지 않은 경우도 있습니다. 차이점이 무엇인가요?

출처: https://stackoverflow.com/questions/33839154/in-ethereum-solidity-what-is-the-purpose-of-the-memory-keyword 이 질문은 저작자표시-동일조건변경허락(https://creativecommons.org/licenses/by-sa/3.0/deed.ko) 라이센스로 이용할 수 있습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • Memory 키워드가 없으면 solidity는 변수들을 storage에 저장합니다.

    dev chriseth: storage는 가상구조를 갖는 큰 배열이라고 생각하면 됩니다. 이 구조는 런타임에 변경될 수 없으며 컨트렉트에 있는 정적 변수들에 의해 결정됩니다.

    Storage의 구조는 컨트렉트 레벨의 변수 선언에 의해 결정되고 나중에 함수 호출에 의해 변경되지 않습니다. 그러나 sendTransaction 함수 호출에 의해서 내용은 변경될 수 있습니다. 이러한 호출을 “state” 라고 하고, 이것이 컨트렉트 레벨의 변수들이 “상태 변수들(state variables)” 이라고 불리는 이유입니다. 그래서 variable uint8 storagevar; 을 contract 레벨에서 선언해도 값이 uint8 (0-255) 범위 안에서는 언제든 바뀔 수 있지만 타입인 uint8은 변경될 수 없습니다.

    만일 함수에서 변수들을 memory로 선언하지 않는다면 solidity는 디폴트로 storage 구조를 사용하려 할 것이고 값이 언제든 변경될 수 있어, 이는 컴파일이 될 때 예상치 못한 결과로 이어질 수 있습니다. memory는 solidity에게 함수 안의 변수를 위한 나중에 그 함수 안에서 사용될 때 그 공간의 크기와 구조를 보장받는 일정 공간을 런타임에 요청합니다.

    memory는 컨트렉트 레벨에서 사용할 수 없고 함수에서만 사용이 가능합니다.

    FAQ 에서 What is the memory keyword? What does it do? 탭을 보시기 바랍니다.

    여기에 인용을 해두겠습니다 :

    Ethereum Virtual Machine은 무언가를 저장할 때에 3가지의 영역에 저장합니다.
    첫 번째로는 정적 변수들이 있는 "storage"가 있습니다. 모든 컨트렉트에 있는 영역으로 함수 호출에 변하지 않지만 사용할 때에 비용이 많이 듭니다.
    두 번째로는 일시적인 값을 저장하는 "memory" 영역이 있습니다. 외부 함수가 호출하면 지워지며 사용할 때 비용이 적게듭니다. 세 번째로는 지역변수를 저장할때 사용하는 "stack" 영역이 있습니다. 사용할 때 비용이 거의 들지 않지만 저장할 수 있는 개수가 한정적입니다.
    사용자는 대부분의 경우에 어느곳에 저장할지 알아서 결정되기 때문에 따로 명시할 수 없습니다.
    storage 영역에는 구조체와 배열을 선언하기 좋습니다. 만일 이러한 구조체나 배열 변수들을 함수 호출할 때의 인자값으로 넘긴다면 그것들의 데이터가 storage나 memory 영역에 있을 수 있다면 복사되지 않습니다. 이것은 당신이 호출된 함수에서 내부 내용을 변경할 수 있고 이러한 변경사항은 호출한 쪽에서도 볼 수 있음을 의미합니다.
    고정적으로 storage에 들어가는 타입의 변수들도 있습니다.
    1: 상태 변수는 항상 storage 영역으로 들어갑니다.
    2: 함수 인자들은 항상 memory 영역으로 들어갑니다.
    3: 구조체, 변수, 매핑 타입의 지역 변수들은 디폴트로 storage 영역에 들어갑니다.
    4: 나머지는 stack 영역으로 들어갑니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)