Ruby:Mixin
루비는 Class와 비슷한 Module 이라는 것을 가지고 있다. Module는 Class와 비슷하게 메소드, 상수, 모듈, 클래스를 포함할 수 있다. 그러나 Class와 달리 모듈을 상속받아서 객체를 생성할 수는 없다. 하지만 이 Module의 인스턴스 메소드를 클래스에서 사용할 수 있다. 이렇게 상속을 하지 않고도 여러개의 Class가 같은 Module을 mixin해서 사용하거나 여러개의 Module을 하나의 클래스에 mixin하여 사용할 수 있다.
Example
예제 코드는 Math와 Stringfy라는 두가지 Module를 가지고 있고, Number라는 클래스를 상속받아서 만든 BigInteger에 Mixin을 해서 객체에 모듈의 메소드를 추가하는 예제이다.
Math 모듈은 add라는 메소드를 가지고 있는데 두 수를 더하는 값을 BigInteger에 초기 값으로 넘겨주는 메소드이다.
# filename : Math.rb
module Math
def add(value_one, value_two)
BigInteger.new(value_one+value_two)
end
end
Stringfy 모듈은 stringfy라는 메소드를 가지고 있는데 @value라는 객체 변수의 값에 따라서 문자열을 반환해주는 메소드이다.
#filename : Stringfy.rb
module Stringfy
def stringfy
if @value == 1
"One"
elsif @value == 2
"Two"
elsif @value == 3
"Three"
end
end
end
Number 클래스는 inteValue라는 메소드를 가지고 있는데 이것은 @value객체를 반환하는 메소드이다.
위의 Number 클래스를 상속해서 BigInteger 클래스를 만드는데 이 클래스에 Stringfy를 mixin하고 Math 메소드를 확장했다.
#filename : BigInteger.rb
require 'Stringfy'
require 'Math'
require 'Number'
class BigInteger < Number
include Stringfy
extend Math
def initialize(value)
@value = value
end
end
테스트를 해보자. 아래 코드는 단순하게 BigInteger를 사용해서 생성자에 10이라는 값을 넣고 객체를 생성해서 Number가 가지고 있었던 intValue로@value객체 변수의 값을 출력하는 코드이다.