Menu
Coddy logo textTech

함수 매개변수로서의 슬라이스

Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 56번째.

문자열을 다루는 함수를 작성할 때, 매개변수 타입으로 String 대신 &str을 사용하는 것은 함수를 훨씬 더 유연하고 유용하게 만듭니다.

String 매개변수를 받는 함수는 소유권이 있는(owned) 문자열만 받을 수 있으며, 이는 함수를 호출하는 방식을 제한합니다:

fn print_message(text: String) {
    println!("{}", text);
}

// 이 코드는 작동하지만, 소유권을 가져갑니다
let my_string = String::from("Hello");
print_message(my_string); // 이 시점 이후로 my_string은 더 이상 사용할 수 없습니다

하지만 &str을 받는 함수는 String 참조와 문자열 리터럴을 모두 받아들일 수 있어 훨씬 더 다재다능합니다:

fn print_message(text: &str) {
    println!("{}", text);
}

// 이제 두 타입 중 하나로 호출할 수 있습니다
let my_string = String::from("Hello");
print_message(&my_string); // String에 대한 참조를 전달합니다
print_message("World");     // 문자열 리터럴을 직접 전달합니다

이러한 유연성 덕분에 호출자가 데이터를 변환하거나 소유권을 포기할 필요 없이, 함수가 더 다양한 상황에서 작동할 수 있습니다.

challenge icon

챌린지

쉬움

두 개의 입력을 받게 됩니다. 첫 번째 입력은 텍스트 메시지이고, 두 번째 입력은 메시지에 허용되는 최대 길이입니다. 문자열 슬라이스(&str)와 최대 길이(usize)를 매개변수로 받는 truncate_message라는 함수를 만드세요. 메시지 길이가 최대 길이를 초과하면, 함수는 최대 길이까지의 메시지 슬라이스를 반환해야 합니다. 그렇지 않으면 전체 메시지를 반환해야 합니다. 결과를 출력하세요.

요구 사항:

  • 첫 번째 입력(텍스트 메시지)을 읽고 공백을 제거(trim)합니다.
  • 두 번째 입력(최대 길이)을 읽고 공백을 제거(trim)합니다.
  • 최대 길이를 usize 타입으로 파싱합니다.
  • 두 개의 매개변수를 받는 truncate_message 함수를 정의합니다:
    • 메시지를 위한 문자열 슬라이스 &str
    • 최대 길이를 위한 usize
  • 함수 내부에서 메시지 길이가 최대 길이보다 큰지 확인합니다.
  • 만약 그렇다면, &message[0..max_len]을 사용하여 인덱스 0부터 최대 길이까지의 메시지 슬라이스를 반환합니다.
  • 그렇지 않으면, 전체 메시지를 반환합니다.
  • 입력받은 메시지와 최대 길이로 함수를 호출합니다.
  • 반환된 결과를 출력합니다.

입력:

  • 첫 번째 줄: 텍스트 메시지 (예: Hello World from Rust)
  • 두 번째 줄: 숫자로 된 최대 길이 (예: 11)

출력:

  • 최대 길이를 초과하는 경우 잘린 메시지, 그렇지 않은 경우 전체 메시지

치트 시트

&str을 매개변수 타입으로 사용하면 String을 사용하는 것보다 함수가 더 유연해집니다. 문자열 참조와 문자열 리터럴을 모두 받아들일 수 있기 때문입니다:

fn print_message(text: &str) {
    println!("{}", text);
}

let my_string = String::from("Hello");
print_message(&my_string); // String에 대한 참조를 전달합니다
print_message("World");     // 문자열 리터럴을 직접 전달합니다

특정 길이까지의 문자열 슬라이스를 반환하려면 슬라이스 구문을 사용하세요:

&message[0..max_len]

직접 해보기

use std::io;

// TODO: 여기에 truncate_message 함수를 정의하세요


fn main() {
    // 텍스트 메시지 읽기
    let mut message = String::new();
    io::stdin().read_line(&mut message).expect("Failed to read line");
    let message = message.trim();
    
    // 최대 길이 읽기
    let mut max_length_input = String::new();
    io::stdin().read_line(&mut max_length_input).expect("Failed to read line");
    let max_len: usize = max_length_input.trim().parse().expect("Invalid number");
    
    // TODO: truncate_message 함수를 호출하고 결과를 저장하세요
    
    // TODO: 결과를 출력하세요
}
quiz icon실력 점검

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

Logic & Flow의 모든 레슨