본문 바로가기
Languages/RUST

[RUST] &String vs &str

by odaebum 2024. 11. 27.
728x90

String과 str의 차이

  • String:
    • 힙(Heap)에 저장되는 가변적인 문자열 타입입니다.
    • 문자열 데이터를 동적으로 추가, 수정, 삭제할 수 있습니다.
    • 예: let s = String::from("hello");
  • str:
    • 불변적인 문자열 슬라이스입니다.
    • 데이터는 보통 스택(Stack) 또는 힙에 저장되지만, 해당 데이터의 참조만 가지는 슬라이스 타입입니다.
    • 예: 문자열 리터럴("hello")은 &str 타입입니다.
      rust
      코드 복사
      let s: &str = "hello";

2. &String vs &str

  • &String:
    • String 타입에 대한 불변 참조입니다.
    • 힙에 저장된 가변적인 문자열 데이터를 가리키며, 이 데이터를 수정할 수는 없습니다.
    • 예:
      rust
      코드 복사
      let s = String::from("hello"); let s_ref: &String = &s; // String에 대한 불변 참조
  • &str:
    • 문자열 슬라이스에 대한 불변 참조입니다.
    • String의 일부나 전체를 가리키거나, 리터럴 문자열("hello")을 가리킬 수 있습니다.
    • 예:
      rust
      코드 복사
      let s = String::from("hello"); let s_slice: &str = &s; // String의 &str 슬라이스

3. 주요 차이점

     
  &String &str
데이터 유형 String 타입의 불변 참조 문자열 슬라이스 (str)의 불변 참조
유연성 오직 String 타입만 참조 가능 String, 리터럴, 또는 다른 슬라이스 참조 가능
메모리 저장 위치 힙에 저장된 String 참조 스택 또는 힙의 문자열 데이터 참조
사용 사례 String 자체의 불변 참조가 필요한 경우 문자열 슬라이스로 더 일반적인 작업 수행

4. 변환

Rust에서는 &String을 쉽게 &str로 변환할 수 있습니다. 이는 String의 문자열 데이터를 참조하는 슬라이스를 제공하는 방식으로 이루어집니다.

예:

fn takes_str(s: &str) {
    println!("{}", s);
}

fn main() {
    let s = String::from("hello");
    takes_str(&s); // &String은 자동으로 &str로 변환됩니다.
}

중요한 점:

&String은 &str로 자동 변환되지만, 그 반대는 자동 변환되지 않습니다.


5. 사용 사례

  • &String을 사용하는 경우:
    • String 타입을 소유하고 있는 컨텍스트에서, 소유권을 넘기지 않고 데이터를 읽기만 할 때 사용합니다.
  • &str을 사용하는 경우:
    • 문자열 리터럴, 슬라이스 등에서 데이터를 처리하거나 더 범용적인 문자열 참조가 필요할 때 사용합니다.
    • 예를 들어, 함수 매개변수로 문자열을 받을 때 &str를 사용하면 더 유연합니다.
 

6. 성능 차이

  • &String과 &str은 참조로 사용되기 때문에, 성능 차이는 거의 없습니다.
  • 다만, 메모리 소비 및 가비지 컬렉션과 관련하여, String은 동적 할당 및 소유권을 관리하므로 더 무거울 수 있습니다.

결론

  • **&str**은 더 일반적이고 유연하며, 문자열 데이터를 처리하는 함수의 매개변수로 사용하는 것이 일반적입니다.
  • **&String**은 String 타입의 소유권을 넘기지 않고 참조를 사용할 때 유용합니다.
728x90