경로와 use 문

경로와 use 문

네임스페이스(namepsace)

네임스페이스(namepsace)는 타입이나 아이템 등을 논리적으로 그룹화하는데 사용된다. 예를 들어, 동일한 이름의 함수가 서로 다른 모듈에 있을 경우, 함수의 이름은 같을지라도 논리적인 그룹이 다르므로 다른 함수로 취급할 수 있게 한다. 네임스페이스는 Rust의 여러 부분에 걸쳐 사용되는데, 네임스페이스를 통해 타입이나 모듈들을 계층적으로 조직화할 수 있다.

네임스페이스는 :: (namespace qualifier)를 사용하여 경로(path)로 표현할 수 있다. 예를 들어, 아래 예제는 모듈 네임스페이스의 한 예인데, 여기서 seattle 모듈의 trip 함수의 경로는 usa::washington::seattle::trip 와 같이 된다.

pub mod usa {
    pub mod washington {
        pub mod seattle {
            pub fn trip() {
                println!("seattle trip");
            }
        }
    }
}

fn main() {
    // 긴 경로 사용
    usa::washington::seattle::trip();
}

경로(path)와 use 문

use 문은 긴 네임스페이스 경로의 이름을 간결하게 사용하도록 하기 위해 사용된다. 위의 예제에서 trip 함수를 호출하기 위해 usa::washington::seattle::trip()와 같이 긴 경로를 사용하였는데, 이를 여러 번 호출한다면 전체 경로를 모두 써주어야 하므로 불편할 것이다. 아래 예제는 "use usa::washington::seattle;"를 사용하여 모듈을 가져오게 하고, seattle 모듈에서 seattle::trip()과 같이 함수를 호출할 수 있게 한 것이다.

use usa::washington::seattle;

fn main() {
    // 간결한 표현    
    seattle::trip();
}

만약 어떤 네임스페이스 내의 타입이나 모듈을 별도의 alias로 사용하기 위해서는 use ... as 표현을 사용할 수 있다. 예를 들어, 아래 예제는 usa::washington::seattle을 s 라는 별명(alias)로 사용하는 예이다.

use usa::washington::seattle as s;

fn main() {  
    s::trip();
}

또한, 만약 trip() 함수를 직접 사용하고 싶으면, 아래와 같이 usa::washington::seattle::trip 전체를 use 문에서 지정할 수 있다.

use usa::washington::seattle::trip;

fn main() {  
    trip();
}

모듈이나 모듈 아이템에서 다른 모듈을 가리키기 위해서 아래와 같은 키워드를 사용할 수 있는데, 이는 상대적 혹은 절대적인 위치를 찾기 위해 유용하다.

self 현재 모듈 self::bar() 현재 모듈의 bar() 함수
super 현재 모듈의 부모 모듈 super::super::bar() 현재 모듈의 부모의 부모에 있는 bar() 함수
crate 현재 Crate의 루트 crate::foo::bar() 현재 Crate의 절대 경로 /foo/bar()

아래 예제는 super와 crate를 사용하여 모듈 경로를 찾아 내는 것을 표현한 것이다.

mod usa {
    pub mod washington {
        pub mod seattle {
            pub fn trip() {
                super::visit();
                println!("seattle trip");                
            }
        }

        fn visit(){
            crate::usa::washington::init();
            println!("Mt. Rainier");
        }

        fn init() {}
    }
}

This site is not affiliated with or endorsed by the Rust Foundation or Rust Project.