[RUST] Owner 소유권에 관하여
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);
}
결과는 예상대로 잘 출력되었다.
간단히 생각해서 런타임에 생성되는 힙 공간에 저장되는 변수들을 러스트는 절대 자동으로 깊은 복사를 하지 않기 때문에 대입 할 경우, 둘이 같은 공간을 보기 때문에 소유권 규칙 위반이 발생하여 러스트는 피대입된 변수를 삭제한다.
끝
반응형
'프로그래밍' 카테고리의 다른 글
[SCIKIT LEARN] CSV 파일을 데이터 배열로 나만의 데이터 만들기 (0) | 2019.11.03 |
---|---|
쉽게 시작하는 [SCIKIT LEARN] / 붓꽃 품종 분류하기 (0) | 2019.11.02 |
C++ 레이싱 GUI 게임 만들기 (0) | 2019.10.06 |
C++ GUI SFML 설치 (0) | 2019.10.06 |
C++ Visual Studio OpenGL GLFW 설치하고 실행하기 (0) | 2019.10.05 |