구현 블록 소개
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 1번째.
Rust에서 구조체는 타입이 어떤 데이터를 보유하는지를 정의하지만, 그 타입이 무엇을 할 수 있는지는 정의하지 않습니다. 구조체에 동작을 부여하기 위해, impl 키워드와 함께 구현 블록(implementation blocks)을 사용합니다.
구현 블록은 함수(메서드라고 불리는)를 특정 구조체에 연결합니다. 기본 구조는 다음과 같습니다:
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
impl Dog 블록은 그 안의 모든 것이 Dog 구조체에 속한다는 것을 Rust에게 알려줍니다. 이러한 분리는 데이터 정의를 깔끔하게 유지하는 동시에, 구현 블록에 필요한 만큼 많은 메서드를 추가할 수 있게 해줍니다.
메서드를 호출하려면 인스턴스에 점 표기법(dot notation)을 사용하세요:
fn main() {
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // 출력: Rex says woof!
}
데이터(struct)와 동작(impl 블록)을 분리하는 이 패턴은 Rust 코드를 구조화하는 데 필수적입니다. 이어지는 레슨에서는 위 예제에서 보았던 &self 매개변수를 통해 메서드가 struct 데이터에 어떻게 접근하는지 살펴보겠습니다.
챌린지
쉬움두 개의 필드 name (String)과 lives (u8)를 가진 Cat 구조체를 생성하세요.
Cat에 대한 구현 블록을 추가하고, &self를 매개변수로 받아 고양이의 이름 뒤에 " says meow!"를 출력하는 meow라는 메서드를 작성하세요.
두 개의 입력을 받게 됩니다:
- 첫 번째 줄: 고양이의 이름 (String)
- 두 번째 줄: 목숨의 개수 (u8)
제공된 값으로 Cat 인스턴스를 생성하고 meow 메서드를 호출하세요.
예상 출력 형식:
{name} says meow!치트 시트
구현 블록은 impl 키워드를 사용하여 메서드를 구조체에 연결합니다:
struct Dog {
name: String,
age: u8,
}
impl Dog {
fn bark(&self) {
println!("{} says woof!", self.name);
}
}
impl 블록은 데이터 정의(구조체)와 동작(메서드)을 분리합니다. 메서드는 점 표기법을 사용하여 호출됩니다:
let my_dog = Dog {
name: String::from("Rex"),
age: 3,
};
my_dog.bark(); // 출력: Rex says woof!
메서드는 &self 매개변수를 사용하여 구조체 데이터에 접근합니다.
직접 해보기
use std::io;
// TODO: 'name' (String)과 'lives' (u8) 필드를 가진 Cat 구조체를 정의하세요
// TODO: 'meow' 메서드를 포함하는 Cat의 구현 블록을 추가하세요
fn main() {
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut lives_input = String::new();
io::stdin().read_line(&mut lives_input).expect("Failed to read line");
let lives: u8 = lives_input.trim().parse().expect("Failed to parse lives");
// TODO: Cat 인스턴스를 생성하고 meow 메서드를 호출하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.