[루비 사용자 가이드] 모듈

루비/레일스 프로그래밍/루비 사용자 가이드 2007.05.24 03:26

루비의 모듈은 클래스와 비슷합니다. 다른 부분은 아래와 같습니다:

  • 모듈의 인스턴스를 만들 수 없다.
  • 모듈의 하위 클래스를 만들 수 없다.
  • 모듈은 module ... end라는 키워드를 사용해 만들어진다.

실제로 모듈의 클래스인 Module은 클래스의 클래스인 Class의 상위 클래스입니다. 이해가 되시나요? 모르겠다고요? 계속 진행해 봅시다.

모듈의 전형적인 사용 방법은 두 가지입니다. 하나는 관련있는 상수와 메소드를 한 군데로 집중시켜 모아놓는 것입니다. 루비 표준 라이브러리의 Math 모듈이 그런 역할을 하고 있지요:

ruby> Math.sqrt(2)
   1.41421
ruby> Math::PI
   3.14159

:: 연산자는 루비 인터프리터에게 어떤 모듈에서 상수의 값을 참조할지를 말해줍니다(다른 모듈에서 PI라는 이름으로 다른 것을 가리키는 경우도 상상할 수 있습니다). 만약 우리가 어떤 모듈의 상수나 메소드를 :: 없이 직접 사용하기 바란다면, 그 모듈을 include 시키면 됩니다:

ruby> include Math
   Object
ruby> sqrt(2)
   1.41421
ruby> PI
   3.14159

모듈의 다른 사용 방법은 혼합(mixin)입니다. C++을 포함하는 몇몇 객체지향 언어에서는 다중 상속(multiple inheritance)을 지원합니다. 즉 상위 클래스가 둘 이상 있을 수 있다는 것이죠. 실제 세계에서 다중 상속의 예를 들어보자면 alarm clock(알람 시계)를 들 수 있습니다. 알람 시계는 시계(clocks) 클래스에 속하는 동시에 부저를 포함하는 물건(things with buzzers)에도 속합니다.

루비는 의도적으로 진정한 다중 상속을 구현하지 않았습니다. 다중상속에 대해서는 혼합(mixin) 기술이 훌륭한 대안입니다. 모듈이 인스턴스화 되거나 상속될 수 없다는 것을 기억하십시오. 그렇지만 우리가 클래스 정의에서 어떤 모듈을 include 하면, 그 모듈의 메소드가 실질적으로 그 클래스에 추가-혹은 "혼합"-됩니다.

혼합은 클래스에 부여하고 싶은 상세한 특징을 요청하는 방법이라고 생각할 수 있습니다. 예를 들어 만약 어떤 클래스가 잘 동작하는 each 메소드를 포함하고 있다면, 표준 라이브러리의 Enumerable 모듈을 혼합하면 자동으로 sortfind와 같은 메소드를 사용할 수 있게 됩니다.

이렇게 모듈을 사용함으로써, 다중 상속의 기본적인 기능을 제공하면서 클래스의 상속 관계는 단순한 트리 구조로 가져갈 수 있고, 그에 따라 언어의 구현을 굉장히 많이 단순하게 할 수 있습니다(자바의 설계자들도 비슷한 선택을 했습니다).

Trackbacks 0 : Comments 0