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