Menu
Coddy logo textTech

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 메서드는 widthheight를 모두 읽어 결과를 계산하고 반환합니다.

&self는 인스턴스를 빌리기만 하기 때문에, 아무런 문제 없이 동일한 구조체에서 여러 메서드를 호출할 수 있습니다:

fn main() {
    let rect = Rectangle { width: 10, height: 5 };
    
    println!("Area: {}", rect.area());      // 50
    println!("Square? {}", rect.is_square()); // false
}

&self를 사용하는 메서드는 읽기 전용입니다. 즉, 구조체의 데이터를 조사할 수는 있지만 변경할 수는 없습니다. 다음 레슨에서는 인스턴스를 수정할 수 있는 메서드를 만드는 방법을 배우게 됩니다.

challenge icon

챌린지

쉬움

하나의 필드 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 인스턴스를 생성하고 둘레와 지름을 출력하세요
    
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨