블록체인 학습
0 XP

타입 변환 (casting)

어떤 값을 다른 타입으로 바꾸는 것을 타입 변환(casting) 이라고 합니다. 예를 들어 uint256 값을 uint8 로 줄이거나 address 를 정수로 바꾸는 일입니다. Solidity 는 실수로 인한 데이터 손상을 막기 위해, 대부분의 변환을 개발자가 명시적으로 적도록 요구합니다. 암묵적으로 알아서 바꿔주는 C 언어식 자동 변환은 안전한 경우로만 제한됩니다.

큰 타입을 작은 타입으로 변환하면 상위 비트가 잘려나갑니다. 예를 들어 uint256 값 256 을 uint8 로 변환하면 0 이 됩니다(하위 8비트만 남음). 데이터 손실에 주의하세요.

명시적 변환 문법

변환하려는 타입 이름을 함수처럼 호출합니다. 예를 들어 uint8(value), int256(value), address(num) 형태입니다. 이 한 줄이 "나는 이 변환의 결과를 알고 있고 의도했다"는 선언이 됩니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract ConversionExample {
    function toUint8(uint256 big) public pure returns (uint8) {
        return uint8(big); // 하위 8비트만 남음 (큰 값은 잘림)
    }
 
    function uintToInt(uint256 value) public pure returns (int256) {
        return int256(value);
    }
 
    function addressToUint(address a) public pure returns (uint160) {
        return uint160(a); // address 는 160비트(20바이트)
    }
}

넓히기 변환과 좁히기 변환

작은 타입을 큰 타입으로 바꾸는 변환(넓히기, 예: uint8 → uint256)은 값이 그대로 보존되어 데이터 손실이 없습니다. 반대로 큰 타입을 작은 타입으로 바꾸는 변환(좁히기)은 범위를 벗어난 상위 비트가 잘려나가므로 위험합니다. address ↔ uint160 변환에서 비트 폭(160)이 정확히 맞는 것도 이런 안전성 때문입니다.

enum 과 정수

다음 수업에서 배울 enum 도 내부적으로는 정수라서, uint8(myEnum) 이나 Status(rawNumber) 처럼 정수와 명시적으로 변환할 수 있습니다. 다만 정수를 enum 으로 되돌릴 때 멤버 범위를 벗어나면 런타임에 revert 되므로 주의해야 합니다.

좁히기 변환을 하기 전에는 이 값이 정말 작은 타입의 범위 안에 들어가는지 먼저 확인하세요. 필요하다면 require(value <= type(uint8).max, "too big"); 같은 검증을 함께 두면 안전합니다.

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

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