모듈: 입문

모듈: 입문 (using-modules_introduction)

모듈이 뭔지, 어떻게 동작하는지를 다루는 문서예요.

참고: Raku에서 "모듈(Module)"이라는 단어는 의미가 여러 겹이에요. 이 문서는 module 선언자를 쓰는 경우에 집중해요.

모듈이란?

모듈은 클래스(class), 그램마(grammar)처럼 일종의 패키지(package)예요. 모듈 객체는 ModuleHOW 메타클래스의 인스턴스예요. 이 메타클래스는 네임스페이스 만들기, 버전 관리, 위임, 데이터 캡슐화에 유용한 특정 능력을 제공해요(class와 role도 참고하세요).

모듈을 만들려면 module 선언자를 쓰면 돼요:

module M {}
say M.HOW;   # OUTPUT: «Perl6::Metamodel::ModuleHOW.new␤»

여기서 M이라는 새 모듈을 정의했어요. HOW로 introspection하면 M을 뒷받침하는 메타클래스가 Perl6::Metamodel::ModuleHOW라는 걸 확인할 수 있어요.

모듈은 언제 쓸까

모듈은 주로 클래스나 role 정의 안에 들어가지 않는 코드와 데이터를 캡슐화하는 데 유용해요. 모듈 내용(클래스, 서브루틴, 변수 등)은 is export 트레이트로 모듈에서 내보낼 수 있고, 모듈을 importuse로 가져오면 호출자의 네임스페이스에서 사용할 수 있어요. 모듈은 our로 네임스페이스 안의 심볼을 선택적으로 노출해 정규화된 참조(qualified reference)를 가능하게 할 수도 있어요.

모듈 다루기

모듈의 스코프와 export 규칙을 살펴보기 위해 간단한 모듈 M을 정의해 볼게요:

module M {
  sub greeting ($name = 'Camelia') { "Greetings, $name!" }
  our sub loud-greeting (--> Str)  { greeting().uc       }
  sub friendly-greeting is export  { greeting('friend')  }
}

서브루틴은 특별히 지정하지 않으면 어휘 스코프(lexically scoped)예요(선언자 submy sub와 동등). 그래서 위 예의 greeting은 모듈에 어휘적으로 스코프가 정해져 모듈 밖에서는 접근할 수 없어요. our 선언자로 loud-greeting도 정의했는데, 이는 어휘 스코프일 뿐 아니라 모듈의 심볼 테이블에도 별칭이 생긴다는 뜻이에요. 마지막으로 friendly-greeting은 export용으로 표시됐는데, 모듈을 가져오면 호출자의 심볼 테이블에 등록돼요:

import M;               # import the module
say M::loud-greeting;   # OUTPUT: «GREETINGS, CAMELIA!␤»
say friendly-greeting;  # OUTPUT: «Greetings, friend!␤»

모듈 관련 문서

모듈을 배포하고 싶다면: