[Chapter 7-2] Rust 모듈 - pub 가시성 제어

hwwwa·2021년 11월 6일
0

🦀 Rust

목록 보기
18/25

pub으로 가시성(visibility) 제어하기

앞서 만들었던 프로젝트에서 빌드가 가능하긴 했지만 경고메세지가 띄워지는 것을 볼 수 있었습니다.

warning: function is never used: `connect`, #[warn(dead_code)] on by default
src/client.rs:1:1
  |
1 | fn connect() {
  | ^

warning: function is never used: `connect`, #[warn(dead_code)] on by default
 --> src/network/mod.rs:1:1
  |
1 | fn connect() {
  | ^

warning: function is never used: `connect`, #[warn(dead_code)] on by default
 --> src/network/server.rs:1:1
  |
1 | fn connect() {
  | ^

Rust는 connect 함수 등이 사용되지 않았기 때문에 경고를 띄워주었습니다.

connect 라이브러리를 다른 프로젝트에서 사용해봅시다. 이를 위해 같은 디렉토리에 binary crate를 만들어줍니다.

Filename: src/main.rs

extern crate communicator;

fn main() {
    communicator::client::connect();
}

communicator library crate를 가져오기 위해 extern crate 명령어를 사용합니다.

communicator 라이브러리 밖의 crate가 안을 들여다보는 시점에서, 우리가 만든 모듈들은 communicator 라는 이름을 갖는 모듈 내에 있습니다. crate의 최상위 모듈을 루트 모듈(root module) 이라 부릅니다.

또한 프로젝트의 서브모듈 내에서 외부 crate를 이용하고 있을지라도 extern crate 이 루트 모듈에 와 있어야합니다(즉, src/main.rs 혹은 src/lib.rs). 그러면 서브모듈 안에서 마치 최상위 모듈의 아이템을 참조하듯 외부 crate로부터 아이템들을 참조할 수 있습니다.

현 시점에서 binary crate는 라이브러리의 client 모듈로부터 connect 함수를 호출할 뿐이지만, cargo build 를 실행하면 경고들 이후 에러가 표시될 것입니다.

error: module `client` is private
 --> src/main.rs:4:5
  |
4 |     communicator::client::connect();
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

위의 에러는 client 모듈이 private임을 알려주고 있습니다. Rust의 모든 코드의 기본 상태는 private입니다.

client::connect와 같은 함수를 public으로 지정한 뒤에는 binary crate 상에서 함수를 호출하는 것이 가능해질 뿐만 아니라, 함수가 사용된 적이 없다는 경고 또한 사라질 것입니다. 함수를 공개로 표시하는 것은 Rust로 하여금 함수가 프로그램 외부의 코드에 의해 사용될 것이라는 점을 알게끔 해줍니다.

함수를 public으로 만들기

Rust에서 public을 사용하려면, 원하는 아이템의 선언 시작 부분에 pub 키워드를 추가합니다.

Filename: src/lib.rs

pub mod client;

pub mod network;

Filename: src/client.rs

pub fn connect() {
}

Filename: src/network/mod.rs

pub fn connect() {
}

mod server;

Filename: src/network/server.rs

pub fn connect() {
}

비공개 규칙(Privacy Rules)

종합해보면 아이템 가시성에 관한 규칙은 다음과 같습니다:

  1. 만일 어떤 아이템이 public이라면, 이는 부모 모듈의 어디서든 접근 가능합니다.
  2. 만일 어떤 아이템이 private이라면, 같은 파일 내에 있는 부모 모듈 및 부모의 자식 모듈에서만 접근 가능합니다.

1개의 댓글

comment-user-thumbnail
2022년 2월 15일

퍼갑니다

감사합니다

Rust 모듈 - pub 가시성 제어 -
https://economiceco.tistory.com/m/12437

답글 달기