블록체인 학습
0 XP

struct 선언 문법

구조체 는 struct 키워드 + 타입 이름 + 중괄호 안의 필드 목록으로 선언합니다. 각 필드는 타입 이름; 형태이며 반드시 세미콜론으로 끝납니다. 필드를 적은 순서가 나중에 위치 기반 인스턴스 생성에서 값을 넣는 순서가 되니, 의미상 자연스러운 순서로 적으세요.

struct 타입이름 {
    타입 필드1;
    타입 필드2;
}

struct 타입 이름은 관례적으로 PascalCase(첫 글자 대문자)로 짓습니다. Book, Token, User 처럼요. 반면 필드 이름에는 보통 camelCase 를 씁니다.

필드에 넣을 수 있는 타입

필드에는 uint256, bool, address, string 같은 기본 타입은 물론, 배열·다른 struct(중첩)까지 넣을 수 있습니다. mapping(키-값 저장소, Chapter 9 에서 배웁니다)도 필드로 둘 수 있지만 제약이 많습니다. 다만 struct 는 자기 자신을 직접 필드로 가질 수는 없습니다(재귀 금지). 또한 함수는 필드가 될 수 없습니다.

mapping 을 필드로 가진 struct 는 storage 에서만 쓸 수 있습니다. 그래서 Person memory p = Person({...}) 처럼 memory 로 만들거나 복사할 수 없고, returns (Person memory) 로 반환할 수도 없으며, public 상태 변수의 자동 getter 에서도 해당 mapping 필드는 빠집니다. 입문 단계에서는 struct 안에 mapping 을 두지 않는 편이 안전합니다.

struct 를 선언하는 위치

struct 는 보통 컨트랙트 안쪽 맨 위에 선언합니다. 그러면 그 컨트랙트의 모든 함수와 상태 변수에서 해당 타입을 자유롭게 사용할 수 있습니다. 여러 컨트랙트가 공유해야 한다면 파일 최상단(컨트랙트 바깥)에 둘 수도 있습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Library {
    struct Book {
        string title;     // 제목
        uint256 year;     // 출판 연도
        bool available;   // 대출 가능 여부
    }
}

struct 선언 자체는 설계도를 그린 것일 뿐, 아직 실제 데이터를 만들지는 않습니다. 데이터를 만들려면 이 설계도로 인스턴스를 생성해야 합니다.

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

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