ownership

Ownership

소유권: 러스트 프로그램의 메모리 관리법 규칙 (규칙을 통해서 빠르고 편리하게 메모리를 관리한다.)

  • 규칙

    • 각각의 값은 owner가 정해겨있다.
    • 한 값의 owner는 동시에 여럿 존재할 수 없다.
    • owner가 스코프 밖으로 벗어날 때, 값은 버려진다.
  • 소유권은 복잡한 (주로 힙에 저장된) 객체한테만 있다.

  • 소유권 이동

    • =를 통해서 이동
    • 함수 인자등으로 사용할 때
  • 스택에만 저장되는 타입는 Copy 트레이트가 달려있음 (사용되어도 이동하지 않고 자명하게 복사되어짐)

참조, 대여

소유권을 넘기지 않고 변수를 사용하고 싶을 때, 참조를 사용할 수 있다. 참조자는 값을 소유하지 않고 참조할 수 있다.

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()
}
  • 참조자는 기본적으로 불변이다.
  • 아래와 같이 가변 참조자를 사용할 수 있다.
    • &mut s 가변 참조자 생성
    • &mut String 가변 참조자 타입
  • 제약
    • 2개의 가변 참조자는 생성할 수 없다.
    • 불변 참조자가 있을 때도, 가변 참조자는 만들 수 없다.
fn main() {
    let mut s = String::from("hello");

    change(&mut s);
}

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

슬라이스

slice는 컬렉션을 통째로 참조하는 것이 아닌, 연속된 일련의 요소를 참조하게 해준다. (참조자의 일종으로 소유권을 갖지 않는다.)

    let s = String::from("hello world");

    let hello = &s[0..5]; // substring을 참조하는 참조자
    let world = &s[6..11];
  • String 슬라이스의 타입은 &str이다.
  • fun function(s: &str)와 같이 하는 것이 &String, &str 둘 다 인자로 받을 수 있기 때문에 권장된다.