Menu
Coddy logo textTech

Public 키워드

Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 9번째.

이전 레슨에서 코드를 별도의 모듈 파일로 구성하는 방법을 배웠습니다. 하지만 main.rs에서 Player 구조체를 사용하려고 하면 컴파일러 오류가 발생할 것입니다. 그 이유는 Rust 모듈의 모든 것이 기본적으로 비공개(private)이기 때문입니다.

항목을 모듈 외부에서 접근 가능하게 만들려면, pub 키워드를 사용하여 명시적으로 표시해야 합니다:

// player.rs
pub struct Player {
    pub name: String,
    pub score: u32,
}

impl Player {
    pub fn new(name: String) -> Player {
        Player { name, score: 0 }
    }
}

pub이 구조체 자체, 각 필드, 그리고 메서드와 같이 여러 곳에 나타나는 점에 주목하세요. 각 항목은 고유한 가시성 선언이 필요합니다.

struct에 pub이 없으면, 다른 파일에서 해당 타입을 명명할 수조차 없습니다. 필드에 pub이 없으면, 데이터에 직접 접근할 수 없습니다. 메서드에 pub이 없으면, 메서드를 호출할 수 없습니다.

이제 main.rs에서 모듈의 공개 항목(public items)을 사용할 수 있습니다:

// main.rs
mod player;

use player::Player;

fn main() {
    let p = Player::new(String::from("Alice"));
    println!("{}", p.name);
}

use 문은 Player를 스코프로 가져오므로 매번 player::Player라고 쓸 필요가 없습니다. 이러한 기본 비공개(privacy-by-default) 방식은 의도된 것으로, 코드의 어떤 부분이 외부에 노출되어야 하는지 신중하게 생각하도록 유도합니다.

challenge icon

챌린지

쉬움

코드를 두 개의 파일로 구성하고 적절한 항목을 public으로 설정하여 메인 프로그램에서 사용할 수 있도록 하는 간단한 제품 카탈로그를 만들어 보겠습니다.

두 개의 파일을 생성하게 됩니다:

  • product.rs: 두 개의 필드 name (String)과 price (f64)를 가진 Product 구조체를 정의하세요. 이름과 가격을 인자로 받아 새로운 Product를 반환하는 new라는 연관 함수를 추가하세요. 구조체, 필드, 그리고 메서드를 public으로 표시하여 모듈 외부에서 접근할 수 있도록 해야 함을 기억하세요.
  • main.rs: product 모듈을 선언하고, use 문을 사용하여 Product를 스코프로 가져온 다음, 제품을 생성하고 세부 정보를 출력하세요.

pub 키워드가 어디에 필요한지 신중하게 생각하세요. 구조체 자체는 보여야 하고, 필드는 읽기 위해 접근 가능해야 하며, 생성자 메서드는 main.rs에서 호출 가능해야 합니다.

출력은 다음 형식을 정확히 따라야 합니다:

Product: {name}, Price: ${price}

예를 들어, 이름이 "Laptop"이고 가격이 999.99인 제품을 생성하면 출력은 다음과 같습니다:

Product: Laptop, Price: $999.99

제품 이름과 가격이라는 두 개의 입력을 받게 됩니다.

치트 시트

Rust에서 모듈 내의 모든 항목은 기본적으로 비공개(private)입니다. 모듈 외부에서 항목에 접근할 수 있게 하려면 pub 키워드를 사용하세요.

구조체, 필드 및 메서드를 공개(public)로 표시합니다:

// player.rs
pub struct Player {
    pub name: String,
    pub score: u32,
}

impl Player {
    pub fn new(name: String) -> Player {
        Player { name, score: 0 }
    }
}

각 항목에는 고유한 가시성 선언이 필요합니다:

  • 구조체에 pub을 사용하면 타입을 볼 수 있게 됩니다.
  • 필드에 pub을 사용하면 데이터에 직접 접근할 수 있습니다.
  • 메서드에 pub을 사용하면 메서드를 호출할 수 있습니다.

use 문을 사용하여 항목을 스코프로 가져옵니다:

// main.rs
mod player;

use player::Player;

fn main() {
    let p = Player::new(String::from("Alice"));
    println!("{}", p.name);
}

직접 해보기

// product 모듈 선언
mod product;

// TODO: use 문을 사용하여 Product를 스코프로 가져오기

fn main() {
    // 입력 읽기
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");
    
    // TODO: Product::new 함수를 사용하여 새로운 Product 생성하기
    
    // TODO: 다음 형식으로 제품 상세 정보 출력하기:
    // Product: {name}, Price: ${price}
}
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨