본문 바로가기

.Tip

[Ruby] Module 활용

참고] Programming Ruby - 2nd , Chapter 9.Modules

==========================================================================

Module 은 여러 Method, Class, Constant들을 그룹핑 해준다.

두가지 이점이 있는데

1. Module은 'Namespace'을 제공하고, 이들간의 충돌을 막는다.

2. Mixin 을 구현할 수 있다. (뒤에 설명)

 

## Namespaces

큰 Ruby Program이 있을때, 자연스레 재사용코드 단위들을 묶으려 할 것이다.

이를 클래스별로, 파일들에 나눌 것이다.

하지만, 재사용코드라 해서 Class로 구분짓는 행위가 부자연스러울때가 있다.

....

Module 메카니즘에서, Module은 "Namespace"을 정의한다.

다음은 Module "Trig"와 "Moral"을 정의한 것이다.

image image

모듈은 Class Constant와 비슷한 형태의 이름을 갖는다.(첫글자는 대문자)

또한 Method 정의 & 사용 또한 비슷하다.

Third program에서 이 모듈들을 사용할때는 다음과 같다.

image

Module 이름과 두 콜론으로 Constant 참조가능하다.

 

## Mixin

Module의 Mixin을 통하여, 다중상속(multiple inheritance)에 대한 필요성을 대체할 수 있다.

원래 Module은 Class가 아니기 때문에, Instance을 가질 수 없다.

하지만, Class 정의 내에서 module을 포함시킬 수 있다.

이런 경우에는, 모듈의 모든 Instance method는 Class 내의 method처럼 동작한다.

(이를 Mixed in 되었다 한다, minxed-in module은 superclass라 보는게 편하다)

image

Class 'Phonograph'와 'EightTrack' 안에 "Debug" Module을 include했다.

따라서, 이 두 Class는 Debug모듈의 'who_am_i'라는 instance 메서드을 사용할 수가 있다.

즉. 다음처럼 사용이 가능하다.

image

[참고]

1.  C에서 Include는 해당 파일의 내용들을 넣는 것이지만,

  Ruby에서의 Include는 단지 'Named module'을 참조하는 역할만 한다.

  Module이 다른 파일에 있다면, 'include'이전에 'require'를 필요로 한다.

2. 위에서 Module을 참조하기만 하기 때문에,

  프로그램 동작중에 Module안의 method를 바꾸면, 바로 적용이 된다