Getter
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 11번째.
비공개 필드를 사용하면 외부 코드에서 구조체의 데이터에 직접 접근할 수 없습니다. 하지만 때로는 다른 이들에게 데이터를 변경할 수 있는 권한을 주지 않으면서 데이터를 읽을 수 있게 해줘야 할 때가 있습니다. 이럴 때 게터 메서드(getter methods)가 사용됩니다.
게터(getter)는 단순히 프라이빗 필드에 대한 참조를 반환하는 퍼블릭 메서드입니다:
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
balance() 메서드는 &self(읽기 전용 접근)를 받으며 프라이빗 필드의 값을 반환합니다. Rust에서 게터(getter)는 일반적으로 필드 자체의 이름을 따서 명명되며, get_ 접두사는 필요하지 않습니다.
이제 외부 코드에서 메서드를 통해 잔액을 읽을 수 있습니다:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance()); // 작동합니다!
}
String과 같이 소유된 데이터를 포함하는 필드의 경우, 불필요한 복사를 피하기 위해 종종 참조를 반환합니다:
pub fn name(&self) -> &String {
&self.name
}
게터(Getters)는 필드 자체를 보호하면서 제어된 읽기 권한을 제공합니다. 구조체는 데이터에 대한 제어권을 유지하며, 외부 코드는 데이터를 조회할 수는 있지만 직접 수정할 수는 없습니다.
챌린지
쉬움프라이빗 데이터에 대한 제어된 읽기 액세스를 게터(getter) 메서드가 어떻게 제공하는지 보여주는 사용자 프로필 시스템을 구축해 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
profile.rs: 두 개의 프라이빗 필드username(String)과age(u32)를 가진UserProfile구조체를 정의합니다. 구조체 자체는 public이어야 하지만, 필드는 private으로 유지되어야 합니다. username과 age를 매개변수로 받는 publicnew생성자를 구현하세요. 그런 다음 두 개의 게터 메서드를 추가합니다:username— 사용자 이름에 대한 참조(&String)를 반환합니다.age— 나이 값(u32)을 반환합니다.
main.rs: profile 모듈을 가져와서UserProfile을 생성하고, 게터 메서드를 사용하여 사용자 정보를 출력합니다.
Rust에서 게터는 일반적으로 필드 이름과 동일하게 명명하며, get_ 접두사가 필요하지 않다는 점을 기억하세요. String 필드의 경우 불필요한 복사를 피하기 위해 참조를 반환합니다.
출력은 반드시 다음 형식을 따라야 합니다:
Username: {username}
Age: {age}예를 들어, 사용자 이름이 "alice"이고 나이가 25인 프로필을 생성하면 출력은 다음과 같습니다:
Username: alice
Age: 25사용자 이름과 나이, 두 개의 입력을 받게 됩니다.
치트 시트
게터 메서드(getter method)는 프라이빗 필드에 대해 읽기 전용 액세스를 제공하는 퍼블릭 메서드입니다.
게터는 외부 코드에서 데이터를 직접 수정할 수 없게 하면서 데이터를 볼 수 있도록 허용합니다:
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
Rust에서 게터는 필드 자체의 이름을 따서 명명하며, get_ 접두사는 필요하지 않습니다.
String과 같이 소유권이 있는 데이터를 포함하는 필드의 경우, 불필요한 복사를 피하기 위해 참조를 반환합니다:
pub fn name(&self) -> &String {
&self.name
}
게터 메서드 사용하기:
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance());
직접 해보기
mod profile;
use profile::UserProfile;
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let age: u32 = input2.trim().parse().expect("Failed to parse age");
// TODO: 생성자를 사용하여 UserProfile을 생성하세요.
// TODO: 게터(getter) 메서드를 사용하여 사용자 이름과 나이를 출력하세요.
// 형식:
// Username: {username}
// Age: {age}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.