Private 필드
Coddy Rust 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 10번째.
이전 수업에서는 모든 것을 public으로 만들었습니다. struct, 그 필드와 메서드까지 말입니다. 하지만 진정한 캡슐화란 데이터에 접근할 수 있는 방법을 제어하는 것을 의미합니다. Rust에서는 struct를 public으로 만들면서 해당 필드는 private으로 유지할 수 있습니다.
음수가 되어서는 안 되는 Wallet을 생각해 보세요. field가 public이라면 누구나 어떤 값으로든 설정할 수 있습니다:
// wallet.rs
pub struct Wallet {
balance: f64, // pub 없음 = private!
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
}
Wallet은 public이지만 balance에는 pub 키워드가 없다는 점에 주목하세요. 이는 모듈 외부의 코드가 constructor를 사용하여 Wallet을 생성할 수 있지만, balance field를 직접 read하거나 수정할 수는 없다는 의미입니다:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
// println!("{}", w.balance); // 오류! 필드가 private입니다
// w.balance = -50.0; // 오류! private 필드에 접근할 수 없습니다
}
이것이 캡슐화의 기초입니다. struct가 자체 데이터를 제어합니다. 외부 코드는 사용자가 제공하는 메서드를 거쳐야 하므로, 유효성 검사, 로깅 또는 기타 로직을 추가할 수 있습니다. 데이터는 잘못된 상태로부터 보호됩니다.
다음 레슨에서는 getter 및 setter 메서드를 통해 이 private 데이터에 대한 제어된 access를 제공하는 방법을 배웁니다.
챌린지
쉬움민감한 데이터를 모듈 내부에 보호하여 캡슐화를 보여 주는 온도 센서 시스템을 만들어 봅시다.
코드를 구성하기 위해 두 개의 파일을 만듭니다:
sensor.rs: 두 개의 field인location(String)과reading(f64)을 포함하는TemperatureSensorstruct를 Define합니다. 이 struct는 다른 파일에서 사용할 수 있도록 public이어야 하지만, 두 field는 모두 private으로 유지합니다. 외부 코드는 센서의 데이터에 직접 access하거나 수정할 수 없어야 합니다. location 이름과 initial 온도 reading을 Takes하는 publicnewconstructor를 추가합니다.main.rs: sensor 모듈을 가져오고 constructor를 using하여TemperatureSensor를 생성합니다. field가 private이므로 이를 직접 출력할 수 없으며, 대신 sensor가 성공적으로 created되었음을 보여 주는 confirmation message를 출력합니다.
이 challenge는 private field의 핵심 개념에 초점을 맞춥니다. struct에는 access할 수 있지만 내부 data는 보호됩니다. 외부 코드는 사용자가 제공하는 method를 통해서만 sensor와 상호 작용할 수 있습니다(이 경우에는 constructor만 해당).
출력은 다음의 정확한 형식을 따라야 합니다:
Sensor created for: {location}printing을 위해 location에 access하려면, field 자체가 private이므로 sensor를 반환하기 전에 이 message를 출력하도록 new function을 작성해야 합니다.
예를 들어 location "Kitchen" 및 reading 22.5인 sensor를 생성하면 출력은 다음과 같습니다:
Sensor created for: Kitchen두 개의 입력을 받습니다. location 이름과 initial 온도 reading입니다.
직접 해보기
mod sensor;
use sensor::TemperatureSensor;
fn main() {
// 입력 읽기
let mut location = String::new();
std::io::stdin().read_line(&mut location).expect("Failed to read line");
let location = location.trim().to_string();
let mut reading_str = String::new();
std::io::stdin().read_line(&mut reading_str).expect("Failed to read line");
let reading: f64 = reading_str.trim().parse().expect("Failed to parse reading");
// TODO: 생성자를 사용하여 TemperatureSensor 생성
// new 함수가 확인 메시지 출력을 처리합니다
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Rust 컴파일러