함수에서 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 참조를 사용하세요.