C.W.K.
Stream
Lesson 01 of 06 · published

모듈 & 가시성

~11 min · tooling, modules, visibility, use

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

프로그램이 한 파일을 넘어 자라면 구조가 필요해: 관련 코드를 묶고 어디서 뭐가 보이는지 제어하는 법. Rust 의 답이 모듈 시스템mod, 가시성, use 야.

mod: 코드 묶기

mod name { ... } 가 모듈을 선언해 — 관련 항목의 이름 붙은 네임스페이스. 모듈은 중첩되고, 파일에 자연스럽게 매핑돼: mod foo; 가 Rust 한테 foo.rs (또는 foo/mod.rs) 를 그 모듈로 로드하라고 해. 크레이트에 뿌리내린 모듈 트리를 지어.

가시성: 기본 private

Rust 의 모든 건 기본 자기 모듈에 private — 함수, struct, 필드가 정의한 모듈 (과 자식) 에서만 보여. pub 으로 가시성에 opt-in 해: pub fn, pub struct, 개별 필드의 pub. 많은 언어의 기본-공개와 반대고, 의도적이야: API 표면을 명시적으로 노출해서 아무것도 실수로 안 새.

기본 private; pub 은 opt-in. 모듈 내부는 pub 으로 표시하지 않으면 숨어 있어. 이게 공개 API 를 의식적이고 보이는 선택으로 만들어 — pub 항목만 호출자와의 계약이란 걸 알고 내부를 자유롭게 리팩터해.

use: 경로를 스코프로 가져오기

use crate::foo::barbar 를 스코프로 가져와 한정 없이 부를 수 있게 해. 경로는 crate (크레이트 루트), self (현재 모듈), super (부모) 에서 시작해. use 는 그냥 import 야 — 코드를 옮기는 게 아니라 참조하는 법을 줄일 뿐. 관용적 Rust 는 use 문을 각 파일 위에 모아.

Code

모듈, pub 가시성, use import·rust
mod geometry {
    pub struct Circle { pub radius: f64 } // pub struct + pub 필드

    impl Circle {
        pub fn area(&self) -> f64 {        // pub 메서드
            std::f64::consts::PI * self.radius * self.radius
        }
    }

    fn helper() {}  // private: `geometry` 안에서만 호출 가능
}

use geometry::Circle; // 경로를 스코프로

fn main() {
    let c = Circle { radius: 2.0 };
    println!("{:.2}", c.area());
}

External links

Exercise

pub 함수 하나랑 그게 내부적으로 부르는 private helper 하나짜리 모듈을 만들어. main 에서 공개 함수를 부르고 (됨) private helper 를 부르려 해봐 (컴파일 실패). 그다음 공개 함수를 use 해서 모듈 접두사 없이 불러. helper 를 private 로 두는 게 뭘 벌어줘?
Hint
private helper 는 자유롭게 바꾸거나 지울 수 있어 — 네 모듈 계약의 일부가 아니거든. pub 항목만 그래. 프라이버시가 호출자 깰 걱정 없이 내부를 리팩터하게 해줘.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.