본문 바로가기

Rust

[Rust] 소유권(Ownership)

Rust의 핵심기능이라고 할 수 있는 소유권(Ownership)에 대해 알아보겠습니다.

모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더 이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 컬렉션을 갖고 있습니다. 또 다른 언어들에서는 프로그래머가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 하지만 러스트는 제3의 접근법을 이용합니다. 소유권이라는 시스템을 통해 더 효율적인 코드를 작성할 수 있게 합니다.

 

소유권 규칙

소유권에는 다음과 같은 규칙이 존재합니다.

  1. 러스트의 각각의 값은 해당 값의 오너(owner)라고 불리는 변수를 갖고 있다.
  2. 한 번에 딱 하나의 오너만 존재할 수 있다.
  3. 오너가 스코프 밖으로 벗어나는 때, 값은 버려진다(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