Tech Lab3 min read

솔리디티 코스 #5: 정수타입 핵심 실전 가이드북(uint/int)

솔리디티 숫자 타입의 핵심을 한 번에 정리합니다. uint/int 범위, 연산 규칙, 0.8.x의 오버플로우 방지와 안전한 코딩 팁을 예제로 확인하세요.

#solidity#number#types#uint#int#range#solidity#0.8#overflow#smart#contract#math#safe#arithmetic

독자는 이 글을 통해 Solidity의 숫자 타입 설계 의도와 안전한 사용법을 빠르게 이해하며, 스마트 컨트랙트에서 숫자 연산으로 인한 오류를 예방하는 방법을 얻게 됩니다.

넘버타입

숫자 타입 한눈에 이해

  • Solidity는 부동소수점을 지원하지 않으며, 정수형만 제공합니다.
  • 실수 계산이 필요하면 스케일링(예: 1e18 배수)로 정수화해 처리합니다.
  • 타입 불일치(uint vs int)는 암묵 변환에 의존하지 말고 명시적 캐스팅을 권장합니다.

주의: 토큰, 금액, 카운터는 부호 없는 정수(uint)가 기본 선택입니다.

부호 없는 정수(uint)와 부호 있는 정수(int)

  • uint는 0 이상만 저장하며 uint8~uint256(8비트 단위)로 제공됩니다.
  • int는 음수/양수 모두 저장하며 int8~int256로 제공됩니다.
  • 기본 별칭: uint == uint256, int == int256.

비트 크기별 개요 표

타입비트값 범위 요약
uint880 ~ 255
uint2562560 ~ 2²⁵⁶-1
int88-128 ~ 127
int256256-2²⁵⁵ ~ 2²⁵⁵-1

팁: 범위를 초과하는 값은 0.8.x에서 자동으로 예외가 발생하므로 테스트에서 에지 케이스를 반드시 포함하세요.

기본 연산과 안전 패턴

  • 지원 연산: +, -, *, /, %, 지수 **
  • 0으로 나누기 방지, 타입 혼합 회피, 명시적 캐스팅이 핵심입니다.
// 사칙연산과 모듈러
contract MathOperations {
    function add(uint256 a, uint256 b) external pure returns (uint256) {
        return a + b;
    }
    function sub(uint256 a, uint256 b) external pure returns (uint256) {
        return a - b;
    }
    function mul(uint256 a, uint256 b) external pure returns (uint256) {
        return a * b;
    }
    function div(uint256 a, uint256 b) external pure returns (uint256) {
        require(b > 0, "division by zero");
        return a / b; // 정수 나눗셈(내림)
    }
    function mod(uint256 a, uint256 b) external pure returns (uint256) {
        require(b > 0, "division by zero");
        return a % b;
    }
}

주의: 정수 나눗셈은 소수점을 버립니다. 가격·수수료 계산 시 스케일링(amount * 1e18 / price) 순서에 주의하세요.

지수, 최소·최대, 실전 스니펫

  • 지수 연산자는 **이며 오버플로우에 특히 주의합니다.
  • 삼항 연산자로 간단한 비교 로직을 구성할 수 있습니다.
contract Utils {
    function pow(uint256 base, uint256 exp) external pure returns (uint256) {
        return base ** exp; // 예: 2 ** 5 == 32
    }
    function min(uint256 a, uint256 b) external pure returns (uint256) {
        return a < b ? a : b;
    }
    function max(uint256 a, uint256 b) external pure returns (uint256) {
        return a > b ? a : b;
    }
}

팁: 반복 제곱이 필요하면 루프/제곱 분할 정복보다, 사용 빈도·가스 비용을 검토한 뒤 구현을 선택하세요.

0.8.x의 오버/언더플로우 체크

  • Solidity 0.8.x부터 산술 오버/언더플로우가 자동 검사되어 예외를 던집니다.
  • 0.8.x 이전처럼 SafeMath를 별도 사용하지 않아도 됩니다(특수 최적화 목적 제외).
contract OverflowProtection {
    function test(uint8 a, uint8 b) external pure returns (uint8) {
        return a + b; // 255 초과 시 revert
    }
}

주의: 외부 호출 결과를 더하거나 곱할 때 입력 검증을 선행하세요. 예외 발생은 상태 변경을 되돌리지만, 가스가 불필요하게 소비될 수 있습니다.

실무 체크리스트와 베스트 프랙티스

  • 금액·수량·카운터: uint256 통일로 연산 오류와 캐스팅 비용 최소화.
  • 음수 가능성: 비즈니스 로직에 엄밀히 필요할 때만 int 사용.
  • 스케일링 고정 소수점: DECIMALS 상수로 단위 일관성 유지.
  • 테스트: 경계값(최대·최소), 0 나눗셈, 지수 오버플로우 케이스 포함.
  • 리뷰: 타입 혼합 연산, 암묵 변환 경고, 나눗셈 순서 점검.

토큰금액계산


다음 글 알림을 원하시면 구독하시고, 시리즈 인덱스에서 학습 순서대로 이어서 읽어 보세요!

참고 링크

다음으로 읽어볼 글