형 변환
- 암묵적 형 변환
- 명시적 형 변환
- 형 추론
형 변환이란 서로 다른 자료형의 데이터 사이에 연산을 하기 위하여 같은 자료형으로 변환하는 작업입니다. 몇몇의 경우는 컴파일을 하는 도중 자동 형 변환이 되는데 이것을 암묵적 형 변환이라고 하고 코드 작성을 통하여 수동으로 형 변환을 하는 것을 명시적 형 변환이라고 합니다.
암묵적 형 변환
형 변환을 하여도 데이터 손실이 없는 자료형 변환에서만 일어납니다.
uint8 public a = 25;
uint16 public b;
function change() {
b = a;
}
위의 예시를 보시면 a의 자료형은 uint8이고 b의 자료형은 uint16으로 서로 다른 자료형을 가지고 있습니다. 하지만 함수 change를 작동시키면 b에 a의 값이 들어갑니다. 이처럼 서로의 자료형은 다르지만 uint16의 자료형에 uint8의 자료형을 저장하는 경우 데이터의 손실이 일어나지 않아서 암묵적 형 변환이 일어났습니다. 따라서 b의 값도 25가 됩니다.
uint16 public a = 25;
uint8 public b;
function change() {
b = a;
}
하지만 위의 예시처럼 uint16의 값이 uint8에 저장되는 경우는 데이터 손실이 발생할 수 있기 때문에 오류가 납니다.
명시적 형 변환
암묵적 형 변환의 두 번째 예시의 경우처럼 데이터의 손실이 생기더라도 변환을 하고 싶은 경우에는 직접 코드를 작성하여 형 변환을 시켜줄 수 있습니다. 이것을 명시적 형 변환이라고 합니다.
uint16 public a = 520;
uint8 public b;
function change() {
b = uint(a);
}
명시적 형 변환을 하는 방법은 위의 예시처럼 자료형을 적고 뒤에 괄호 안에 변수를 넣어주면 됩니다. change함수를 작동시키면 520의 값이 uint8의 자료형으로 변하게 되고 uint8에 저장될 수 있는 자료의 범위는 256이 최대이므로 데이터 손실이 발생하여 b에는 8이 저장됩니다. 이러한 식으로 데이터의 손실을 감수하더라도 변환을 하고 싶은 경우 명시적 형 변환을 사용합니다.
형 추론
형 추론은 변수를 선언할 때 자료형을 명시하는 대신에 var로 선언하는 것을 말합니다.
uint16 public k = 32769;
uint24 public r = 2;
function change() public returns(uint){
var d=(r*k);
return d;
}
위의 예시에서 함수 안에 변수 d를 선언하는 과정에서 var을 사용하였습니다. d의 자료형을 밝히지 않았지만 뒤에 오는 r*k에 r과 k가 각각 uint24와 uint16의 자료형을 가지고 있고 두 값의 곱이 65538의 값이 나와 d가 자료형은 uint24에 데이터는 65538이 저장됩니다. 되게 편리해 보이는 자료형이라고 생각하실 수 있지만 오류가 생기면 크게 생기기 때문에 사용에 주의하셔야 합니다.
uint16 public k = 32769;
uint8 public r = 2;
function change() public returns(uint){
var d=(r*k);
return d;
}
위의 예시는 같은 내용의 코딩입니다. 차이는 r의 자료형이 uint24에서 uint8로 바뀌었을 뿐입니다. 이러한 경우 d의 자료형은 uint16이 되며 저장되는 데이터는 2가 됩니다. uint16의 자료형은 최대 65536까지의 범위만 저장할 수 있기 때문에 오버플로우가 발생하여 65538과 65536의 차이만큼인 2가 저장된 것입니다. var이 알맞은 자료형을 찾아 저장된다기보다 var 선언 시 사용된 자료형 중에 큰 자료형을 따라가는 성질이 있습니다. 따라서 항상 사용에 주의하셔야 합니다.