Rust에서 소유권과 차용

8649 단어 rust

소개



이 글에서는 소유권과 차용이 어떻게 작동하는지, 그리고 Rust에서는 무엇인지 배우게 될 것입니다. 소유권과 차용은 가비지 수집기가 없는 Rust의 유형 안전성에서 중요한 역할을 합니다.

전제 조건



이 기사를 따라하려면 최소한 Rust에 대한 기본 지식이 있어야 하며 시스템에 Rust 프로그래밍 언어가 설치되어 있어야 합니다.

소유권



소유권은 Rust 프로그램에서 메모리 사용을 규제하는 일련의 규칙입니다. 이러한 규칙은 가비지 컬렉터가 없음에도 불구하고 Rust의 메모리 안전에 핵심입니다. 소유권은 Rust 컴파일러가 컴파일 시간에 할당된 모든 메모리를 추적하는 방법을 제공합니다.

다음은 소유권을 관리하는 규칙입니다.
  • Rust에서 각 값에는 소유자인 변수가 있습니다.
  • 주어진 시간에 한 명의 소유자만 있을 수 있습니다.
  • 소유자가 범위를 벗어나면 해당 값이 손실됩니다.

  • 소유권은 어떻게 작동합니까?



    Rust에서는 다음 속성이 모든 소유자에게 적용됩니다.
  • 한 번에 하나의 함수 범위에만 있을 수 있습니다.
  • 한 기능 범위에서 다른 기능 범위로 이동할 수 있습니다.
  • 함수 범위 외부가 아닌 내부에만 존재할 수 있습니다.

  • 소유자가 범위를 벗어나면 Rust 프로그램은 그 가치를 떨어뜨립니다. 범위 간에 변수를 공유하는 유일한 방법은 변수를 필요로 하는 함수에 해당 변수를 전달하는 것입니다.

    아래 예는 실제 소유권을 보여줍니다.

    fn main() {
        let name = "John".to_string();
        greet(name); // "name" can no longer be used in this scope after this expression
    }
    
    fn greet(name: String) {
        println!("Hello, {}", name);
    }
    


    이 프로그램은 다음을 수행합니다.
  • 이름 문자열 변수를 만듭니다.
  • 인사 함수를 호출합니다.

  • welcome 함수를 호출하는 동안 name 변수에 다음과 같은 일이 발생합니다.
  • Rust는 name 변수를 greet 함수 범위로 이동합니다.
  • Rust는 함수 실행이 완료되면 값을 삭제합니다.

  • 3행의 welcome 함수 뒤에 다른 곳에서 이름을 사용하면 프로그램이 컴파일되지 않습니다. 예를 들어 다음 코드는 컴파일되지 않습니다.

    fn main() {
        let name = "John".to_string();
        greet(name);
        println!("Name: {}", name);     // <- throws an error because it is out of scope
    }
    
    fn greet(name: String) {
        println!("Hello, {}", name);
    }
    


    함수에 변수를 전달하고 여전히 해당 범위에 유지하려면 값을 빌려야 합니다. 다음 섹션에서는 차용 및 작동 방식에 대해 설명합니다.

    차용 및 참조



    차용을 통해 함수는 다른 범위로 이동하지 않고도 변수를 참조할 수 있습니다. 차용을 사용하면 이전 함수의 범위 밖으로 이동하지 않고 함수에서 변수를 사용할 수 있습니다. 변수에 대한 참조를 얻으려면 & 단항 연산자를 사용하십시오.

    fn main() {
        let name = "John".to_string();
        greet(&name);
        println!("Name: {}", name);
    }
    
    fn greet(name: &String) {
        println!("Hello, {}", name);
    }
    


    위의 Rust 프로그램은 다음을 수행합니다.
  • 이름이라는 변수에 "John"을 할당합니다.
  • 인사 함수에 대한 참조를 전달합니다.
  • "이름: John"을 표준 출력으로 인쇄합니다.

  • 위의 welcome 함수에서 함수 범위의 일부인 것처럼 name 변수의 값에 액세스할 수 있습니다. Rust의 & 연산자를 사용하면 다른 함수 범위에서 변수를 참조할 수 있습니다.

    함수 인수에서 데이터 유형 지정 앞에 &(앰퍼랜드) 기호를 추가하여 인수가 참조임을 지정합니다.

    fn greet(name: &String) {
    


    변경 가능한 참조



    함수에 대한 참조를 전달하면 해당 참조를 변경할 수 없습니다. 함수에 변경 가능한 참조를 전달하지 않는 한. 예를 들어 다음 코드는 컴파일되지 않습니다.

    fn main() {
        let greeting = "Hello, ".to_string();
        add_name(&greeting);
        println!("{}!", greeting);
    }
    
    fn add_name(greeting: &String) {
        greeting.push_str("John");
    }
    


    위의 예제가 작동하려면 변경 가능한 참조를 사용해야 합니다.

    fn main() {
        let mut greeting = "Hello, ".to_string();
        add_name(&mut greeting);
        println!("{}!", greeting);
    }
    
    fn add_name(greeting: &mut String) {
        greeting.push_str("John");
    }
    


    변경 사항은 다음과 같습니다.
  • 이제 인사말 변수를 변경할 수 있습니다
  • .
  • 이제 add_name 함수에 전달된 참조를 변경할 수 있습니다.
  • 이제 add_name 함수 선언에서 변경 가능한 참조를 허용합니다.

  • 변경 가능한 참조를 사용하면 함수가 해당 범위에서 변수를 차용하고 변경할 수 있습니다.

    결론



    이 문서에서는 소유권 및 차용이 작동하는 방식과 이를 사용하는 방법에 중점을 둡니다. 다음은 주제에 대한 지식을 넓히는 데 도움이 될 수 있습니다.
  • References and Borrowing | Rust Docs
  • Understanding Ownership | Rust Docs
  • Diving into Rust’s Ownership
  • 좋은 웹페이지 즐겨찾기