Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

가시성

기본적으로 모듈 내의 아이템들은 비공개(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 ^ 이 줄의 주석을 해제해 보세요
}