7. 모듈

https://rinthel.github.io/rust-lang-book-en/ch07-00-modules.html

모듈 – The Rust 프로그래밍 언어

Rust에서 프로그램 작성을 시작하면 코드는 아마도 메인 함수에만 있을 것입니다.

코드가 커짐에 따라 재사용과 더 나은 구성을 결정합니다.

rinthel.github.io

1. 모듈(모듈, 모듈)

Rust의 모듈은 구조화된 항목 호출을 제공합니다.

여러 번 사용되는 함수(Function,trait 등)나 상대적으로 함수가 큰 객체(Enum,Struct 등)를 아이템이라고 하며, 이러한 아이템의 호출을 정리하여 코드 재사용 효율을 높인다.

프로그램을 보다 쉽게 ​​설계할 수 있도록 도와줍니다.

1.1 모듈 선언

모듈 선언은 mod 키워드로 이루어지며 추가 Privacy 속성 키워드로 모듈의 가시성을 제어할 수 있습니다.

Rust 모듈의 Privacy 속성은 Private과 Public으로 구분되며 기본적으로 모든 모듈은 Private입니다.

따라서 public 속성으로 모듈을 선언하기 위해서는 pub 키워드를 사용하여 모듈을 별도로 선언해야 합니다.

Public 속성이 있는 모듈과 달리 비공개 모듈은 크레이트 외부에서 액세스할 수 없습니다.

단, 예외적으로 동일한 현재 모듈 내에서는 상호 접근이 가능합니다.

또한 모듈에 속한 항목에 동일한 프라이버시 속성을 부여할 수 있습니다.


프라이버시 측면에서 Rust는 두 가지 프라이버시 규칙을 따라야 합니다.

  1. 프로젝트가 공용이면 상위 모듈의 어디에서나 액세스할 수 있습니다.

  2. 프로젝트가 비공개인 경우 동일한 파일의 상위 모듈 및 하위 모듈에서만 액세스할 수 있습니다.

1.2 모듈 범위

모듈을 사용할 때 루트 파일에서 extern 키워드로 호출할 모듈을 선언합니다.


또한 참조된 모듈의 경우 모듈에서 항목을 호출하는 방법에는 절대 경로 방식과 상대 경로 방식이 있습니다.

절대 경로는 위와 같이 모든 경로를 지정하는 방법입니다.

이러한 사용은 모듈이 깊지 않은 경우에는 문제가 되지 않지만, 복잡하고 깊은 모듈을 참조하고자 한다면 매번 긴 경로를 작성해야 하기 때문에 매우 불편할 것입니다.

이에 대한 응답으로 Rust는 use 키워드를 사용하여 필요한 만큼 모듈 범위를 가져올 수 있도록 허용합니다.


또한 *(glob) 연산자를 지원하여 특정 모듈 범위 내의 모든 항목을 가져옵니다.


1.2.1 역방향 범위

특정 모듈에서 동일한 파일의 모듈에 액세스하려면 어떻게 해야 합니까? 이 경우 두 개의 콜론을 사용하여 최상위 루트에서 시작하는 경로를 작성하는 방법이 있습니다.

그러나 이것은 모듈 계층에서 더 깊이 들어갈수록 매우 비효율적인 범위 선언으로 이어집니다.

이를 위해 항상 최상위 루트를 가리키는 super 키워드를 제공합니다.


모두 정리하면 다음과 같습니다.

// 이 모듈은 비공개적입니다.

따라서 외부 크레이트에서 접근할 수 없습니다.

// 단, 현재 크레이트의 루트(root)로부터 비공개적이기 때문에 // 현재 크레이트의 모든 모듈은 해당 모듈의 공개적 속성을 띄는 // 아이템들에 대해서는 접근할 수 있는 권한이 있습니다.

mod crate_helper_module { // 이 함수는 현재 크레이트 내 어디에서든 사용할 수 있습니다.

pub fn crate_helper() {} // 이 함수는 어느 크레이트에서도 이용할 수 없습니다.

// 현재 모듈 내에서, 혹은 이에 의존하는 자식 모듈에서만 접근할 수 있습니다.

fn implementation_detail() {} mod test { fn test_implementation() { // test 모듈은 super::implementation_detail(); } } } // 이 함수는 루트(root)로부터 공개적이므로 외부 크레이트에서 연결하여 사용할 수 있습니다.

pub fn public_api() {} // 공개 API와 유사하게, 이 모듈은 외부 크레이트들이 보기에 공개적인 특성을 띄고 있는것처럼 보입니다.

pub mod submodule { use crate::crate_helper_module; pub fn my_method() { // 현재 크레이트 내의 crate_helper_module의 공개적 속성을 // 지닌 모든 아이템들은 위의 두 가지 규칙을 통하여 호출될 수 있습니다.

crate_helper_module::crate_helper(); } // 이 함수는 submoudle 모듈의 의존하지 않는 모든 모듈에 대해서는 // 숨겨져 있습니다.

fn my_implementation() {} mod test { fn test_my_implementation() { // test 모듈은 submodule 모듈의 자식 모듈이므로 // 비공개 함수 my_implementation()을 호출할 수 있습니다.

super::my_implementation(); } } }