본문으로 건너뛰기
0%

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

작성자 Turja

2022년 10월 4일에 게시됨4분 읽기

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

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

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

Solidity 데이터 타입이란?

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

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

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

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

값 타입(value type)이란?

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

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

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

참조 타입(reference type)이란?

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

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

부호 있는 정수(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입니다.

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

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

스마트 컨트랙트에서 이러한 차이는 개발자가 오류를 피하기 위해 데이터 타입에 저장되는 값을 우선적으로 고려하도록 만듭니다.

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

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

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

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

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

Solidity와 그 기능에 대해 계속 학습하고 싶다면, Alchemy University의 7주 과정 Ethereum Developer Bootcamp에 자리를 확보하세요.

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.