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 |