위의 코드는 Rectangle이라는 구조체(struct)를 정의하고, area 함수를 통해 사각형의 넓이를 계산하는 프로그램입니다.
주요 구성 요소:
1. Rectangle 구조체 정의
width와 height라는 두 개의 u32 필드를 가짐 #[derive(Debug)]를 통해 println!("{:?}", rect1);로 디버깅 출력 가능 main 함수에서 인스턴스 생성 및 area 함수 호출
rect1이라는 Rectangle 인스턴스를 생성 area(&rect1) 함수를 호출하여 넓이를 계산 println!("{:?}", rect1);로 구조체 내용을 출력 area 함수
rectangle: &Rectangle을 인자로 받음 (소유권을 넘기지 않고 참조만 함) width * height 연산 후 결과 반환 Rust에서는 모든 값이 오너(Owner)를 가진다는 원칙이 있습니다.
Rust에서 구조체는 기본적으로 소유권을 가진 필드들의 집합입니다.
Rectangle 구조체의 인스턴스 생성 시 오너십let rect1 = Rectangle {
width: 30,
height: 50,
};
rect1은 Rectangle 인스턴스를 소유합니다. rect1이 살아 있는 동안(main 함수 종료 전까지) width와 height도 유지됩니다. 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의 값이 변경됨 1️⃣ Rust의 구조체는 소유권을 가짐
2️⃣ 소유권을 넘기지 않고 참조를 통해 접근 가능
&Rectangle을 사용하면 소유권을 이동하지 않고 읽기 가능 3️⃣ 가변 참조(&mut)로 값 변경 가능, 단 한 번에 하나만 빌릴 수 있음
&mut Rectangle을 사용하면 구조체 내부 값 변경 가능 4️⃣ 소유권을 넘겨버리면 해당 변수는 더 이상 사용할 수 없음
Rectangle 자체를 넘기면 이후 사용 불가 &Rectangle을 넘기거나 clone()을 사용