728x90
소유권
규칙
- Rust의 각 값에는 소유자가 있다.
- 한 번에 한 명의 소유자만 있을 수 있다.
- 소유자가 범위를 벗어나면 가치가 떨어진다.
- → Rust는 중괄호로 범위가 정해져 있다.
스택 : 후입 선출
스택에 저장된 모든 데이터는 알려진 고정된 크기를 가져야 한다.
크기를 알 수 없는 데이터나 크기가 변경될 수 있는 데이터는 대신 힙에 저장해야한다.
copy 특성 구현 목록
trait ?
힙 :
- 힙에 데이터를 넣을 때 특정 양의 공간을 요청한다.
- 메모리 할당자는 힙에서 충분히 큰 빈 공간을 찾아서 사용중이라고 표시하고, 해당 위치의 주소인 포인터를 반환한다. (힙 할당)
- 힙에 대한 포인터는 고정 크기
힙 vs 스택
- 힙은 할당하는 것이므로, 단순 푸쉬인 스택보다 느리다.
메모리
기존의 GC 언어들은 자동으로 추적 및 정리함, GC가 없는 언어는 명시적으로 직접 호출 및 해제해야함
Rust는 변수가 범위를 벗어나면 자동으로 반환됨
참고) C++에서 항목의 수명이 끝날 때 리소스를 할당 해제하는 패턴 : RAII
let s1 = String::from("hello"); let s2 = s1; println!("{s1}, world!");
Rust는 복사를 진행할때 s1을 범위 밖으로 벗어났다고 간주한다. 즉, 복사의 개념이 아닌 move의 개념이다.
실제로 s1은 사용할 수 없다. (String 기준)
복사를 진행하려면 let s2 = s1.clone(); 으로 진행해야 한다.
문자열
- 리터럴 : 직접 하드 코딩됨
String::from()
구현이 필요한 메모리 요청
참조
소유권을 이전하지 않고 값을 사용하기 위함
변수가 기본적으로 불변인 것처럼 Rust의 참조는 수정할 수 없다.
fn main() { let s = String::from("hello"); change(&s); } fn change(some_string: &String) { some_string.push_str(", world"); }
마지막으로 사용되면 drop
가변 참조
그러나 참조한 값을 수정하기 위해서는 (&mut s)와 같이
&mut
을 이용하면 된다.값에 대한 참조가 있는 경우 해당 값에 대한 다른 참조가 있을 수 없다.
즉 한번에 두개 이상의 가변 참조로 빌려줄 수 없다, But 불변 참조는 가능
let mut s = String::from("hello"); let r0 = &s; //ok let r1 = &s; //ok let r2 = &mut s; //err let r3 = &mut s; //err println!("{}, {}", r1, r2);
Dangling 참조 (매달린 참조)
→ 포인터가 있는 언어에서는 일부 메모리를 해제하면서 해당 메모리에 대한 포인터를 실수로 남겨놓을 수 있다.
- Rust에서는 Dangling 참조가 발생할 수 없음.
슬라이스
→ 슬라이스는 전체 컬렉션이 아닌 컬렉션의 연속된 요소 시퀀스를 참조할 수 잇게 해줌.
- 슬라이스는 참조의 일종이므로, 소유권이 없음.
let a = &s[0..2];
let a = &s[..2];
let len = s.len();
let b = &s[3..len];
let b = &s[3..];
? &String과 &str 의 차이점이 무엇인가.
fn first_word(s: &String) -> &str { fn first_word(s: &str) -> &str {
728x90
'Languages > RUST' 카테고리의 다른 글
[RUST] TRPL : Chapter5 - Method & Implement (0) | 2024.11.27 |
---|---|
[RUST] &String vs &str (0) | 2024.11.27 |
[RUST] TRPL : Chapter3 - Programming (0) | 2024.11.26 |
[RUST] TRPL : Chapter2 - Coding (0) | 2024.11.26 |
[RUST] Rust 명명법 (1) | 2024.11.26 |