프로그래밍 언어/[Rust]

[Rust] Type Conversion

swc0317 2025. 1. 7. 22:44
728x90
반응형
1. as

 

기본 타입간 변환은 as를 통해 명시적으로 변환합니다.

 

[Rust] Types

Rust의 Casting Rust는 Implicit Casting, 즉 암묵적 형 변환을 허용하지 않습니다. 먼저 C, C++의 예시를 보겠습니다. #include #include using namespace std;int main(){ int int32 = 26; unsigned int uni32 = 46; auto sum = int32 + un

swc0317.tistory.com

 

예를 들어, i32 f64로 변환하거나, u8 i32로 변환할 때 사용됩니다

 

let x: i32 = 42;
let y: f64 = x as f64;

 

그러나 user-defined된 구조체같은, 복잡한 타입간 변환은

 

부가적인 연산을 필요로할 수 있습니다.

 

예를 들어 두 구조체를 들어보겠습니다.

 

struct Circle {
    radius: i32
}

struct Point {
    x: i32,
    y: i32,
}

 

반지름을 가지는 Circle 구조체와, x, y라는 좌표를 가지는 Point 구조체입니다.

 

만약, Point 구조체로부터, 해당 좌표서 0, 0까지의 반지름 길이를 가지는 

 

Circle로의 변환을 필요로 한다 가정합시다. 그러나 이는 

 

두 좌표를 제곱한 뒤, 더하고 squre root 하는 연산을 필요로 합니다. 이러한 

 

복잡한 연산을 위해 From, Into Casting을 제공합니다.

 

2. From, Into

 

메소드처럼 사용되며, 입력받은 파라미터를, 주어진 

 

타입형으로 변환합니다.

 

예를 들어, 정수형에서 구조체로 변환한다 가정합시다.

 

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    println!("My number is {:?}", num);
}

 

변환하고자 하는 구조체 Number와, 정수를 해당 Number 구조체로

 

from을 통해 구현하고 싶을 때, From trait을 구현합니다.

 

Into는 from과 마찬가지로 어떤 타입형을 원하는 타입형으로의

 

캐스팅을 명시적으로 구현할 수 있지만 사용 방법이 조금 다릅니다.

 

From은 주어진 값을, 명시적인 타입으로 변환하나,

 

Into는 입력받은 값에 메소드처럼 사용하여, 식별자에 타입에 맞게

 

변환합니다.

 

use std::convert::Into;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl Into<Number> for i32 {
    fn into(self) -> Number {
        Number { value: self }
    }
}

fn main() {
    let int = 5;
    // Try removing the type annotation
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

 

into를 보시면 Number::from() 과 달리 from의 도착형에 대한

 

명시적인 표현이 없으나, 식별자에 Number형에 맞게 작동합니다.

 

특히, from와 into는 interchangeble해서 하나를 구현하면

 

다른 하나는 구현 없이도 사용할 수 있습니다.

 

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    println!("My number is {:?}", num);
    let stuct: Number = 25.into();
    println!("My number is {:?}", stuct);
}

 

3. parse

 

문자열로부터의 다른 타입으로의 변환을 명시합니다.

 

fn main() {
    let parsed: i32 = "5".parse().unwrap();
    let turbo_parsed = "10".parse::<i32>().unwrap();

    let sum = parsed + turbo_parsed;
    println!("Sum: {:?}", sum);
}

 

"5"라는 문자열을 parse하면 i32 형에 5라는 값을 담긴 값으로 전달됩니다.

 

이렇게 기본형으로의 변환은 추가적인 구현없이 문자열로의 변환을

 

문제없이 변환합니다. 그러나 user-defined type의 경우,

 

formatting에서 구현했던 user-defined type의 Display trait만 구현하면 충분합니다.

 

[Rust] formatting

std::fmt 모듈 내 매크로 print!() 및 println!() io:stdout, 즉 표준 출력에 입력된 string을 전달하는 매크로입니다. 둘의 차이는 마지막에 개행 문자 없이도 자동으로 개행 문자를 넣어주냐 마냐입니다.

swc0317.tistory.com

 

use std::fmt;

struct Circle {
    radius: i32
}

impl fmt::Display for Circle {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Circle of radius {}", self.radius)
    }
}

fn main() {
    let circle = Circle { radius: 6 };
    println!("{}", circle.to_string());
}

 

Circle이라는 구조체의 Display trait을 구현하면 Circle 타입을 formatting에 전달하면,

 

Display에 구현된 출력에 따라 "Circle of radius ~" 에 해당하는 

 

문자열이 출력됩니다. 이때 to_string 메소드는 구현한적이 없지만,

 

해당 Display를 구현하면 자동으로 to_string 메소드를 사용할 수 있습니다.

 

이때 to_string 메소드의 return 값은, 해당 formatting에 전달되는

 

문자열과 같습니다.

728x90
반응형

'프로그래밍 언어 > [Rust]' 카테고리의 다른 글

[Rust] Rust Functions  (0) 2025.02.09
[Rust] Expression  (0) 2025.01.07
[Rust] Types  (1) 2025.01.03
[Rust] Variable의 특성  (0) 2024.12.30
[Rust] enum  (0) 2024.12.30