Tech Lab3 min read

솔리디티 코스 #4: 타입(Type) 기초 — 값 타입 완전 정리

Solidity 값 타입 핵심을 빠르게 익히고, 가스 절감과 오류 예방에 도움이 되는 선택 기준과 예제를 제공합니다. 코스형 흐름으로 바로 적용 가능합니다.

#solidity#value-type#ethereum-smart-contract#gas-optimization#solidity-beginners

이 글을 통해 Solidity의 값(Value) 타입을 한 번에 정리하고, 가스 비용과 안정성을 고려해 어떤 타입을 선택할지 명확한 기준을 얻게 됩니다.

솔리디티 타입

값 타입이란?

  • 값 타입은 변수가 값 자체를 보관하는 타입입니다.
  • 읽고 쓸 때 복사(copy) 가 일어나며, 함수 인자 전달 시에도 기본적으로 값 복사가 됩니다.
  • 대표 예시: 정수형, 불리언, 주소, 고정 바이트, 열거형.

핵심: 값 타입은 고정 크기가 많아 가스 예측이 쉽고, 참조 부작용이 적습니다.

정수와 불리언

값 타입 중 가장 빈도가 높은 기본형입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract ValueTypesBasics {
    uint256 public positiveNumber = 100; // 0 이상의 정수
    int256  public negativeNumber = -50; // 음수 포함 정수
    bool    public isActive = true;      // true / false
}
  • uint8 ~ uint256, int8 ~ int256까지 8비트 단위로 선택 가능.
  • 최적화: 범위가 충분히 작다면 더 작은 비트수를 고려하되, 읽기/쓰기 묶음과 패킹을 함께 검토하세요.
  • 불리언은 조건 분기와 상태 플래그에 사용. 명확한 네이밍으로 오해를 줄입니다.

팁: 여러 bool을 개별 상태 변수로 두기보다 uint256 비트마스크로 묶는 패턴이 가스에 유리한 경우가 있습니다.

주소와 이더 전송

스마트 컨트랙트에서 신뢰 가능한 식별자이자 자금 전송 대상입니다.

pragma solidity ^0.8.20;

contract AddressExample {
    address public wallet = 0x1234567890aBCdef1234567890AbcDEF12345678;

    // 이더 전송 가능 주소
    address payable public recipient = payable(wallet);

    function pay() external payable {
        require(msg.value > 0, "no ether");
        // 최근 스타일: call 사용 권장 (가스 포워딩 제어)
        (bool ok, ) = recipient.call{value: msg.value}("");
        require(ok, "transfer failed");
    }
}
  • address: 20바이트 식별자.
  • address payable: value 전송 가능. 전송 시에는 call 패턴을 사용해 가스·재진입 이슈에 주의하세요.

주의: 외부로 이더 전송 시 재진입 위험을 줄이기 위해 Checks-Effects-Interactions 순서를 적용하세요.

바이트와 열거형

저수준 데이터 표현과 상태 머신 구성에 유용합니다.

pragma solidity ^0.8.20;

contract BytesEnum {
    // 고정 크기 바이트: 값 타입
    bytes32 public hashLike = bytes32("demo");

    // 열거형: 상태 제한에 최적
    enum State { Created, Active, Inactive }
    State public state = State.Active;

    function deactivate() external {
        require(state == State.Active, "not active");
        state = State.Inactive;
    }
}
  • bytes1 ~ bytes32값 타입. 크기가 고정되어 가스 예측이 용이합니다.
  • bytes(가변 바이트)는 참조 타입이므로 본 글의 범위를 넘어갑니다. 자세한 비교는 참조 타입 자세히 보기 를 참고하세요.

선택 기준과 가스 관점

주요 값 타입을 상황에 맞게 고르는 간단한 표입니다.

목적권장 타입예시특징/가스 메모
카운터/양수 식별자uint256토큰 수량기본형, 연산 단순
범위 제한 양수uint8~uint128작은 인덱스패킹 시 유리, 단 독립 변수 남발 시 이득↓
음수 포함 수치int256가격 변동치음수 필요 시 선택
논리 플래그bool활성/비활성다수일 때 비트마스크 고려
지갑/컨트랙트 식별address/address payable수신자이더 전송엔 call 권장
고정 길이 데이터bytes32해시/슬롯 키고정 크기, 비교/저장 유리
제한된 상태 집합enum상태 머신잘못된 값 배제, 가독성↑

팁: 상태 변수 패킹은 같은 32바이트 슬롯 안에 들어갈 때 의미가 큽니다. 선언 순서와 비트 폭을 함께 설계하세요.

안전한 코드 패턴

  • Require 선행: 입력·권한을 먼저 검증해 불필요한 연산을 차단합니다.
  • 명시적 타입 변환: 다운캐스팅 시 오버플로/언더플로 가능성을 인지하고 테스트를 강화하세요.
  • 상수 사용: 자주 쓰는 값은 constant/immutable로 선언해 가스를 줄이고 의미를 명확히 합니다.
uint256 public constant MAX_SUPPLY = 1_000_000;

마무리

값 타입은 가스 비용, 안전성, 가독성의 기반입니다. 직전 강의가 필요하다면 솔리디티 코스 #3: pragma와 컴파일러 버전 전략 를 먼저 확인하세요.

참고 링크

다음으로 읽어볼 글