네임스페이스 (Namespaces)
네임스페이스 (Namespaces)
네임스페이스는 단순(비한정) 심볼에서 Var와/또는 Class로의 매핑이에요. 코드를 조직화하고 이름 충돌을 피하는 Clojure의 핵심 메커니즘으로, 일급 객체이자 런타임에 동적으로 바뀔 수 있어요. 공식 Reference 기준으로 정리할게요.
본문
네임스페이스는 단순(비한정) 심볼을 Var 및/또는 Class로 매핑해요. Var는 def나 그 변형을 사용해 네임스페이스에 intern될 수 있어요. 이때 Var는 이름으로 단순 심볼을 갖고 자기 네임스페이스에 대한 참조를 가지며, 네임스페이스는 그 심볼을 같은 Var에 매핑해요. 네임스페이스는 refer나 use로 다른 네임스페이스에 intern된 Var에 심볼을 매핑하거나, import로 심볼을 Class 객체에 매핑할 수도 있어요. 네임스페이스는 일급 객체이며 열거할 수 있고, 런타임·REPL에서 생성·제거·수정되는 동적인 존재예요.
Clojure 소스 파일 맨 위에서 새 네임스페이스를 설정하는 가장 좋은 방법은 ns 매크로를 쓰는 거예요. 기본적으로 java.lang의 클래스 이름과 clojure.lang.Compiler, 그리고 clojure.core의 함수들을 포함하는 매핑을 가진 새 네임스페이스를 만들어요.
REPL에서는 in-ns를 쓰는 게 좋아요. 이 경우 새 네임스페이스는 java.lang의 클래스 이름 매핑만 포함해요. clojure.core 네임스페이스의 이름에 접근하려면 (clojure.core/refer 'clojure.core)를 실행해야 해요. REPL의 user 네임스페이스는 이미 이 작업을 마친 상태예요.
현재 네임스페이스 *ns*는 in-ns나 ns 매크로 호출로만 설정하는 게 좋고, 그렇게 해야 해요 — 둘 다 네임스페이스가 없으면 만들기 때문이에요.
관련 함수
- 네임스페이스 생성·전환:
in-nsnscreate-ns - 네임스페이스에 추가:
aliasdefimportinternrefer - 존재하는 네임스페이스 찾기:
all-nsfind-ns - 네임스페이스 검사:
ns-namens-aliasesns-importsns-internsns-mapns-publicsns-refers - 심볼에서 네임스페이스 얻기:
resolvens-resolvenamespace - 제거:
ns-unaliasns-unmapremove-ns
더 알아보기
- Clojure Reference - Vars and Environments — 네임스페이스에 intern되는 Var
- Clojure Guides - Learn Clojure — 언어 학습 가이드
- Clojure API - clojure.core — 네임스페이스 함수 전체 목록