자료형의 종류와 사용법 파헤쳐보기 - 문자열
자료형이라 함은 어떤 종류가 있는지 확인해보기
문자열에서 신경써야할 친구 둘이 있다.
1. String
: 힙 영역에 메모리가 할당되는 친구
2. str
: 스택 영역에 만들어 지는 친구
Rust를 공부하면서 예시로 나오는 코드를 보며 느낀점은 자료형과 열거형을 모르면 제대로 이해하는 것은 불가능할 것이다라는 점이고. String과 str의 개념도 마찬가지이다.
5가지 항목의 차이점을 정리
1. 가변성
2. 소유권
3. 생성 방법
4. 라이프타임
5. 기능
많이 나오는 용어
문자열 슬라이스: 문자열의 일부분을 참조하는 방법(참조하므로, 데이터를 복사하지 않는다)
Rust에서 문자열 슬라이스는 '&str' 타입을 사용한다.
차이점이라는 단어를 계속 보고있으니까 뭔가 한국어 같지 않다는 생각이 들정도로 바라보는 중이다.
String
: String은 가변하며, 문자열의 내용을 동적으로 변경할 수 있다.(예를 들어 문자열에 문자를 추가하거나 제거할 수 있다.)str
: str은 불변하며, 한 번 생성되면 내용을 변경할 수 없다.(슬라이스로 원본 문자열의 일부에 접근할 수 있지만 원본 문자열 수정은 불가능하다.)String
: String은 다른 변수에 할당하거나 함수를 전달할 때 소유권을 이전한다.str
: str 자체는 메모리를 소유하지 않으며, 소유권 이전이 없다.(문자열 슬라이스로서, 원본 문자열의 일부를 참조)String
: String은 String::from("...")
과 같이 생성하거나 문자열 연산 등을 통해 생성할 수 있다.str
: str은 문자열 리터럴(큰 따옴표(")로 묶인 문자열 값)이나 &String
또는 다른 &str
을 슬라이스하여 사용 가능하다.-> 여기서 &mut String
혹은 &mut str
은 불가능한데 이유는 다음과 같다.
&mut String
의 경우 String
의 경우 가변이기 때문에 접근할 수 있지만 해당 String
자체가 불변이라면 사용할 수 없다. 아래와 같이 작업 시 가능하긴 하다고 한다!let mut my_string = String::from("Hello");
let reference_to_string: &mut String = &mut my_string; // 이것은 가능
&mut str
이 불가능한 이유는 str 자체가 불변이기 때문이다.라이프타임: 라이프타임은 메모리 안전성과 소유권 시스템의 핵심 부분 중 하나이다.
-> 추후 더 자세한 글로 정리할 필요가 있을 듯 하다.
String
: String은 자체적인 라이프타임을 가지며, 메모리 관리를 위한 라이프타임 특성을 가지고 있다.str
: str은 주로 다른 변수 또는 데이터 구조의 일부로 사용될 때 해당 라이프타임과 연결된다.String
: String은 다양한 문자열 조작 및 변환 메서드를 지원한다.(문자열 붙이기, 잘라내기 등의 작업)str
: str은 문자열 슬라이스로 제공되기 때문에 메서드의 수가 제한적이며, 주로 문자열 검색 또는 처리에 사용된다.str
타입은 문자열 리터럴(큰 따옴표로 묶인)로 불리며, 다음과 같이 선언한다.
주의할 점으로 한 번 만들어지면 값을 변경하거나 길이를 바꿀 수 없다(불변)
fn main() {
let s = "hello";
println!("{}", s);
}
String
타입은 벡터와 마찬가지로 동적으로 값을 바꾸거나 길이를 바꿀 수 있다.
fn main() {
let mut s = String::new();
// str 생성(불변 문자열 슬라이스, &str)
let data = "new contents";
// 방법 1
// String 변환(가변한 문자열, String)
let s = data.to_string();
// 방법 2
let s = "new contents".to_string();
// 방법 3
let s = String::from("new contents");
}
&str
은 문자열의 일부분을 의미하기도 한다. 그렇기 때문에 &str
을 문자열 슬라이스라고도 부른다.
시나리오:
1. String
타입으로 문자열 선언
2. 해당 문자열로부터 문자열 슬라이스 만들기
fn main() {
let greet = String::from("Hi, buzzi!");
// let name = "buzzi!";
let name = &greet[4..];
println!("{}", name);
}
결과: buzzi!
String
str
현재 시리즈는 다음 링크를 공부한 내용을 기록하고 있습니다.
> 파이썬 프로그래머를 위한 러스트 입문 - 6.1 자료형 <