상세 컨텐츠

본문 제목

[RUST] Owner 소유권에 관하여

프로그래밍

by 경밤 2019. 10. 27. 19:28

본문

반응형

소유권에 관하여 글을 써본다.

 

아래와 같은 코드에서 소유권을 볼 수 있다.

String변수는 힙공간에 할당된다. 그러므로 x는 힙공간에있다. 이 코드는 얼핏 보면 x에 X라는 값을 주고, y에 x의 사본을 생성해서 값을 주는 것으로 보인다. 하지만 아래 코드는 panic한다.

fn main() {
    let x = String::from("X");
    let y = x;

    println!("{}", x);
}

예상으론 출력은 "X"가 나올 것 같지만, 에러가 난다. 무슨 에러인지 봐보자.

러스트는 자동적으로 절대 '깊은'복사를 하지않는다. 그리고 y = x라는 것은 y와 x가 같은 '공간'을 가지게 한다는 의미가 됨으로 한번에 한개의 오너만 존재 할 수 있다는 소유권 규칙에 위반이된다. 그래서 러스트는 x를 없애야한 한다. 왜 그러냐면 이대로 둘 경우, 스코프가 끝났을때 한 공간에 대해 2번 할당 해제를 하기 때문이다.

이제 코드를 조금 고쳐서 값을 복사하고 난 후에도 복사된 변수를 사용할수 있도록 하자.

fn main() {
    let x = String::from("X");
    let y = x.clone();

    println!("x : {}, y : {}", x,y);
}

결과는 예상대로 잘 출력되었다.

 

간단히 생각해서 런타임에 생성되는 힙 공간에 저장되는 변수들을 러스트는 절대 자동으로 깊은 복사를 하지 않기 때문에 대입 할 경우, 둘이 같은 공간을 보기 때문에 소유권 규칙 위반이 발생하여 러스트는 피대입된 변수를 삭제한다.

 

반응형

관련글 더보기