가시성
기본적으로 모듈 내의 아이템들은 비공개(private) 가시성을 가지지만, pub 수식어를 사용하여 이를 재정의할 수 있습니다. 모듈 스코프 외부에서는 모듈의 공개(public) 아이템만 접근할 수 있습니다.
// `my_mod`라는 이름의 모듈
mod my_mod {
// 모듈 내의 아이템들은 기본적으로 비공개 가시성을 가집니다.
fn private_function() {
println!("`my_mod::private_function()` 호출됨");
}
// 기본 가시성을 재정의하려면 `pub` 수식어를 사용하세요.
pub fn function() {
println!("`my_mod::function()` 호출됨");
}
// 아이템들은 같은 모듈 내의 다른 아이템들에 접근할 수 있으며,
// 이는 비공개 아이템이라도 마찬가지입니다.
pub fn indirect_access() {
print!("`my_mod::indirect_access()` 호출됨, 결과는\n> ");
private_function();
}
// 모듈은 중첩될 수도 있습니다
pub mod nested {
pub fn function() {
println!("`my_mod::nested::function()` 호출됨");
}
#[allow(dead_code)]
fn private_function() {
println!("`my_mod::nested::private_function()` 호출됨");
}
// `pub(in path)` 구문을 사용하여 선언된 함수들은 오직 지정된
// 경로 내에서만 보입니다. `path`는 반드시 부모 또는 조상 모듈이어야 합니다.
pub(in crate::my_mod) fn public_function_in_my_mod() {
print!("`my_mod::nested::public_function_in_my_mod()` 호출됨, 결과는\n> ");
public_function_in_nested();
}
// `pub(self)` 구문을 사용하여 선언된 함수들은 오직 현재 모듈
// 내에서만 보이며, 이는 비공개로 두는 것과 동일합니다.
pub(self) fn public_function_in_nested() {
println!("`my_mod::nested::public_function_in_nested()` 호출됨");
}
// `pub(super)` 구문을 사용하여 선언된 함수들은 오직 부모 모듈
// 내에서만 보입니다.
pub(super) fn public_function_in_super_mod() {
println!("`my_mod::nested::public_function_in_super_mod()` 호출됨");
}
}
pub fn call_public_function_in_my_mod() {
print!("`my_mod::call_public_function_in_my_mod()` 호출됨, 결과는\n> ");
nested::public_function_in_my_mod();
print!("> ");
nested::public_function_in_super_mod();
}
// pub(crate)는 함수를 오직 현재 크레이트 내에서만 보이게 만듭니다
pub(crate) fn public_function_in_crate() {
println!("`my_mod::public_function_in_crate()` 호출됨");
}
// 중첩된 모듈도 동일한 가시성 규칙을 따릅니다
mod private_nested {
#[allow(dead_code)]
pub fn function() {
println!("`my_mod::private_nested::function()` 호출됨");
}
// 비공개 부모 아이템은 자식 아이템이 더 큰 스코프 내에서 보이도록
// 선언되어 있더라도 여전히 그 가시성을 제한합니다.
#[allow(dead_code)]
pub(crate) fn restricted_function() {
println!("`my_mod::private_nested::restricted_function()` 호출됨");
}
}
}
fn function() {
println!("`function()` 호출됨");
}
fn main() {
// 모듈은 이름이 같은 아이템들 간의 모호함을 해소할 수 있게 해줍니다.
function();
my_mod::function();
// 중첩된 모듈 내부에 있는 아이템을 포함한 공개 아이템들은
// 부모 모듈 외부에서 접근할 수 있습니다.
my_mod::indirect_access();
my_mod::nested::function();
my_mod::call_public_function_in_my_mod();
// pub(crate) 아이템은 같은 크레이트 내 어디에서나 호출될 수 있습니다
my_mod::public_function_in_crate();
// `pub(in path)` 아이템은 오직 지정된 모듈 내에서만 호출될 수 있습니다
// 에러! `public_function_in_my_mod` 함수는 비공개입니다
// my_mod::nested::public_function_in_my_mod();
// TODO ^ 이 줄의 주석을 해제해 보세요
// 모듈의 비공개 아이템은 공개 모듈에 중첩되어 있더라도
// 직접 접근할 수 없습니다:
// 에러! `private_function`은 비공개입니다
// my_mod::private_function();
// TODO ^ 이 줄의 주석을 해제해 보세요
// 에러! `private_function`은 비공개입니다
// my_mod::nested::private_function();
// TODO ^ 이 줄의 주석을 해제해 보세요
// 에러! `private_nested`는 비공개 모듈입니다
// my_mod::private_nested::function();
// TODO ^ 이 줄의 주석을 해제해 보세요
// 에러! `private_nested`는 비공개 모듈입니다
// my_mod::private_nested::restricted_function();
// TODO ^ 이 줄의 주석을 해제해 보세요
}