Solidity의 struct란?
작성자 John Favole
Solidity에는 uint (부호 없는 정수), bool, string 같은 다양한 기본 데이터 타입이 있지만, 블록체인 개발자로서 직접 정의할 수 있는 유연한 데이터 타입이 필요할 때가 있습니다. **구조체(struct)**는 다양한 데이터 타입의 변수들을 하나의 변수 또는 사용자 정의 타입으로 묶을 수 있는 Solidity의 데이터 구조 형식입니다.
이 글에서는 Solidity의 구조체를 소개하고, 구조체가 무엇을 하며 어떻게 동작하는지 설명합니다. 마지막으로 구조체를 사용해 더 견고한 스마트 컨트랙트를 만드는 방법을 설명합니다.
Solidity 구조체란 무엇인가?
구조체는 다양한 데이터 타입의 변수들을 하나의 변수 또는 사용자 정의 타입으로 묶을 수 있는 Solidity의 창의적인 데이터 구조 형식입니다. 데이터 타입들이 구조체로 그룹화되면, 구조체 이름은 그 안에 포함된 변수 집합을 나타냅니다.
구조체를 여러 종류의 물건이 담긴 컨테이너라고 상상해 보세요. 컨테이너를 옮기면 그 안에 있는 모든 물건도 함께 옮겨집니다. 마찬가지로 Solidity 개발자가 구조체의 이름을 선언하거나 호출하면, 그 구조체는 안에 포함된 데이터 타입에 따라 동작합니다.
다음은 Solidity 구조체의 예시입니다:
위 구조체 예시는 address creator, string name, address users, uint amount에 대한 변수를 포함합니다.
Solidity 구조체 코드 예시
이 섹션에서는 Solidity에서 구조체를 정의하고 생성하는 샘플 코드를 보여줍니다. 또한 구조체 선언에 사용할 수 있는 두 가지 방법도 설명합니다. 마지막으로 구조체를 임포트하고 초기화하는 방법을 보여드립니다.
Solidity에서 구조체를 정의하고 생성하는 방법
구조체 코드는 Javascript에서 객체를 선언하는 방식과 비슷합니다. 겉모습은 비슷해 보이지만, 문법은 서로 다르게 동작합니다. Solidity 구조체는 항상 다음과 같은 형식을 따릅니다:
Solidity 구조체를 정의하고 생성하는 방법은 다음과 같습니다:
- struct 키워드를 작성하여 구조체를 생성합니다. 이는 뒤에 오는 타입이 사용자 정의 타입임을 Solidity 컴파일러에게 알려줍니다
- 구조체의 이름을 정합니다. 이 이름은 구조체 안에 묶인 변수들과 연결됩니다
- 중괄호를 사용합니다. 대괄호나 소괄호 같은 다른 형태의 괄호는 컴파일되지 않습니다
중괄호를 사용하지 않으면 Remix에서 다음과 같은 ParserError 메시지가 발생합니다.

- 데이터 타입과 그에 해당하는 변수를 선언합니다
위 예시에서는 string theWord, uint theFigure, bool polarData가 그것입니다. 이 부분에서 구조체의 변수 집합을 선언하게 됩니다. 스마트 컨트랙트 내에서 구조체가 선언된 후에는, 이후 코드에서 해당 구조체의 이름을 호출할 수 있습니다.
개발자 팁:
- 중괄호만 사용하세요
- 구조체의 각 멤버는 세미콜론으로 끝내세요
- 선언한 데이터 타입에 맞지 않는 변수를 입력하면 Solidity에서 오류가 발생합니다
- 스마트 컨트랙트는 여러 개의 구조체를 포함할 수 있으며, 각 구조체는 키워드로 구분됩니다
Solidity 구조체를 선언하는 방법
구조체는 컨트랙트 내부 또는 외부 두 곳에서 선언할 수 있습니다. 구조체를 어디에 선언할지는 무엇을 하려는지에 따라 달라집니다. 두 가지 구조체 선언 방식을 살펴보겠습니다.
컨트랙트 외부에 구조체 선언하기
위 예시에서 floorOverlay 구조체는 스마트 컨트랙트 외부에 선언되었으며, 코드베이스 내 모든 컨트랙트에서 이를 호출할 수 있습니다. 특정 컨트랙트에만 필요한 개별 구조체와 달리, 모든 컨트랙트에서 두루 활용할 수 있는 구조체를 만들려면 스마트 컨트랙트 외부에 선언하는 것이 좋습니다.
또한 여러 스마트 컨트랙트가 동일한 구조체 모음을 사용하도록 하려면, 각 스마트 컨트랙트마다 별도로 구조체를 만드는 대신 pragma 바로 뒤에 선언하세요.
컨트랙트 내부에 구조체 선언하기
carpet 구조체는 스마트 컨트랙트 내부에 있으며, 그 결과 이 구조체의 기능은 현재 컨트랙트로 제한됩니다. 다른 컨트랙트는 이 이름을 호출할 수 없습니다.
Solidity 구조체를 임포트하는 방법
구조체는 한 스마트 컨트랙트에서 다른 스마트 컨트랙트로 임포트할 수 있으며, 이는 개발자가 시간을 절약하고 재사용 가능한 코드를 만드는 데 도움이 됩니다. 구조체를 임포트하는 방법을 보여드리기 위해, 아래에 두 개의 스마트 컨트랙트를 준비했습니다. 하나는 구조체가 생성된 곳이고, 다른 하나는 이를 임포트할 곳입니다.
임포트할 때 피해야 할 오류가 하나 있습니다: 두 번째 컨트랙트의 이름은 임포트하려는 구조체의 이름과 같아야 합니다. 그렇지 않으면 Solidity 컴파일러가 이를 식별하지 못해 버그가 발생합니다.
Solidity에서 구조체를 초기화하는 방법
구조체를 선언하고 생성했더라도, 특정 초기값을 할당하지 않으면 다양한 Solidity 함수에서 이를 사용할 수 없습니다. 구조체를 초기화하는 방법은 3가지입니다: (i) 키-값 쌍 방식, (ii) 정의 후 업데이트하는 방식, (iii) 매개변수를 괄호로 묶는 방식.
1. 키-값 쌍 방식
이 방식에서는 구조체 내 각 키 타입을 선택해 값을 할당합니다.
이 방식의 문법은 엄격하지 않아서, 구조체 내 타입의 순서를 따르지 않아도 됩니다.
2. 정의 후 업데이트하는 방식
이 초기화 방식의 문법은, 먼저 구조체를 저장할 변수를 입력한 뒤 그 변수를 이용해 구조체의 각 멤버에 접근하고 이름을 지정하는 방식입니다. 다음 코드는 그 예시입니다:
다만, 이 방식은 코드가 더 길어지기 때문에 대부분의 개발자들은 잘 사용하지 않는다는 점을 기억하세요.
3. 매개변수를 괄호로 묶는 방식
이 방식을 사용하려면 구조체의 이름을 호출하고, 그 메모리를 저장한 뒤, 구조체 멤버들에 순서대로 값을 부여해야 합니다. 다음은 그 예시입니다:
여기서 "measles"는 이 초기화를 저장하는 변수이며, 구조체에 명시된 순서대로 매개변수를 선언했습니다. Solidity 컴파일러가 이를 식별할 수 있도록, 선언의 이름은 항상 괄호 안에 작은따옴표로 감싸야 한다는 점을 기억하세요.
Solidity 구조체 사용 사례
이 섹션에서는 컨트랙트 내 사용자 정보를 추적하는 Solidity 사용 사례를 보여줍니다. 이 사용 사례에서는 구조체가 매핑됩니다.
Solidity에서 구조체를 매핑할 수 있는가?
구조체는 값 타입(value type)으로서 Solidity에서 매핑될 수 있으며, 이를 통해 구조체 멤버에 관한 정보를 추적할 수 있습니다. 예를 들어 다음 코드를 살펴보세요:
이 컨트랙트에서는 특정 DAO에 속한 각 멤버의 세부 정보가 분류됩니다. 여기서는 두 개의 매핑을 만들었습니다: 하나는 단순 매핑이고, 다른 하나는 중첩 매핑입니다.
단순 매핑에서는 특정 멤버를 더 쉽게 찾을 수 있도록 각 멤버의 주소를 구조체에 매핑했습니다. 또한 중첩 매핑을 사용하면 DAO 멤버들의 주소와 투표 여부를 더 쉽게 추적할 수 있습니다.
매핑은 항상 키 타입 => 값 타입 문법을 따르기 때문에, 구조체는 항상 값 타입으로 선언해야 하며 키 타입으로 선언해서는 안 됩니다. 그렇지 않으면 오류가 발생합니다.

요약 — Solidity 구조체의 핵심은 무엇인가?
Solidity의 구조체를 사용하면 개발자는 만들고자 하는 것에 맞는 사용자 정의 타입을 만들 수 있습니다. 이러한 사용자 정의 타입은 서로 관련된 데이터 타입들을 담고 있는 컨테이너와 비슷합니다. 구조체에 대해 더 알아보려면 Alchemy University의 Solidity 부트캠프에 등록하세요!
관련 개요

블록체인 매직을 만드세요
Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.


