https://doc.rust-lang.org/beta/book/ch04-00-understanding-ownership.html
rust 핵심 소유권을 간단하게 알아보자.
fn main() {
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
}
이 코드를 실행하면 에러가 발생한다.
3번째 라인, let s2 = s1; 에서 발생한 오류인데,
value 가 이미 이동(move) 했다는 메시지다.
s1 는 소유권이 이동되었고, 사용할 수 없다는 뜻이다.
Rust 는 아래 규칙을 가진다.
따라서
{
let s = "hello"; // s 는 소유권을 가진다.
}
// 여기서 위 스코프의 s 값은 삭제되어있다.(deleted)
위처럼 변수 s 는 보이지 않지만 소유권을 가지고 있다.
{
let A = 10; // A 는 소유권을 가진다.
let B = A; // A의 소유권을 B가 가지며, A는 참조할 수 없게된다.
}
// 여기서 위 스코프의 A, B 값은 삭제되어있다.(deleted)
rust 에서 소유권을 주는 행위를 'move'라고 표현한다.
let A = 10;
let B = A; // A의 소유권 이동
위의 표현을 아래처럼 해석한다.
A 에 10 리터럴을 할당하고 소유권을 부여한다.
B 에 A를 할당하며, A의 소유권을 이동시킨다.
이동된(moved) 변수는 더 이상 사용할 수 없다.
변수 A를 다시 사용할때, Rust 가 참조를 사용하지 못하게 한다.
소유권 규칙 2번이 적용된다. (한 번에 한 명의 소유자만 있다.)
A는 소유권을 잃게되며 동시에 B가 소유권을 가진다.
위 개념은 간단한 설명이며 오해할 수 있다.
rust 로 무언가를 하려면 깊게 알고 있어야 좋다.
이를 이해하기 위해서 문서를 직접 읽어보고 직접 타이핑해보자.
https://doc.rust-lang.org/beta/book/ch04-01-what-is-ownership.html#what-is-ownership
기존 변수의 소유권을 주지 않고 값 만 '참조'하는 방법이다.
&를 사용해보자.
fn main() {
let s1 = String::from("hello");
let s2 = &s1;
println!("{}, world!", s1);
}
위 코드는 실행해도 에러없이 결과가 나온다.
s1 변수의 '값'을 '참조'만 시켜서 '소유권'을 이동시키지 않는다.
참조 또한 규칙이 있으며,
let mut s = String::from("hello");
let r = &mut s;
...
위처럼 mut 변수로써 참조 할 수 있다.
https://doc.rust-lang.org/beta/book/ch04-02-references-and-borrowing.html#mutable-references
소유권,참조 규칙과 에 의하여 댕글링 포인터 문제를 예방한다.
https://doc.rust-lang.org/beta/book/ch04-03-slices.html
위 문서를 통해 참조로 구성된 collection 인 slice 를 공부하자.