블록체인 학습
0 XP

부호 없는 정수: uint

여기서부터는 직접 스마트 컨트랙트를 만드는 개발자 트랙입니다. Chapter 1·2에서 블록체인이 무엇이고 그 위에 코드를 올린다는 감을 잡았으니, 이제 Solidity를 이루는 재료인 데이터 타입부터 함수·제어문까지 하나씩 익혀 나갑니다.

스마트 컨트랙트가 다루는 값은 잔액, 수량, 토큰 개수, 시간(timestamp)처럼 대부분 정수입니다. 그중에서도 가장 많이 쓰이는 타입이 uint 입니다. uint 은 부호 없는 정수(unsigned integer) 로, 0 이상의 정수만 저장하며 음수는 담을 수 없습니다. 토큰 잔액이나 개수처럼 음수가 될 수 없는 값에 자연스럽게 들어맞기 때문에 Solidity 코드에서 가장 흔하게 등장합니다.

uint 은 uint256 의 별칭입니다. 둘은 완전히 같은 타입이라 코드에서 섞어 써도 동작이 똑같습니다.

크기 지정하기

uint 은 8비트 단위로 uint8 부터 uint256 까지 32단계로 크기를 지정할 수 있습니다. 비트 수가 클수록 표현 가능한 최대값이 커집니다.

  • uint8 : 0 ~ 255 (2^8 − 1)
  • uint16 : 0 ~ 65,535 (2^16 − 1)
  • uint256 : 0 ~ 약 1.15 × 10^77 (2^256 − 1)

값을 지정하지 않은 uint 상태 변수의 기본값은 항상 0 입니다. null 이나 비어 있음 같은 개념이 없으므로, 초기화하지 않아도 0 으로 시작한다는 점을 기억하세요.

작은 타입과 오버플로

작은 크기(uint8 등)는 여러 변수를 한 슬롯에 묶는 변수 패킹에서 가스를 아끼는 데 유용합니다. 다만 표현 범위를 넘어서면 문제가 생깁니다. ^0.8.0 부터는 산술 오버플로/언더플로가 자동으로 감지되어 트랜잭션이 되돌려지므로(revert), 옛 버전에서 악명 높던 오버플로 버그는 기본 차단됩니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract UintExample {
    uint256 public bigNumber = 1000000;
    uint8 public smallNumber = 255;     // uint8 의 최대값
    uint public defaultUint = 42;       // uint == uint256
    uint256 public zeroByDefault;       // 초기화 안 하면 0
}

특별한 이유로 작은 타입을 골라야 하는 경우가 아니라면 그냥 uint256 을 쓰세요. EVM 은 256비트 단위로 동작하므로, 작은 타입이 항상 더 싸지는 않습니다. 가독성과 안전이 먼저입니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.