네임스페이스 (Namespaces)

네임스페이스 (Namespaces)

네임스페이스는 단순(비한정) 심볼에서 Var와/또는 Class로의 매핑이에요. 코드를 조직화하고 이름 충돌을 피하는 Clojure의 핵심 메커니즘으로, 일급 객체이자 런타임에 동적으로 바뀔 수 있어요. 공식 Reference 기준으로 정리할게요.

출처: Clojure Reference - Namespaces

본문

네임스페이스는 단순(비한정) 심볼을 Var 및/또는 Class로 매핑해요. Var는 def나 그 변형을 사용해 네임스페이스에 intern될 수 있어요. 이때 Var는 이름으로 단순 심볼을 갖고 자기 네임스페이스에 대한 참조를 가지며, 네임스페이스는 그 심볼을 같은 Var에 매핑해요. 네임스페이스는 referuse다른 네임스페이스에 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-nsns 매크로 호출로만 설정하는 게 좋고, 그렇게 해야 해요 — 둘 다 네임스페이스가 없으면 만들기 때문이에요.

관련 함수

  • 네임스페이스 생성·전환: in-ns ns create-ns
  • 네임스페이스에 추가: alias def import intern refer
  • 존재하는 네임스페이스 찾기: all-ns find-ns
  • 네임스페이스 검사: ns-name ns-aliases ns-imports ns-interns ns-map ns-publics ns-refers
  • 심볼에서 네임스페이스 얻기: resolve ns-resolve namespace
  • 제거: ns-unalias ns-unmap remove-ns

더 알아보기