Rust의 핵심기능이라고 할 수 있는 소유권(Ownership)에 대해 알아보겠습니다.
모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더 이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 컬렉션을 갖고 있습니다. 또 다른 언어들에서는 프로그래머가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 하지만 러스트는 제3의 접근법을 이용합니다. 소유권이라는 시스템을 통해 더 효율적인 코드를 작성할 수 있게 합니다.
소유권 규칙
소유권에는 다음과 같은 규칙이 존재합니다.
- 러스트의 각각의 값은 해당 값의 오너(owner)라고 불리는 변수를 갖고 있다.
- 한 번에 딱 하나의 오너만 존재할 수 있다.
- 오너가 스코프 밖으로 벗어나는 때, 값은 버려진다(dropped).
예시
fn main() {
println!("Ownership 예시");
let a = String::from("Hello");
let b = a;
println!("a is {}", a);
}
소유권 규칙에 따르면 a는 "Hello" 스트링 객체의 오너입니다. 라인 3에서 b에 a를 대입하면서 소유권은 b로 이전되었기 때문에 a를 출력했을 때 컴파일 에러를 발생시키게 됩니다.
위 예시처럼 단순 대입을 했을 때 소유권이 이전되는 경우는 객체에 해당합니다. (벡터, 문자열, 구조체 등..)
u32, i32 같은 데이터 타입 같은 경우 값을 복제해 대입하기 때문에 a와 b 둘 다 정상적으로 출력됩니다.
fn main() {
println!("Ownership 예시");
let a : i32 = 10;
let b = a;
println!("a is {}", a);
println!("b is {}", b);
}
만약 함수 내에서 {}로 범위를 제한해서 그 안에서 생성된 변수는 범위 안에 코드 실행이 끝난 경우 그 변수에 메모리는 해제됩니다.
위의 코드에서 마지막 줄의 주석을 제거해보겠습니다.
위의 에러처럼 범위가 넘어가면서 변수 a의 메모리가 해제되어 더 이상 존재하지 않아 출력할 수 없게 되는 것을 볼 수 있습니다.
'Rust' 카테고리의 다른 글
[Rust] 구조체의 메소드 (0) | 2022.04.22 |
---|---|
[Rust] 참조자(References) 와 빌림(Borrowing) (0) | 2022.04.21 |
[Rust] 구조체 (0) | 2022.04.18 |
[Rust] 데이터 타입 (0) | 2022.04.16 |
[Rust] 제어문(조건문, 반복문) (0) | 2022.04.12 |