rust struct ownership

agnusdei·2025년 1월 29일
0

🔹 1. 코드 개요

위의 코드는 Rectangle이라는 구조체(struct)를 정의하고, area 함수를 통해 사각형의 넓이를 계산하는 프로그램입니다.

주요 구성 요소:
1. Rectangle 구조체 정의

  • widthheight라는 두 개의 u32 필드를 가짐
  • #[derive(Debug)]를 통해 println!("{:?}", rect1);로 디버깅 출력 가능
  1. main 함수에서 인스턴스 생성 및 area 함수 호출

    • rect1이라는 Rectangle 인스턴스를 생성
    • area(&rect1) 함수를 호출하여 넓이를 계산
    • println!("{:?}", rect1);로 구조체 내용을 출력
  2. area 함수

    • rectangle: &Rectangle을 인자로 받음 (소유권을 넘기지 않고 참조만 함)
    • width * height 연산 후 결과 반환

🔹 2. 구조체와 오너십 원리

2.1 Rust의 기본 오너십 규칙

Rust에서는 모든 값이 오너(Owner)를 가진다는 원칙이 있습니다.

  • 오너가 스코프(scope)를 벗어나면 해당 값은 자동으로 해제(drop)됩니다.
  • 변수 간 이동(move)이나 복사(copy)는 오너십 규칙을 따릅니다.

2.2 구조체의 소유권(Ownership)

Rust에서 구조체는 기본적으로 소유권을 가진 필드들의 집합입니다.

Rectangle 구조체의 인스턴스 생성 시 오너십

let rect1 = Rectangle {
    width: 30,
    height: 50,
};
  • rect1Rectangle 인스턴스를 소유합니다.
  • 즉, rect1이 살아 있는 동안(main 함수 종료 전까지) widthheight도 유지됩니다.
  • rect1이 스코프를 벗어나면 구조체가 해제됩니다.

area(&rect1) 호출 시 오너십

fn area(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}
  • rectangle: &Rectangle&rect1참조(reference) 를 전달
  • 구조체의 소유권을 넘기지 않고 읽기 전용 접근만 허용
  • rect1이 함수 호출 후에도 유효함 (소유권이 이동되지 않았기 때문)

✅ 만약 &Rectangle이 아니라 Rectangle을 직접 받았다면?

fn area(rectangle: Rectangle) -> u32 {
    rectangle.width * rectangle.height
}
  • rect1소유권이 area 함수로 이동(move)
  • main에서 rect1을 더 이상 사용할 수 없음 (오류 발생)
  • 만약 rect1을 다시 쓰고 싶다면 clone()을 사용해야 함

✅ 구조체의 값 변경 (가변 참조 사용)

기본적으로 &Rectangle불변 참조(immutable reference) 이므로 값을 변경할 수 없습니다.
만약 값을 변경하려면 가변 참조(mutable reference) 를 사용해야 합니다.

fn change_width(rectangle: &mut Rectangle) {
    rectangle.width += 10;
}

fn main() {
    let mut rect1 = Rectangle { width: 30, height: 50 };
    change_width(&mut rect1);
    println!("{:?}", rect1);  // width가 40으로 변경됨
}
  • &mut Rectangle을 사용하여 가변 참조를 허용
  • change_width(&mut rect1) 호출 시 rect1의 값이 변경됨
  • 가변 참조는 한 번에 하나만 가능 (Rust의 빌림 규칙)

🔹 3. 정리 (오너십과 구조체의 원칙)

1️⃣ Rust의 구조체는 소유권을 가짐

  • 구조체가 포함하는 모든 값은 구조체의 오너가 관리

2️⃣ 소유권을 넘기지 않고 참조를 통해 접근 가능

  • &Rectangle을 사용하면 소유권을 이동하지 않고 읽기 가능

3️⃣ 가변 참조(&mut)로 값 변경 가능, 단 한 번에 하나만 빌릴 수 있음

  • &mut Rectangle을 사용하면 구조체 내부 값 변경 가능

4️⃣ 소유권을 넘겨버리면 해당 변수는 더 이상 사용할 수 없음

  • 구조체를 함수에 넘길 때 Rectangle 자체를 넘기면 이후 사용 불가
  • 소유권 유지하려면 &Rectangle을 넘기거나 clone()을 사용

profile
DevSecOps ⚙️ + CTF🚩

0개의 댓글