4. use 사용하기
모듈에 포함된 자식 모듈이나 함수를 사용할 때는 “::” 기호를 사용합니다.
다음과 같은 모듈 구조를 가지고 있다고 가정하겠습니다.
mod first {
pub mod second {
pub mod third {
pub fn do_something() {
println!("do something!");
}
}
}
}
이 모듈 구조를 사용해 보겠습니다.
fn main(){
first::second::third::do_something();
}
그런데 사용할 때마다 매번 이런 식으로 장황하게 사용해야 한다면 무척 번거로울 것입니다.
이 과정을 단축시켜 주는 키워드가 “use”입니다.
위의 코드를 “use”를 사용해서 간단하게 사용해보겠습니다.
use first::second::third;
fn ,ain(){
third::do_something();
}
만약 third도 귀찮아서 그냥 함수 이름만 사용하고 싶다면 다음처럼 사용합니다.
use first::second::third::do_something;
fn ,ain(){
do_something();
}
모듈의 경로에 별명을 붙일 수도 있습니다.
이때는 “as” 키워드를 사용합니다.
use first::second::third as Hi;
fn ,ain(){
Hi::do_something();
}
first::second::third 경로에 Hi라는 별명을 붙였습니다.
하나의 모듈 경로 아래에 사용할 함수나 모듈이 둘 이상이라면 다음과 같이 브레이스로 묶어 줍니다.
use http::{Request, Method};
fn main() {
}
권장하지는 않지만 *도 사용할 수 있습니다.
해당 위치에 있는 모든 것을 가져오겠다는 의미입니다.
use http::*;
fn main() {
...
}
이 방법은 네임스페이스에 혼란을 줄 가능성이 있어서 권장되는 방법은 아닙니다.
참고로, 초보자들이 의외로 헷갈려하는 부분에 대해서 언급하고 넘어가겠습니다.
use 키워드는 Python의 import 키워드와는 기능이 다릅니다.
use 키워드는 장황한 모듈의 네임 스페이스 표현을 간단히 단축하기 위해 사용합니다.
고급진 표현으로는 모듈을 네임스페이스로 불러옵니다.
Python의 import 키워드는 이와 비슷한 역할을 하기도 하지만 주기능은 사용하고자 하는 라이브러리의 기능을 메모리에 불러오는 것입니다.
그래서 tensor flow처럼 부피가 큰 라이브러리를 불러오는 데는 약간의 시간이 걸리기도 합니다.
Rust에서 라이브러리는 크레이트입니다.
크레이트를 사용하기 위해서 Python처럼 import 하지 않아도 됩니다.
또 C/C++처럼 main() 함수 위에 헤더 파일을 명시하지 않아도 됩니다.
이런 작업은 Cargo.toml 파일에서 합니다.
사용하려는 크레이트를 Cargo.toml에 명시하고 빌드하거나 프로젝트 루트 디렉토리에서 cargo add ~ 명령어를 사용하면 프로젝트에서 사용할 수 있습니다.
use 키워드는 크레이트를 임포트 하는 명령어가 아닙니다.
그래서 use 키워드를 사용하지 않아도 모듈을 사용 할 수 있습니다.
다만 긴 네임스페이스 때문에 때때로 귀찮을 뿐입니다.
다음 코드를 보겠습니다. 양의 정수에서 난수를 뽑는 코드입니다.
fn main() {
let r = rand::random::<u8>();
println!("{}", r);
}
// 출력
32
이 코드에는 use 키워드를 사용 하지 않았습니다.
그럼에도 불구하고 rand 크레이트를 불러와서 rand 모듈의 random 함수를 사용했습니다.
rand 크레이트는 Cargo.toml에서 처리됩니다.
// Cargo.toml
...
[dependencies]
rand = “0.8.5"
그러면 똑같은 코드에 use 키워드를 사용해 보겠습니다.
use rand::random;
fn main() {
let r = random::<u8>();
println!("{}", r);
}
use 덕분에 rand::random 대신 간단하게 random만 사용할 수 있습니다.
'Rust 입문' 카테고리의 다른 글
[Rust] Trait (0) | 2022.10.13 |
---|---|
[Rust] Generic (0) | 2022.10.12 |
[Rust] super (1) | 2022.10.11 |
[Rust] 모듈 (파일) (0) | 2022.10.11 |
[Rust] 모듈 (0) | 2022.10.11 |