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
'Languages > RUST' 카테고리의 다른 글
[RUST] TRPL : Chapter6 - Enum & Match (0) | 2024.11.28 |
---|---|
[RUST] TRPL : Chapter5 - Method & Implement (0) | 2024.11.27 |
[RUST] TRPL : Chapter 4 - Ownership (0) | 2024.11.27 |
[RUST] TRPL : Chapter3 - Programming (0) | 2024.11.26 |
[RUST] TRPL : Chapter2 - Coding (0) | 2024.11.26 |