Menu
Coddy logo textTech

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를 제공하는 방법을 배웁니다.

challenge icon

챌린지

쉬움

민감한 데이터를 모듈 내부에 보호하여 캡슐화를 보여 주는 온도 센서 시스템을 만들어 봅시다.

코드를 구성하기 위해 두 개의 파일을 만듭니다:

  • sensor.rs: 두 개의 field인 location(String)과 reading(f64)을 포함하는 TemperatureSensor struct를 Define합니다. 이 struct는 다른 파일에서 사용할 수 있도록 public이어야 하지만, 두 field는 모두 private으로 유지합니다. 외부 코드는 센서의 데이터에 직접 access하거나 수정할 수 없어야 합니다. location 이름과 initial 온도 reading을 Takes하는 public new constructor를 추가합니다.
  • 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 함수가 확인 메시지 출력을 처리합니다
    
}
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Rust 컴파일러