본문 바로가기

Rust

러스트 프로그래밍 - 소유권과 이동

이동을 설명하기전에 먼저 소유권을 알아야한다. 하나의 변수의 값에는 하나의 소유권이 있다. 파이썬과 C++ 코드 비교를 통해 소유권을 알아보자
 
먼저 파이썬 코드를 보면 

s = ['피자', '치킨', '콜라']
t = s 
u = s

 
리스트 s 가 t,u 에 할당 되면서 래퍼런스 카운터가 증가되어 3을 갱신한다. 값을 해체할때는 시점을 알기위해서는 반드시 래퍼런스 카운트를 유지시켜야 한다. 
 
 
 
C++ 코드를 보면

using namespace std;
vector<string> s = { "피자", "치킨", "콜라"};
vector<string> t = s;
vector<string> u = s;

 
std::vector는 백터의 복사본이 만들어지고 std::string도 비슷하게 작동한다. 벡터3개와 문자열 총 9를 할당하게 된다.
 
 
https://www.yes24.com/Product/Goods/116789691

 

프로그래밍 러스트 - 예스24

『러스트 프로그래밍 공식 가이드』보다 더 친절하게, 한층 더 고급 기능까지 다룬다!이 책은 메모리 안전성과 신뢰할 만한 동시성에 예측 가능한 성능을 더한 러스트의 기능이 어떤 식으로 메

www.yes24.com

프로그래밍 러스트 99쪽  = C++와 파이썬은 상반된 장단점을 택했다고 할 수 있다. 파이썬은 배정할 때 비용이 거의 들지 않지만, 래퍼런스 카운팅이 필요하다. C++는 모든 메모리의 소유권을 명확하게 유지하지만(앞에선 본 백터의 복사본과 문자열), 배정할 때 객체에 대해서 깊은 복사를 수행해야 한다. 
 
 
 
러스트 코드를  보면

let s = vec!["피자".to_string(), "치킨".to_string(), "콜라".to_string()];
let t = s;
let u = s;

 
변수 s에 3개의 벡터가 s에서 t로 옮겨서 이제 t가 벡터의 소유권을 가지게 된다 그러므로 u는 소유권을 가질 수 없게 된다.
파이썬처럼 비용이 들지 않고 C++처럼 소유권이 항상 명확하다 그리고 C++과 러스트에 차이점에 있어서 C++는 배정,매개변수 전달, 함수의 값 반환,깊은복사와 같은 기본 연산의 비용을 예측하기 힘들다 하지만 러스트는 타입이 명확하고 비용을 명확히 알 수 있어서 좋다
 
 
Copy타입 : 이동의 예외
러스트 얕은 복사를 구현한 예  여기서 정수, 부동 소수점등의 숫자타입,Boolean타입 등은 소유권 시스템이 동작하지 않는다. 그래서 이동되지 않고 복사가 가능하다
 

#[derive(Copy, Clone)] // 타입을 카피로 만든다
struct Label {
    number: u32, //타입 명시 , name:string으로 하면 컴파일 오류가 뜬다
}

fn main() {
    let l = Label { number: 3 };
    print(l);
    println!("My label number is: {}", l.number)
}

fn print(l: Label) {
    println!("STAMP: {}", l.number)
}