타나기
타나기 월드
타나기
전체 방문자
오늘
어제
  • 분류 전체보기 (90)
    • ⚙️ Rust (20)
      • 👀 Tutorial (20)
    • 🗿 Embedded (11)
      • 🐧 OS for ARM (11)
    • 💻 Study (37)
      • 🧩 알고리즘 (37)
    • 🏄🏽‍♂️ Life (21)
      • 🍚 타나구루망 (20)
      • 💡 Light (1)

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
타나기

타나기 월드

⚙️ Rust/👀 Tutorial

[Rust / 튜토리얼] 18. 러스트의 public 과 private

2022. 6. 15. 00:23

pub으로 가시성 제어하지

이전 글에서 network 와 network::server 코드를 파일별로 나누어 작성했다. 그리고 cargo build로 빌드 또한 되는 것을 확인 했다. 그럼 이제 모든게 끝난 것일까? 우리는 다른 파일의 어딘가에서 해당 모듈들을 사용 할 수 있을까? 답은 아니다. 우선 빌드할 때 출력되는 경고 메시지들을 확인해보자.

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

warning: function is never used: `connect`
 --> src/client.rs:2:8
  |
2 |     fn connect() {
  |        ^^^^^^^

warning: function is never used: `connect`
 --> src/network/server.rs:2:8
  |
2 |     fn connect() {
  |        ^^^^^^^

warning: `communicator` (lib) generated 3 warnings
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
juneun@seunghyeui-MacBook-Pro src % 

경고문을 보면 never used 메소드가 사용되지 않았다는 메세지를 출력해 준다. 이는 아직 어디에서도 해당 메소드가 사용된 적이 없으므로 당연한 것이다. 그럼 이 경고문을 없애버리기 위해 메소드를 사용해 보자. main.rs를 새로 생성하고 main()를 만들어 호출해 보자.

src/main.rs

extern crate communicator;

fn main() {
    communicator::client::connect();
    println!("TEST");
}
warning: `communicator` (lib) generated 3 warnings
   Compiling communicator v0.1.0 (/Users/juneun/Documents/source/rust/communicator)
error[E0425]: cannot find function `connect` in `communicator::client`
 --> src/main.rs:4:27
  |
4 |     communicator::client::connect();
  |                           ^^^^^^^ not found in `communicator::client`

error[E0603]: module `client` is private
 --> src/main.rs:4:19
  |
4 |     communicator::client::connect();
  |                   ^^^^^^ private module
  |
note: the module `client` is defined here
 --> /Users/juneun/Documents/source/rust/communicator/src/lib.rs:1:1
  |
1 | mod client;
  | ^^^^^^^^^^^

Some errors have detailed explanations: E0425, E0603.
For more information about an error, try `rustc --explain E0425`.
error: could not compile `communicator` due to 2 previous errors

main.rs 파일은 lib.rs와 같은 경로인 src/에 작성되었다. 이는 binary crate와 library crate가 같이 존재 하는 것을 의미한다. 이렇게 작성하면 라이브러리도 만들 수 있고, 그 라이브러리를 실행할 수도 있다. 이런 패턴은 많은 프로젝트에서 이용된다.

 

외부의 crate를 사용하기 위해선 extern crate를 사용하면 된다. 그래서 코드의 꼭대기에 extern crate communicator를 적어 줌으로써 우리가 외부 crate를 사용할 수 있게 된다. 그런데 주의할 점은 client나 netowrk가 아닌, 프로젝트 이름인 communicator를 사용했다는 점이다. main이 이미 프로젝트 내부에 있지만 프로젝트로 모듈에 접근해야 한다.

 

하지만 야속하게도 빌드에러가 발생 하는데, client 모듈이 private 이기 때문에 사용할 수 없다고 한다. 이상하기 그지없다. 우리는 모듈에 private 임을 명시해 주지 않았는데, 컴파일러가 private으로 마음대로 생각중이다. 그렇다. 바로 그것이 문제점이다. 우리는 해당 모듈이 private인지 public인지 명시하지 않았다. 러스트는 이렇게 명시해 주지 않은 경우 private으로 간주하고 컴파일 하기 때문에, 코드에서 오류가 발생했다.

private은 모듈이 외부에서 호출이 불가능하고 내부에서만 사용 가능하다는 의미이고, public은 해당 모듈을 외부에서 얼마든지 호출할 수 있다는 의미이다. 그럼 이제 public으로 만들어 보자.

함수를 public으로 만들기

public 으로 만드는건 매우 간단하다. pub 키워드를 앞에 붙여주면 된다. 자 이제 모든 메소드와 모듈 앞에 pub를 붙여주면 에러가 모두 없어진다.

src/lib.rs

pub mod client;
pub mod network;

src/network/mod.rs

pub fn connect() {
}

pub mod server;

src/network/server.rs

pub fn connect() {

}

src/client.rs

pub fn connect() {
    println!("Client connect!");
}

그리고 빌드하면 짜잔.

    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `/Users/juneun/Documents/source/rust/communicator/target/debug/communicator`
Client connect!

아무런 에러 없이 빌드된다!

private 예제

그럼 private는 언제 쓰는걸까? 그건 바로 모듈에서 외부로 공개하고 싶지 않은 메소드를 지정할 때이다. 누구에게나 감추고 싶은 과거가 있는 것처럼 모듈도 공개하고 싶지 않은 민감한 정보를 가진 메소드가 있을 수 있다. 바로 그럴 때 private 으로 설정하면 된다. 예시를 보고 공부를 더 해 보자.

mod outermost {
    pub fn middle_function() {}

    fn middle_secret_function() {}

    mod inside {
        pub fn inner_function() {}

        fn secret_function() {}
    }
}

fn try_me() {
    outermost::middle_function();
    outermost::middle_secret_function();
    outermost::inside::inner_function();
    outermost::inside::secret_function();
}
  • outermost::middle_secret_function()
    • private 이므로 에러 발생
  • outermost::inside::inner_function()
  • outermost::inside::secret_function()
    • 위 두개 모두 inside가 private이므로 에러 발생

주저리 주저리 썼지만, 어쨌든 외부에서 접근하기 위해선 pub 키워드만 붙여주면 된다. 그리고 안쪽 깊숙히 존재하는 모듈이나 메소드가 pub 일지라도, 상위 모듈이나 메소드가 private이면 접근이 불가능 한 것을 항상 염두해 두자.

다음으로 use 키워드를 사용하는 법을 알아보자.

저작자표시 (새창열림)

'⚙️ Rust > 👀 Tutorial' 카테고리의 다른 글

[Rust / 튜토리얼] 20. 러스트에서 벡터 (vector) 사용하기  (0) 2022.06.27
[Rust / 튜토리얼] 19. 러스트의 use. super의 사용  (0) 2022.06.22
[Rust / 튜토리얼] 17. 러스트의 모듈 (mod)  (0) 2022.06.13
[Rust / 튜토리얼] 16. 러스트의 let if 의 사용법  (0) 2022.06.08
[Rust / 튜토리얼] 15. 러스트에서 match 를 이용한 분기.  (0) 2022.06.06
    '⚙️ Rust/👀 Tutorial' 카테고리의 다른 글
    • [Rust / 튜토리얼] 20. 러스트에서 벡터 (vector) 사용하기
    • [Rust / 튜토리얼] 19. 러스트의 use. super의 사용
    • [Rust / 튜토리얼] 17. 러스트의 모듈 (mod)
    • [Rust / 튜토리얼] 16. 러스트의 let if 의 사용법
    타나기
    타나기
    #include<all>

    티스토리툴바