---
title: "Solidity의 struct란?"
description: "Solidity Struct의 기능, 작동 방식, 사용 시점 알아보기"
---

# Solidity의 struct란?

[Solidity](https://www.alchemy.com/overviews/solidity)에는 [_uint_ \(부호 없는 정수\)](https://www.alchemy.com/overviews/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 구조체를 정의하고 생성하는 방법은 다음과 같습니다:**

1. **struct 키워드**를 작성하여 구조체를 생성합니다. 이는 뒤에 오는 타입이 사용자 정의 타입임을 [Solidity 컴파일러](https://www.alchemy.com/overviews/solidity-compiler)에게 알려줍니다
1. 구조체의 이름을 정합니다. 이 이름은 구조체 안에 묶인 변수들과 연결됩니다
1. 중괄호를 사용합니다. 대괄호나 소괄호 같은 다른 형태의 괄호는 컴파일되지 않습니다

중괄호를 사용하지 않으면 Remix에서 다음과 같은 **ParserError** 메시지가 발생합니다.

<ImageBlock
  src="https://media.alchemy.com/1704181525-parsererror-message.png"
  alt="구조체에서 중괄호를 사용하지 않았을 때 Remix 컴파일러가 표시하는 ParserError 메시지."
  width={809}
  height={185}
  caption="구조체에서 중괄호를 사용하지 않았을 때 Remix 컴파일러가 표시하는 ParserError 메시지."
/>

      4. 데이터 타입과 그에 해당하는 변수를 선언합니다

위 예시에서는 string theWord, uint theFigure, bool polarData가 그것입니다. 이 부분에서 구조체의 변수 집합을 선언하게 됩니다. 스마트 컨트랙트 내에서 구조체가 선언된 후에는, 이후 코드에서 해당 구조체의 이름을 호출할 수 있습니다.

#### **개발자 팁:**

- 중괄호만 사용하세요
- 구조체의 각 멤버는 세미콜론으로 끝내세요
- 선언한 데이터 타입에 맞지 않는 변수를 입력하면 Solidity에서 오류가 발생합니다
- 스마트 컨트랙트는 여러 개의 구조체를 포함할 수 있으며, 각 구조체는 키워드로 구분됩니다

### Solidity 구조체를 선언하는 방법

구조체는 **컨트랙트 내부 또는 외부** 두 곳에서 선언할 수 있습니다. 구조체를 어디에 선언할지는 무엇을 하려는지에 따라 달라집니다. 두 가지 구조체 선언 방식을 살펴보겠습니다.

#### **컨트랙트 외부에 구조체 선언하기**

위 예시에서 _floorOverlay_ 구조체는 [스마트 컨트랙트](https://www.alchemy.com/overviews/solidity-smart-contract) 외부에 선언되었으며, 코드베이스 내 모든 컨트랙트에서 이를 호출할 수 있습니다. 특정 컨트랙트에만 필요한 개별 구조체와 달리, 모든 컨트랙트에서 두루 활용할 수 있는 구조체를 만들려면 스마트 컨트랙트 외부에 선언하는 것이 좋습니다.

또한 여러 스마트 컨트랙트가 동일한 구조체 모음을 사용하도록 하려면, 각 스마트 컨트랙트마다 별도로 구조체를 만드는 대신 _pragma_ 바로 뒤에 선언하세요.

#### **컨트랙트 내부에 구조체 선언하기**

_carpet_ 구조체는 스마트 컨트랙트 내부에 있으며, 그 결과 이 구조체의 기능은 현재 컨트랙트로 제한됩니다. 다른 컨트랙트는 이 이름을 호출할 수 없습니다.

### Solidity 구조체를 임포트하는 방법

구조체는 한 스마트 컨트랙트에서 다른 스마트 컨트랙트로 임포트할 수 있으며, 이는 개발자가 시간을 절약하고 재사용 가능한 코드를 만드는 데 도움이 됩니다. 구조체를 임포트하는 방법을 보여드리기 위해, 아래에 두 개의 스마트 컨트랙트를 준비했습니다. 하나는 구조체가 생성된 곳이고, 다른 하나는 이를 임포트할 곳입니다.

임포트할 때 피해야 할 오류가 하나 있습니다: 두 번째 컨트랙트의 이름은 임포트하려는 구조체의 이름과 같아야 합니다. 그렇지 않으면 Solidity 컴파일러가 이를 식별하지 못해 버그가 발생합니다.

### **Solidity에서 구조체를 초기화하는 방법**

구조체를 선언하고 생성했더라도, 특정 초기값을 할당하지 않으면 [다양한 Solidity 함수](https://www.alchemy.com/overviews/solidity-modifier)에서 이를 사용할 수 없습니다. 구조체를 초기화하는 방법은 3가지입니다: \(i\) 키-값 쌍 방식, \(ii\) 정의 후 업데이트하는 방식, \(iii\) 매개변수를 괄호로 묶는 방식.

#### **1. 키-값 쌍 방식**

이 방식에서는 구조체 내 각 키 타입을 선택해 값을 할당합니다.

이 방식의 문법은 엄격하지 않아서, 구조체 내 타입의 순서를 따르지 않아도 됩니다.

#### **2. 정의 후 업데이트하는 방식**

이 초기화 방식의 문법은, 먼저 구조체를 저장할 변수를 입력한 뒤 그 변수를 이용해 구조체의 각 멤버에 접근하고 이름을 지정하는 방식입니다. 다음 코드는 그 예시입니다:

다만, 이 방식은 코드가 더 길어지기 때문에 대부분의 개발자들은 잘 사용하지 않는다는 점을 기억하세요.

#### **3. 매개변수를 괄호로 묶는 방식**

이 방식을 사용하려면 구조체의 이름을 호출하고, 그 메모리를 저장한 뒤, 구조체 멤버들에 순서대로 값을 부여해야 합니다. 다음은 그 예시입니다:

여기서 "measles"는 이 초기화를 저장하는 변수이며, 구조체에 명시된 순서대로 매개변수를 선언했습니다. Solidity 컴파일러가 이를 식별할 수 있도록, 선언의 이름은 항상 괄호 안에 작은따옴표로 감싸야 한다는 점을 기억하세요.

## **Solidity 구조체 사용 사례**

이 섹션에서는 컨트랙트 내 사용자 정보를 추적하는 Solidity 사용 사례를 보여줍니다. 이 사용 사례에서는 구조체가 매핑됩니다.

### **Solidity에서 구조체를 매핑할 수 있는가?**

**구조체는 값 타입(value type)으로서 Solidity에서 매핑될 수 있으며, 이를 통해 구조체 멤버에 관한 정보를 추적할 수 있습니다.** 예를 들어 다음 코드를 살펴보세요:

이 컨트랙트에서는 특정 DAO에 속한 각 멤버의 세부 정보가 분류됩니다. 여기서는 두 개의 매핑을 만들었습니다: 하나는 단순 매핑이고, 다른 하나는 중첩 매핑입니다.

단순 매핑에서는 특정 멤버를 더 쉽게 찾을 수 있도록 각 멤버의 주소를 구조체에 매핑했습니다. 또한 [중첩 매핑](https://www.alchemy.com/overviews/solidity-mapping)을 사용하면 DAO 멤버들의 주소와 투표 여부를 더 쉽게 추적할 수 있습니다.

매핑은 항상 키 타입 =&gt; 값 타입 문법을 따르기 때문에, 구조체는 항상 값 타입으로 선언해야 하며 키 타입으로 선언해서는 안 됩니다. 그렇지 않으면 오류가 발생합니다.

<ImageBlock
  src="https://media.alchemy.com/1704181857-remix-error.png"
  alt="구조체를 키 타입으로 선언하려고 할 때 발생하는 Remix 오류."
  width={935}
  height={160}
  caption="구조체를 키 타입으로 선언하려고 할 때 발생하는 Remix 오류."
/>

## **요약 — Solidity 구조체의 핵심은 무엇인가?**

Solidity의 구조체를 사용하면 개발자는 만들고자 하는 것에 맞는 사용자 정의 타입을 만들 수 있습니다. 이러한 사용자 정의 타입은 서로 관련된 데이터 타입들을 담고 있는 컨테이너와 비슷합니다. 구조체에 대해 더 알아보려면 [Alchemy University의 Solidity 부트캠프](https://www.alchemy.com/university/courses/solidity?a=53bceeeaa3)에 등록하세요!
