From and Into Conversion

이정후·2023년 8월 23일
0

Rust

목록 보기
11/13
post-thumbnail

Intro

std::convert::Fromstd::convert::Into 트레이트는 한 타입의 값을 소비하고 다른 타입의 값을 반환하는 변환이다.
FromInto는 인자의 소유권을 가져와 변환한 다음 그 결과의 소유권을 다시 호출부에 반환한다.

FromInto는 서로 연결되어 있으며 대칭을 이룬다.
역수의 관계라고 생각하면 수월하다.

trait Into<T>: Sized {
	fn into(self) -> T;
}
triat From<T>: Sized {
	fn from(other: T) -> Self;
}

Into

Into는 다른 타입으로 변환할 때 사용한다. 예를 들어 &strVec으로 바꾸려면

...
let s = "hello".to_string();
let bytes: Vec<u8> = s.into();

println!("{:?}", bytes); // [104, 101, 108, 108, 111]

이렇게 작성할 수 있는데 hello는 원래 &str이다. 이를 to_string() 메소드로 String타입으로 바꿔준 뒤 Vec으로 into한 것이다.

사람으로 따지면 마치 "문자열을 바이트 배열 벡터로 만들어줘~"라고 말하는 것이다.

사실 위 코드에서 더욱 좋은 점은 "String" 그러니까 Heap할당된 상태에서 그 내용은 가만히 둔 채 용도만 바꾸어 벡터의 요소로 사용한다. 즉 텍스트를 다시 재할당 하거나 메모리의 복사 또는 이동이 이루어지지 않는 것이다.

단 into를 수행할 때에는 타입을 명시해야 하는데, Rust 컴파일러는 우리가 타입을 명시하기 전까지는 어떤 타입으로 바꿀지 모르기 때문이다.

use std::convert::Into;


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

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

fn main() {
    let int = 5;
    let num: Number = int.into(); // 타입 명시!!

    println!("My number is {:?}", num);
}

From

반면에 From은 다른 타입으로 된 값을 가지고 인스턴스를 만들어 내기 위한 제네릭 생성자의 역할을 수행한다.

let s = String::from("hello"); //Type annotated "String"
let str_ref = s.as_str(); // Type is &str
profile
꾸준하게

0개의 댓글