Skip to content

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객체를 반환하는 메소드이다.

# filename : Number.rb

class Number  
  def intValue
    @value
  end
end  

위의 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객체 변수의 값을 출력하는 코드이다.

#filename test.rb
require 'BigInteger'

bigint1 = BigInteger.new(10)  
puts bigint1.intValue  

See also

Favorite site