본문 바로가기

휴지통/러스트

러스트 Ownership1

러스트의 가장 중요한 개념인 Ownership에 대해서 알아보자.

 

대부분의 프로그래밍 언어는 스택메모리와 힙메모리에 대해서 생각하지 않아도 된다. 하지만 러스트나 C++등의 시스템프로그래밍 언어는 그렇지 않는다. ( 구글에 "메모리 구조" 검색하면 어떤 변수들이 어디에 저장되는지가 나온다. ) 힙에 할당하는것보다 스택에 push 하는것이 빠르다. pointer를 따라가서 들어가기 때문이다. 

기본지식은 이러하다.

 

Ownership의 3가지

- 모든값은 Owner를 갖는다.

- 하나의 값은 하나의 Owner를 갖는다.

- Owner가 scope 밖으로 나가면 사라진다.

 

String 타입은 Heap영역에 저장된다.

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;
    println!("{}, world!", s1);
}

이는 오류를 뱉는 코드다.

다음과 같은 상황에서 s2 = s1을 하면 

메모리를 해제한다. move라고불린다.

따라서 러스트에서는 깊은복사를 할때는 따로 clone() 을사용하고 이외에는 얕은 복사를 한다.

 

fn main() {
    let s1 = String::from("hello");

    let len = calculate_length(&s1);

    println!("The length of '{}' is {}.", s1, len);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}

다음과 같이 call by reference로 사용할 수 있다.

 

 

fn main() {
    let s = String::from("hello");

    change(&s);
}

fn change(some_string: &String) {
    some_string.push_str(", world");
}

다음과 같은 코드는 오류를 내는데 빌려온 변수를 수정하려고 해서 그렇다.

 

fn main() {
    let mut s = String::from("hello");

    change(&mut s);

    println!("The length of {}.", s);
}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

 

mut 일경우 가능하다 ( let mut s )