소개
이 실습에서는 Rust 모듈 내 항목의 가시성에 대해 배웁니다. 기본적으로는 비공개 (private) 가시성을 가지며, pub 수정자를 사용하여 가시성을 재정의하고, pub(in path), pub(self), pub(super), pub(crate)와 같은 다양한 가시성 수준을 살펴봅니다. 또한 중첩된 모듈과 모듈 내 비공개 항목에 대한 액세스 제한 사항도 탐구합니다.
참고: 실습에서 파일 이름을 지정하지 않으면 원하는 파일 이름을 사용할 수 있습니다. 예를 들어
main.rs파일을 사용하고rustc main.rs && ./main명령어로 컴파일 및 실행할 수 있습니다.
가시성
모듈 내 항목은 기본적으로 비공개 (private) 가시성을 가지지만, pub 수정자를 사용하여 이를 재정의할 수 있습니다. 모듈 외부에서 접근할 수 있는 것은 해당 모듈의 공개 항목 (public items) 뿐입니다.
// `my_mod` 라는 이름의 모듈
mod my_mod {
// 모듈 내 항목은 기본적으로 비공개 가시성을 가집니다.
fn private_function() {
println!("called `my_mod::private_function()`");
}
// `pub` 수정자를 사용하여 기본 가시성을 재정의합니다.
pub fn function() {
println!("called `my_mod::function()`");
}
// 항목은 같은 모듈 내 다른 항목에 접근할 수 있습니다.
// 비공개 항목이라도 마찬가지입니다.
pub fn indirect_access() {
print!("called `my_mod::indirect_access()`, that\n> ");
private_function();
}
// 모듈은 중첩될 수도 있습니다.
pub mod nested {
pub fn function() {
println!("called `my_mod::nested::function()`");
}
#[allow(dead_code)]
fn private_function() {
println!("called `my_mod::nested::private_function()`");
}
// `pub(in path)` 구문을 사용하여 선언된 함수는 지정된 경로 내에서만 표시됩니다. `path` 는 부모 또는 조상 모듈이어야 합니다.
pub(in crate::my_mod) fn public_function_in_my_mod() {
print!("called `my_mod::nested::public_function_in_my_mod()`, that\n> ");
public_function_in_nested();
}
// `pub(self)` 구문을 사용하여 선언된 함수는 현재 모듈 내에서만 표시됩니다.
// 이는 비공개로 남겨두는 것과 같습니다.
pub(self) fn public_function_in_nested() {
println!("called `my_mod::nested::public_function_in_nested()`");
}
// `pub(super)` 구문을 사용하여 선언된 함수는 부모 모듈 내에서만 표시됩니다.
pub(super) fn public_function_in_super_mod() {
println!("called `my_mod::nested::public_function_in_super_mod()`");
}
}
pub fn call_public_function_in_my_mod() {
print!("called `my_mod::call_public_function_in_my_mod()`, that\n> ");
nested::public_function_in_my_mod();
print!("> ");
nested::public_function_in_super_mod();
}
// `pub(crate)` 는 함수가 현재 크레이트 내에서만 표시되도록 합니다.
pub(crate) fn public_function_in_crate() {
println!("called `my_mod::public_function_in_crate()`");
}
// 중첩된 모듈도 가시성 규칙을 따릅니다.
mod private_nested {
#[allow(dead_code)]
pub fn function() {
println!("called `my_mod::private_nested::function()`");
}
// 비공개 부모 항목은 더 큰 범위 내에서 표시되도록 선언되어도 자식 항목의 가시성을 여전히 제한합니다.
#[allow(dead_code)]
pub(crate) fn restricted_function() {
println!("called `my_mod::private_nested::restricted_function()`");
}
}
}
fn function() {
println!("called `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 ^ 이 줄을 주석 해제해 보세요
}
요약
축하합니다! 가시성 실습을 완료했습니다. LabEx 에서 더 많은 실습을 통해 기술을 향상시킬 수 있습니다.