블록체인 학습
0 XP

struct 배열

struct 도 일반 타입처럼 배열로 묶을 수 있습니다. "여러 명의 사용자", "여러 개의 게시글"처럼 같은 모양의 데이터가 여러 개일 때 유용합니다. 등록부, 목록, 기록 저장소처럼 실전 컨트랙트 상당수가 struct 배열 을 뼈대로 삼습니다.

Person[] public people; // Person 동적 배열 (상태 변수)

push 로 새 struct 를 배열 끝에 추가하고, 인덱스(people[0])로 각 요소에 접근합니다. 배열 길이는 people.length 로 얻습니다.

추가하고 읽기

상태 변수 배열에 새 요소를 더할 때는 보통 push 안에서 인스턴스를 만들어 넣습니다. 이미 들어 있는 요소를 수정하려면, people[i] 를 storage 참조로 받아 필드를 바꾸면 변경이 그대로 저장됩니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Registry {
    struct Person {
        string name;
        uint256 age;
    }
 
    Person[] public people;
 
    function addPerson(string memory _name, uint256 _age) public {
        people.push(Person({ name: _name, age: _age }));
    }
 
    function birthday(uint256 _i) public {
        Person storage p = people[_i]; // storage 참조로 요소 수정
        p.age = p.age + 1;
    }
 
    function count() public view returns (uint256) {
        return people.length;
    }
}

people[i] 를 memory 로 복사해 수정하면 배열 원본은 바뀌지 않습니다. 저장된 요소를 바꾸려면 반드시 Person storage p = people[i]; 처럼 storage 참조를 받으세요.

people 이 public 이므로 people(인덱스) 형태의 getter 가 자동 생성되어, 각 요소를 외부에서 조회할 수 있습니다.

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

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