2025년 4월 7일 월요일

3-1강 - 소유권

러스트 소유권(Ownership) 정리

소유권이란?

러스트(Rust)의 가장 핵심 개념
메모리 안전(Memory Safety)을 보장하기 위한 설계 철학

"러스트는 데이터에 대한 소유권 규칙을 통해 메모리를 자동으로 관리한다."


소유권 규칙 3가지



1. 값 이동은 오직 하나의 소유자(owner)만 가진다.
2. 소유자가 스코프를 벗어나면 데이터는 자동으로 drop(메모리 해제) 된다.
3. 데이터 이동(move)시 원래 소유자는 더 이상 데이터 사용 불가

(1)소유권
// 소유권을 다른 변수로 이관하는 예제
fn main() {
    //새로운 문자열 변수 생성
    let s1 = String::from("Hello Rust!");

    // s2로 소유권을 이동
    let s2 = s1;

   // s1은 소유권을 상실했기 때문에 s1에 접근하는 순간 컴파일 에러 발생
   println!("{}", s1);
}

// clone를 사용해 값을 복제해서 소유권 문제 해결
fn main() {
    // 새로운 문자열 변수를 생성
    let s1 = String::from("Hello Rust!");

    // s1을 "복사"하여 s2에 저장
    let s2 = s1.clone();

    // s1은 여전히 소유권을 가지고 있기 때문에 문제없음
    println!("{}", s1);
}

(2) 빌림
//함수 파라미터로 값을 전달하는 경우 소유권도 함께 이전 되기에
// 변수의 재사용이 어렵다.

fn main() {
    let s = String::from("Hello");
    push_str(s); // push_str 함수에 소유권을 전달
    println!("{}", s); // s를 사용하는 순간 컴파일 오류 발생
}

fn push_str(mut s: String) {
    s.push_str(" Rust!");
}

// 빌림을 사용해 소유권 공유
// 값은 전달하되 소유권은 유지하고 싶을 경우 사용
fn main() {
    let mut s = String::from("Hello");

    //s 의 소유권을 이전하지 않고, 참조를 전달해 문자열의 내용을 변경
    push_str(&mut s);

    // s는 소유권을 유지하고 있기에 정상 동작
    println!("{}", s);
}

fn push_str(s: &mut String) {
    s.push_str(" Rust!");
}

댓글 없음:

댓글 쓰기