Menu
CoddyTech

제네릭 메서드

Coddy Rust 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 25번째.

제네릭 구조체는 어떤 타입이든 담을 수 있지만, 데이터와 상호작용할 메서드가 없으면 그다지 유용하지 않습니다. 제네릭 구조체의 메서드를 정의하려면 impl 블록에서 특별한 구문을 사용해야 합니다.

핵심은 impl 자체에 제네릭 매개변수를 선언하는 것입니다.

struct Wrapper<T> {
    value: T,
}

impl<T> Wrapper<T> {
    fn get(&self) -> &T {
        &self.value
    }
}

Wrapper<T> 앞에 있는 impl<T>에 주목하세요. 이는 T가 전체 구현 블록의 제네릭 타입 매개변수임을 Rust에 알려줍니다. 이 선언이 없으면 Rust는 T라는 구체적인 타입을 찾으려다가 찾지 못합니다.

get 메서드는 &T를 반환합니다. 이는 래퍼가 보유한 타입에 대한 참조입니다. T가 정수, 문자열 또는 다른 어떤 타입이든 동일하게 작동합니다.

let num_wrapper = Wrapper { value: 100 };
let text_wrapper = Wrapper { value: "Rust" };

println!("{}", num_wrapper.get());  // 100
println!("{}", text_wrapper.get()); // Rust

제네릭 T가 컴파일 시점에 각 구체적인 타입에 맞게 조정되므로 두 경우 모두 같은 메서드 정의가 작동합니다.

challenge icon

챌린지

쉬움

제네릭 컨테이너에 메서드를 추가해 봅시다! 어떤 타입이든 담을 수 있고 내용과 상호작용하는 메서드를 제공하는 Box 구조체(Rust의 표준 Box와 혼동하지 마세요)를 만들 것입니다.

코드를 두 파일에 나누어 작성합니다.

  • mybox.rs: T 타입의 비공개 필드 contents를 가진 MyBox<T>라는 공개 제네릭 구조체를 정의합니다. 이 구조체에 다음 메서드를 구현하세요.
    • 주어진 값으로 새 MyBox를 만드는 연관 함수 new
    • 내용에 대한 참조를 반환하는 메서드 peek (&self 사용)
    • 새 값을 받아 현재 내용을 교체하는 메서드 replace (&mut self 사용)
  • main.rs: 모듈을 가져오고 서로 다른 타입으로 제네릭 메서드가 동작하는 모습을 보여 줍니다. 박스를 만들고, 내용을 확인하고, 값을 교체하여 메서드가 작동하는 모습을 보여 주세요.

제네릭 구조체에 메서드를 구현할 때 필요한 핵심 문법을 기억하세요. MyBox<T> 앞에 impl<T>를 써서 T가 전체 구현 블록의 제네릭 매개변수임을 Rust에 알려야 합니다.

메인 파일에서 다음과 같이 MyBox를 보여 주세요.

  1. 정수로 박스 만들기 (첫 번째 입력을 i32로 파싱)
  2. 내용을 확인하고 값 출력하기
  3. 새 정수로 내용 교체하기 (두 번째 입력을 i32로 파싱)
  4. 다시 확인하여 업데이트된 값 보여 주기
  5. 문자열로 두 번째 박스 만들기 (세 번째 입력)
  6. 문자열 박스의 내용 확인하기

출력은 다음 형식을 따라야 합니다.

Integer box contains: {value}
After replace: {value}
String box contains: {value}

예를 들어 입력이 10, 25, Rust인 경우:

Integer box contains: 10
After replace: 25
String box contains: Rust

초기 정수, 교체할 정수, 문자열 값의 세 가지 입력을 받습니다.

직접 해보기

mod mybox;

use mybox::MyBox;

fn main() {
    // 입력값 읽기
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let initial_int: i32 = input1.trim().parse().expect("Invalid integer");

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let replacement_int: i32 = input2.trim().parse().expect("Invalid integer");

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let string_value = input3.trim().to_string();

    // TODO: 초기 정수로 MyBox 만들기
    
    // TODO: 내용을 확인하고 "Integer box contains: {value}" 출력하기
    
    // TODO: 내용을 대체할 정수로 바꾸기
    
    // TODO: 다시 내용을 확인하고 "After replace: {value}" 출력하기
    
    // TODO: 문자열 값으로 두 번째 MyBox 만들기
    
    // TODO: 문자열 상자의 내용을 확인하고 "String box contains: {value}" 출력하기
}
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Rust 컴파일러