[Rust] 2장 Rust의 소유권(Ownership)

1. Rust의 소유권

러스트(Rust)에서의 소유권(Ownership)은 메모리 안정성을 보장하기 위한 개념으로 소유권 시스템은 다음과 같은 원친으로 구성됩니다.

  • 소유권 규칙:
    • 각 값은 하나의 소유자(변수)에만 속할 수 있음
    • 소유자가 범위를 벗어나면 해당 값은 자동으로 메모리에서 해제
  • 참조와 대여(References and Borrowing)
    • 다른 변수에 소유권을 이동하지 않고 값을 사용할 수 있도록 참조를 사용할 수 있음
    • 불변 참조(&T)는 여러 개가 가능하나, 가변 참조(&mut T)는 하나만 존재할 수 있음, 이는 데이터 경합을 방지
  • 스코프(Scope)
    • 변수의 스코프가 끝나면 해당 변수의 소유권이 종료
    • 이와 동시에 메모리도 자동 해제되며 이를 통해 메모리 누수를 방지
  • 이동(Smove)와 복사(Copy)
    • 기본적으로 소유권이 이동하며, 한 변수에서 다른 변수로 값을 할당하면 원래 변수는 더이상 그 값에 접근X
    • 그너나 일부 타입(ex. 정수, 부동 소수점)은 복사 가능하며, 소유권 이동 없이도 값을 복사 가능

 


2. 기본 소유권 규칙

  • 기본 소유권 규칙

Rust의 값의 소유자는 각 값에 하나의 변수에만 속합니다. 이 변수에는 그 값을 소유하며, 변수가 스코프를 벗어나면 값이 자동으로 메모리에서 해제됩니다. 우선 아래 명령어로 rust 프로그램을 생성합니다.

cargo new owenship
// 기본 소유자 규칙
fn main() {
    let jack = String::from("Hello Cargo!"); // jack은 "Hello Cargo"의 소유자!
}
  • 소유권 이동(Move)

값을 다른 변수에 할당하면 소유권이 이동합니다. 이전 변수는 더 이상 해당 값을 참조할 수 없습니다.

fn main() {
    let s1 = String::from("Hello");
    let s2 = s1; // s1의 소유권이 s2로 이동

    println!("{}", s2); // 성공
    // println!("{}", s1) // 실패: s1은 더 이상 사용 X
}
  • 복사(Copy)

일부 기본 데이터 타입(정수, 부동 소수점)은 Copy 트레잇을 구현해 소유권 이동 없이 복사할 수 있습니다.

fn main() {
    let x = 5;
    let y = x; // x의 값을 y에 복사

    println!("{}", y) // 정상 작동
}
  • 참조와 대여(Borrowing)

다른 변수에 소유권을 이동하지 않고 사용할 수 있습니다.이를 위해 참조를 사용할 수 있습니다.

fn main() {
    let s1 = String::from("Hello");
    let len = calculate_length(&s1); // 불변 참조

    println!("Length: {}", len); // s1 여전히 유효
}

fn calculate_length(s: &String) -> usize {
    s.len() 
}
  • 가변 참조 (Mutable Borrowing)

값에 대한 가변 참조를 생성할 수 있으나, 동시에 하나의 가변 참조만 가질 수 있습니다.

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

    change(&mut s); // 가변 참조

    println!("{}", s);

}


fn change(s: &mut String) {
    s.push_str(", World");
}
  • 스코프와 메모리 해체
fn main() {

    let s = String::from("Hello");
    // s는 이 블록 내에 유효
    // s는 이 시점에서 메모리 해체
}

결론

  • 러스트의 소유권 시스템은 메모리 안정성을 보장함
  • 컴파일 타임에 오류를 방지하는 강력한 도구
  • 소유권, 대여, 참조 개념을 활용해 안전하고 효율적인 코드 작성 가능

 

 

GitHub - Koras02/rust-tutorial: https://thinky.tistory.com/category/Back-End/Rust

https://thinky.tistory.com/category/Back-End/Rust. Contribute to Koras02/rust-tutorial development by creating an account on GitHub.

github.com

 

LIST

'Back-End > Rust' 카테고리의 다른 글

[Rust] 6장 에러 처리  (0) 2025.03.08
[Rust] 5장 패턴 매칭(Pattern Matching)  (0) 2025.03.06
[Rust] 4장 데이터 타입(Data Types)  (0) 2025.03.02
[Rust] 3장 빌림(Borrowing)  (0) 2025.02.27
[Rust] 1장 Rust란 무엇인가  (0) 2025.02.23