---
title: "Solidity 데이터 타입: 부호 있는 정수(int)와 부호 없는 정수(uint)"
description: "Solidity 데이터 타입과 int, uint 같은 일반적인 타입의 사용법을 알아보세요."
---

# Solidity 데이터 타입: 부호 있는 정수(int)와 부호 없는 정수(uint)

[Solidity](https://www.alchemy.com/overviews/solidity)는 개발자가 Ethereum 블록체인에 애플리케이션을 배포할 때 사용하는 고수준의 객체 지향 정적 타입 언어입니다. 정적 타입 언어로서 [Solidity](https://www.alchemy.com/dapps/solidity)는 개발자가 컴파일 시점에 모든 상태 변수와 지역 변수의 구조와 데이터 타입을 정의하도록 요구합니다.

따라서 [Solidity 스마트 컨트랙트를 학습하는](https://www.alchemy.com/overviews/learn-solidity) 과정에서 Solidity 데이터 타입을 이해하는 것은 필수적입니다. 데이터 타입은 변수에 저장된 정보를 정수, 불리언, 주소, 리터럴, 배열 등 여러 유형으로 분류합니다.

이 글에서는 Solidity의 데이터 타입이 무엇인지 정의하고, uint와 int 같은 일반적인 정수 타입에 대해 자세히 설명합니다.

## **Solidity 데이터 타입이란?**

**다른 정적 타입 언어와 마찬가지로, Solidity 데이터 타입은 특정 값이나 메모리 위치의 참조 주소와 같이 변수에 저장된 정보를 지정합니다.**

Solidity의 데이터 타입은 유연해서, 기본 타입들을 조합하여 정수 배열이나 서로 다른 타입의 변수로 이루어진 구조체 같은 복합 타입을 만들 수 있습니다.

다만 Solidity의 주요 제약 중 하나는 개발자가 컴파일 시점에 모든 변수의 데이터 타입을 지정해야 한다는 것입니다. 타입이 선언되면 컴파일러는 해당 변수를 위해 얼마만큼의 공간을 확보해야 하는지 정확히 알 수 있습니다.

Solidity 데이터 타입은 크게 값 타입(value type)과 참조 타입(reference type) 두 그룹으로 분류할 수 있습니다.

### **값 타입(value type)이란?**

정수와 같은 Solidity 값 타입은 정의된 메모리 공간 내에 데이터를 저장하고, 함수나 할당문에서 사용될 때 복제된 값을 전달하는 변수입니다. 값 타입은 복제된 데이터 타입의 별도 사본을 저장하므로, 복사된 값 타입의 값을 변경해도 원본 값 타입에는 영향을 주지 않습니다.

Solidity에는 8가지 값 타입이 있습니다: 부호 있는/부호 없는 정수, 불리언, 고정 소수점 수, 주소, 바이트 배열, 리터럴, 열거형(enum), 컨트랙트 및 함수 타입입니다. 각각에 대한 간단한 요약은 다음과 같습니다:

1. **부호 있는/부호 없는 정수(Signed/Unsigned integers)** - 정수 데이터 타입은 정수값을 저장하며, 부호 있는 정수는 양수와 음수 값을 모두 저장하고 부호 없는 정수는 음수가 아닌 값만 저장합니다.
1. **불리언(Booleans)** - 불리언 데이터 타입은 bool 키워드로 선언되며, true 또는 false라는 두 가지 상수값만 가질 수 있습니다.
1. **고정 소수점 수(Fixed-point numbers)** - 고정 소수점 수는 Solidity에서 소수를 표현하지만, 아직 [Ethereum virtual machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)에서 완전히 지원되지는 않습니다.
1. **주소(Addresses)** - address 타입은 Ethereum 지갑이나 스마트 컨트랙트 주소를 저장하는 데 사용되며, 일반적으로 약 20바이트 크기입니다. address 타입 뒤에 "payable" 키워드를 붙이면 지갑 주소만 저장하도록 제한되며 transfer 및 send 암호화폐 함수를 사용할 수 있습니다.
1. **바이트 배열(Byte arrays)** - "bytes" 키워드로 선언되는 바이트 배열은 최대 32바이트까지 미리 정해진 개수의 바이트를 저장하는 고정 크기 배열이며, 보통 bytes1, bytes2와 같은 키워드와 함께 선언됩니다.
1. **리터럴(Literals)** - 리터럴은 변수에 저장할 수 있는 주소, 유리수 및 정수, 문자열, 유니코드, 16진수 등의 불변 값입니다.
1. 열거형(Enums) - Enumerable의 줄임말인 열거형은 사용자 정의 데이터 타입으로, 변수의 값을 프로그램 내에 정의된 특정 상수 집합으로 제한합니다.
1. 컨트랙트 및 함수 타입(Contract & Function Types) - 다른 객체 지향 언어와 마찬가지로, 컨트랙트 타입과 함수 타입은 각각 클래스와 그 함수를 나타내는 데 사용됩니다. 컨트랙트는 컨트랙트의 상태 변수를 변경할 수 있는 함수들을 포함합니다.

### **참조 타입(reference type)이란?**

[**고정 배열과 동적 배열**](https://www.alchemy.com/overviews/solidity-arrays)과 같은 Solidity 참조 타입은 저장된 데이터의 메모리 주소를 가리키는 변수입니다. 값 타입과 달리 참조 타입은 값 자체를 저장하지 않고 의도한 데이터의 위치를 추적하는 역할을 합니다. 참조 타입은 주로 다음 네 가지로 분류됩니다:

- **고정 배열(Fixed arrays)** - 고정 배열은 초기화 시 선언되며 런타임에 크기가 미리 정해진 배열입니다.
- **동적 배열(Dynamic arrays)** - 동적 배열은 프로그램이 저장해야 하는 데이터에 따라 런타임에 크기를 동적으로 할당하는 데 사용됩니다.
- **구조체(Structs)** - [Solidity의 구조체](https://www.alchemy.com/overviews/solidity-struct)는 다른 타입의 멤버를 포함하는 사용자 정의 타입을 생성할 수 있는 복합 데이터 타입으로, 보통 연관된 데이터를 그룹화하는 데 사용됩니다.
- **매핑(Mappings)** - [매핑](https://www.alchemy.com/overviews/solidity-mapping)은 다른 객체 지향 언어의 딕셔너리와 유사하게 키-값 쌍으로 데이터를 저장하며, 키는 값 데이터 타입이고 값은 어떤 타입이든 될 수 있습니다.

## **부호 있는 정수(int)란?**

**부호 있는 정수는 int 키워드로 선언되는 값 데이터 타입으로, -2의 255제곱부터 2의 255제곱 - 1까지의 범위에서 양수 또는 음수 정수값을 저장합니다.‍**

### **Solidity 정수 크기**

int 키워드는 최대 256비트 정수 또는 데이터 단위를 저장할 수 있는 정수 데이터 값인 int256의 약어 역할을 합니다. 이 값 데이터 타입은 int8, int16, int32, int64, int128, int256과 같이 8 단위로 더 작은 데이터 값으로도 지정할 수 있습니다. 개발자는 변수의 크기를 제한하고 성능을 최적화하려는 경우 int8, int16, int32, int64와 같은 더 작은 데이터 크기를 사용할 수 있습니다.

## **부호 없는 정수(uint)란?**

**부호 없는 정수는 uint 키워드로 선언되는 값 데이터 타입으로, 0부터 2의 255제곱 - 1까지의 범위에서 0 이상의 정수값을 저장합니다.**

### **Uint 데이터 크기**

부호 있는 정수와 마찬가지로, uint 키워드는 최대 256비트 정수 또는 데이터 단위를 저장할 수 있는 부호 없는 정수 데이터 값인 uint256의 약어 역할을 합니다.

부호 없는 정수 값 데이터 타입도 최소 uint8부터 최대 uint256까지 8 단위로 더 작은 데이터 값으로 지정할 수 있습니다. 그 단위는 uint8, uint16, uint32, uint64, uint128, uint256입니다.

## **부호 있는 정수와 부호 없는 정수의 차이는 무엇인가요?**

**부호 있는 정수와 부호 없는 정수의 핵심 차이는, 부호 있는 정수는 양수와 음수 값을 모두 저장할 수 있는 반면 부호 없는 정수는 음수가 아닌 값만 저장할 수 있다는 점입니다.** 따라서 부호 있는 정수와 부호 없는 정수 모두 값 데이터 타입이지만, 부호 없는 정수는 저장할 수 있는 값의 범위가 제한되어 있습니다.

[스마트 컨트랙트](https://www.alchemy.com/overviews/solidity-smart-contract)에서 이러한 차이는 개발자가 오류를 피하기 위해 데이터 타입에 저장되는 값을 우선적으로 고려하도록 만듭니다.

## **uint와 uint256의 차이는 무엇인가요?**

**uint와 uint256은 서로 별칭(alias)이므로 정의가 동일하지만, 정수 데이터 크기를 명시적으로 표기함으로써 uint256은 스마트 컨트랙트 작성의 모범 사례를 따르며 코드의 가독성과 일관성을 높입니다.**

그 외에는 uint와 uint256 키워드 사이에 차이가 없습니다. 코드에 더 많은 정보를 제공하기 위해 둘 중 하나를 선택하는 것은 개발자의 몫입니다.

## **스마트 컨트랙트에서 부호 있는 정수와 부호 없는 정수(uint) 사용을 시작하세요**

올바른 Solidity 데이터 타입을 사용하는 것은 효율적이고 가독성 높은 스마트 컨트랙트를 개발하는 데 매우 중요합니다. 이러한 데이터 타입은 컴파일러가 정수나 배열과 같은 특정 변수에 얼마나 많은 메모리를, 어떤 타입으로 할당해야 하는지 이해하는 데 도움을 줍니다. 블록체인에 공간을 할당하는 데는 가스가 사용되므로, 변수의 크기와 타입을 선언할 때 신중해야 합니다.

Solidity와 그 기능에 대해 계속 학습하고 싶다면, Alchemy University의 7주 과정 Ethereum Developer Bootcamp에 [자리를 확보하세요](https://university.alchemy.com/?a=ffa69917a7).
