rs-6. 소유권

김주윤·2023년 3월 13일
0

rs-study

목록 보기
7/8

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 는 아래 규칙을 가진다.

  1. rust 의 각 value 는 소유자가 있다.
  2. 한 번에 한 명의 소유자만 있다.
  3. 소유자가 범위를 벗어나면 값이 삭제된다.

따라서

{
	let s = "hello"; // s 는 소유권을 가진다.
}
// 여기서 위 스코프의 s 값은 삭제되어있다.(deleted)

위처럼 변수 s 는 보이지 않지만 소유권을 가지고 있다.

{
	let A = 10; // A 는 소유권을 가진다.
    let B = A; // A의 소유권을 B가 가지며, A는 참조할 수 없게된다.
}
// 여기서 위 스코프의 A, B 값은 삭제되어있다.(deleted)

이동(move)

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

참조(references)

기존 변수의 소유권을 주지 않고 값 만 '참조'하는 방법이다.

&를 사용해보자.

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 를 공부하자.

profile
rust 블로거입니다.

0개의 댓글