블록체인 학습
0 XP

함수에서 struct 사용

struct 는 함수의 지역 변수, 매개변수, 반환값으로 자유롭게 쓸 수 있습니다. 함수 안에서 struct 같은 참조형 데이터를 다룰 때는 데이터 위치(memory 또는 storage)를 반드시 지정해야 합니다. 이 키워드가 데이터가 어디에 저장되고 수정이 어디까지 반영되는지를 결정합니다.

함수 안의 임시 struct 는 보통 memory 에 둡니다. 함수가 끝나면 사라지는 복사본입니다. 반대로 상태 변수에 저장된 struct 를 수정할 때는 storage 참조를 사용합니다.

struct 를 반환하는 함수

함수가 struct 를 돌려줄 때는 반환 타입에 memory 를 붙입니다. 외부(external) 호출에서 struct 를 반환하려면 컨트랙트 상단에 pragma abicoder v2 가 필요했으나, 0.8.0 부터는 기본 활성화되어 별도 설정이 필요 없습니다.

function getDefault() public pure returns (Person memory) {
    return Person({ name: "Bob", age: 25 });
}

memory 복사본과 storage 참조

memory 로 받으면 복사본이라 원본 상태 변수는 그대로지만, storage 로 받으면 원본을 가리키는 참조라 변경이 블록체인에 그대로 반영됩니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract People {
    struct Person {
        string name;
        uint256 age;
    }
 
    Person public stored;
 
    function setPerson(string memory _name, uint256 _age) public {
        stored = Person({ name: _name, age: _age });
    }
 
    function haveBirthday() public {
        Person storage p = stored; // 원본을 가리키는 storage 참조
        p.age = p.age + 1;         // 상태 변수가 실제로 바뀐다
    }
 
    function noEffect() public view {
        Person memory copy = stored; // 복사본
        copy.age = 999;              // 원본 stored 는 바뀌지 않는다
    }
}

Person memory copy = stored; 처럼 memory 로 받으면 수정해도 원본은 바뀌지 않습니다. 상태 변수를 실제로 바꾸려면 반드시 storage 참조를 사용하세요.

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

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