From과 Into
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 57번째.
타입 간의 변환은 Rust에서 흔한 작업입니다. From 트레이트는 한 타입이 다른 타입으로부터 어떻게 생성될 수 있는지 정의하는 표준화된 방법을 제공합니다. From을 구현하면, Into 트레이트를 자동으로 무료로 얻게 됩니다.
From을 구현하려면, 다른 타입으로부터 자신의 타입을 생성하는 방법을 정의합니다:
struct Meters(f64);
struct Kilometers(f64);
impl From<Kilometers> for Meters {
fn from(km: Kilometers) -> Self {
Meters(km.0 * 1000.0)
}
}
이제 from 함수 또는 into 메서드를 사용하여 변환할 수 있습니다:
let distance = Kilometers(5.0);
// From을 명시적으로 사용
let m1 = Meters::from(distance);
// Into 사용 (From이 구현되어 있으므로 작동함)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();
into() 메서드는 Rust가 어떤 타입으로 변환하려는지 알아야 하기 때문에 타입 어노테이션이 필요합니다. 이 패턴은 설정 데이터를 초기화된 객체로 변환하거나, 가공되지 않은 입력을 검증된 구조체로 변환하는 것과 같이 헬퍼 구조체를 메인 타입으로 변환해야 할 때 특히 유용합니다.
챌린지
쉬움From 트레이트를 사용하여 온도 변환 시스템을 만들어 봅시다! 두 가지 온도 타입인 Celsius와 Fahrenheit를 생성하고, Rust의 표준 변환 트레이트를 사용하여 이들 사이의 변환을 구현하게 됩니다.
코드는 두 개의 파일로 구성됩니다:
temperature.rs:f64를 감싸는 두 개의 공개 뉴타입(newtype) 구조체인Celsius와Fahrenheit를 정의합니다.fahrenheit = celsius × 1.8 + 32.0공식을 사용하여Celsius를Fahrenheit로 변환하는From트레이트를 구현하세요. 또한 각 구조체에 내부f64값을 반환하는value메서드를 추가하세요.main.rs: 온도 모듈을 가져와서 두 가지 변환 방식을 모두 보여줍니다. 제공된 입력으로Celsius값을 생성한 다음,Fahrenheit::from()을 사용하여Fahrenheit로 변환합니다. 또 다른Celsius값을 생성하고.into()메서드를 사용하여 변환합니다. 두 결과 모두 출력하세요.
섭씨(Celsius)에서 화씨(Fahrenheit)로의 변환 공식은 1.8을 곱하고 32를 더하는 것입니다. From<Celsius> for Fahrenheit를 구현하면 Celsius에 대해 Into<Fahrenheit> 트레이트가 자동으로 제공된다는 점을 기억하세요!
출력은 다음 형식으로 두 변환 결과를 모두 표시해야 합니다:
From: {celsius1}C = {fahrenheit1}F
Into: {celsius2}C = {fahrenheit2}F예를 들어, 입력값이 0과 100인 경우:
From: 0C = 32F
Into: 100C = 212F그리고 입력값이 25와 -40인 경우:
From: 25C = 77F
Into: -40C = -40F두 개의 입력을 받게 됩니다: 첫 번째 섭씨 값(f64로 파싱)과 두 번째 섭씨 값(f64로 파싱)입니다.
치트 시트
From 트레이트는 타입 간의 변환을 위한 표준화된 방법을 제공합니다. From을 구현하면, Into 트레이트도 자동으로 함께 제공됩니다.
From을 구현하려면, 다른 타입으로부터 자신의 타입을 생성하는 방법을 정의하세요:
struct Meters(f64);
struct Kilometers(f64);
impl From<Kilometers> for Meters {
fn from(km: Kilometers) -> Self {
Meters(km.0 * 1000.0)
}
}
from 함수나 into 메서드 중 하나를 사용하여 변환할 수 있습니다:
let distance = Kilometers(5.0);
// From을 명시적으로 사용
let m1 = Meters::from(distance);
// Into 사용 (타입 어노테이션이 필요함)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();
into() 메서드는 Rust가 어떤 타입으로 변환하려는지 알 수 있도록 타입 어노테이션이 필요합니다.
직접 해보기
mod temperature;
use temperature::{Celsius, Fahrenheit};
fn main() {
// 입력 읽기
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let celsius1: f64 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let celsius2: f64 = input2.trim().parse().expect("Invalid number");
// TODO: celsius1으로부터 Celsius 값을 생성하세요
// TODO: Fahrenheit::from()을 사용하여 이를 Fahrenheit로 변환하세요
// TODO: celsius2로부터 또 다른 Celsius 값을 생성하세요
// TODO: .into()를 사용하여 이를 Fahrenheit로 변환하세요
// TODO: 다음 형식으로 결과를 출력하세요:
// From: {celsius1}C = {fahrenheit1}F
// Into: {celsius2}C = {fahrenheit2}F
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.