정리/Rust

Rust 함수에서 문자열 참조를 파라미터로 받을 때의 형식

워로디스 2026. 2. 27. 22:37

1. 가장 일반적인 형태 — &str

fn print_name(name: &str) {
    println!("name = {}", name);
}

 

이것이 표준적인 방식입니다.

  • &String
  • &str
  • 문자열 리터럴 "abc"

모두 받을 수 있습니다.

 

사용 예

let s = String::from("Yongtae");

print_name(&s);       // &String → &str 자동 변환
print_name("hello");  // 리터럴

 

실무에서는 대부분 &str를 사용합니다.

 

2. 명시적 라이프타임 포함

fn print_name<'a>(name: &'a str) {
    println!("{}", name);
}

 

이 경우 'a는 명시했을 뿐, 실제로는 필요 없습니다.
Rust의 lifetime elision 규칙에 의해 자동으로 처리됩니다.

 

3. &String으로 받는 경우 (권장되지 않음)

fn print_name(name: &String) {
    println!("{}", name);
}

 

이 방식은 권장되지 않습니다.

  • "literal"을 받을 수 없음
  • &str을 받을 수 없음
  • 불필요하게 타입이 구체적임

가능하면 &str로 받는 것이 올바른 방식입니다.

 

4. 소유권을 가져오고 싶을 때 — String

fn consume_name(name: String) {
    println!("{}", name);
}

 

이 경우 호출 이후 원래 변수는 사용할 수 없습니다.
문자열의 소유권이 함수로 이동합니다.

 

5. 더 유연한 형태 — impl AsRef<str>

라이브러리 설계 시 사용하는 패턴입니다.

fn print_name<S: AsRef<str>>(name: S) {
    println!("{}", name.as_ref());
}
  • String
  • &String
  • &str

모두 받을 수 있습니다.

단순한 내부 함수라면 과도한 설계일 수 있습니다.

 

정리

목적 권장 타입
읽기 전용 문자열 받기 &str
소유권 가져오기 String
범용 라이브러리 설계 impl AsRef<str>
피해야 할 것 &String

 

문자열 참조를 파라미터로 받는 가장 일반적이고 권장되는 형태는 다음입니다:

fn foo(s: &str)