Ownership
소유권: 러스트 프로그램의 메모리 관리법 규칙 (규칙을 통해서 빠르고 편리하게 메모리를 관리한다.)
-
규칙
- 각각의 값은
owner가 정해겨있다. - 한 값의
owner는 동시에 여럿 존재할 수 없다. owner가 스코프 밖으로 벗어날 때, 값은 버려진다.
- 각각의 값은
-
소유권은 복잡한 (주로 힙에 저장된) 객체한테만 있다.
-
소유권 이동
=를 통해서 이동- 함수 인자등으로 사용할 때
-
스택에만 저장되는 타입는
Copy트레이트가 달려있음 (사용되어도 이동하지 않고 자명하게 복사되어짐)
참조, 대여
소유권을 넘기지 않고 변수를 사용하고 싶을 때, 참조를 사용할 수 있다. 참조자는 값을 소유하지 않고 참조할 수 있다.
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
- 참조자는 기본적으로 불변이다.
- 아래와 같이 가변 참조자를 사용할 수 있다.
&mut s가변 참조자 생성&mut String가변 참조자 타입
- 제약
- 2개의 가변 참조자는 생성할 수 없다.
- 불변 참조자가 있을 때도, 가변 참조자는 만들 수 없다.
fn main() {
let mut s = String::from("hello");
change(&mut s);
}
fn change(some_string: &mut String) {
some_string.push_str(", world");
}
슬라이스
slice는 컬렉션을 통째로 참조하는 것이 아닌, 연속된 일련의 요소를 참조하게 해준다. (참조자의 일종으로 소유권을 갖지 않는다.)
let s = String::from("hello world");
let hello = &s[0..5]; // substring을 참조하는 참조자
let world = &s[6..11];
- String 슬라이스의 타입은
&str이다. fun function(s: &str)와 같이 하는 것이 &String, &str 둘 다 인자로 받을 수 있기 때문에 권장된다.