Menu
Coddy logo textTech

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가 어떤 타입으로 변환하려는지 알아야 하기 때문에 타입 어노테이션이 필요합니다. 이 패턴은 설정 데이터를 초기화된 객체로 변환하거나, 가공되지 않은 입력을 검증된 구조체로 변환하는 것과 같이 헬퍼 구조체를 메인 타입으로 변환해야 할 때 특히 유용합니다.

challenge icon

챌린지

쉬움

From 트레이트를 사용하여 온도 변환 시스템을 만들어 봅시다! 두 가지 온도 타입인 CelsiusFahrenheit를 생성하고, Rust의 표준 변환 트레이트를 사용하여 이들 사이의 변환을 구현하게 됩니다.

코드는 두 개의 파일로 구성됩니다:

  • temperature.rs: f64를 감싸는 두 개의 공개 뉴타입(newtype) 구조체인 CelsiusFahrenheit를 정의합니다. fahrenheit = celsius × 1.8 + 32.0 공식을 사용하여 CelsiusFahrenheit로 변환하는 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

예를 들어, 입력값이 0100인 경우:

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
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨