Self 매개변수
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 2번째.
메서드가 구조체 인스턴스에 저장된 데이터에 접근해야 할 때, &self 매개변수를 사용합니다. 이 특별한 매개변수는 항상 메서드의 첫 번째 인자이며, 메서드가 호출되는 인스턴스에 대한 참조를 나타냅니다.
& 기호는 인스턴스의 소유권을 가져오는 대신 인스턴스를 빌린다는 것을 의미합니다. 이를 통해 메서드는 인스턴스를 소비하지 않고 구조체의 필드를 읽을 수 있습니다:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
메서드 본문 안에서 self를 사용하면 점 표기법을 통해 구조체의 모든 필드에 접근할 수 있습니다. area 메서드는 width와 height를 모두 읽어 결과를 계산하고 반환합니다.
&self는 인스턴스를 빌리기만 하기 때문에, 아무런 문제 없이 동일한 구조체에서 여러 메서드를 호출할 수 있습니다:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
&self를 사용하는 메서드는 읽기 전용입니다. 즉, 구조체의 데이터를 조사할 수는 있지만 변경할 수는 없습니다. 다음 레슨에서는 인스턴스를 수정할 수 있는 메서드를 만드는 방법을 배우게 됩니다.
챌린지
쉬움하나의 필드 radius (f64)를 가진 Circle 구조체를 생성하세요.
&self를 사용하는 두 개의 메서드를 포함하는 Circle의 구현 블록(implementation block)을 추가하세요:
circumference— 둘레를f64로 반환합니다 (공식:2.0 * 3.14159 * radius)diameter— 지름을f64로 반환합니다 (공식:2.0 * radius)
하나의 입력을 받게 됩니다:
- 원의 반지름 (f64)
제공된 반지름으로 Circle 인스턴스를 생성한 다음, 둘레와 지름을 각각 별도의 줄에 출력하세요.
예상 출력 형식:
{circumference}
{diameter}치트 시트
메서드는 &self 매개변수를 사용하여 구조체 데이터에 접근하며, 이는 반드시 첫 번째 인자여야 합니다. & 기호는 메서드가 인스턴스의 소유권을 가져오는 대신 인스턴스를 빌려온다는(borrow) 것을 의미합니다:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
메서드 내부에서는 점 표기법(dot notation)과 함께 self를 사용하여 구조체 필드에 접근합니다. &self를 사용하는 메서드는 읽기 전용이며 데이터를 조사할 수는 있지만 수정할 수는 없습니다.
&self는 인스턴스를 빌려오기만 하기 때문에, 동일한 구조체에서 여러 메서드를 호출할 수 있습니다:
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
직접 해보기
use std::io;
// TODO: 여기에 Circle 구조체를 정의하세요
// TODO: 둘레(circumference)와 지름(diameter) 메서드를 포함하는 Circle의 구현 블록을 추가하세요
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Circle 인스턴스를 생성하고 둘레와 지름을 출력하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.