묵시적 형변환

러스트는 C++ 와 다르게 타입 간 _묵시적 변환_을 자동으로 적용하지 않습니다. 아래 예시를 확인해 보세요:

fn multiply(x: i16, y: i16) -> i16 {
    x * y
}

fn main() {
    let x: i8 = 15;
    let y: i16 = 1000;

    println!("{x} * {y} = {}", multiply(x, y));
}

러스트의 정수형 타입은 모두 From<T>Into<T> 트레잇을 구현하고 있으며, 이를 통해 타입 변환이 이루어 집니다. From<T> 트레잇은 from() 메서드를 가지고 있고, Into<T>트레잇은 into() 메서드를 가지고 있습니다. 러스트에서는 FromInto 트레잇을 구현함으로써, 타입 간 변환이 가능하다는 것을 표현합니다.

표준 라이브러리에는 From<i8> for i16가 구현되어 있는데 이것은 i8 타입의 변수 xi16::from(x)를 호출하여 i16타입으로 변환할 수 있다는 의미입니다. 혹은 더 간단하게 x.into()를 사용할 수도 있습니다. 이것이 가능한 이유는 From<i8> for i16 구현을 가지고 있으면 Into<i16> for i8 구현이 자동으로 생성되기 때문입니다.

이는 사용자 정의 타입에도 동일하게 적용되는 규칙입니다. 따라서 From만을 구현해도 Into까지 자동으로 구현이 됩니다.

  1. 위 예제코드를 실행하고 어떤 컴파일 에러가 발생하는지 확인해 보세요.

  2. into()를 사용하여 코드를 수정하세요.

  3. xyf32이나 bool, i128 등으로 바꿔서 해당 타입들로 변환이 되는지 확인해보세요. 작은 사이즈 타입에서 큰 사이즈로 변경해보시고 그 반대로도 해보세요. 표준 라이브러리 문서에서 시도해 본 케이스가 구현되어 있는지 확인해 보세요.