Functionable 모듈의 역할
extend Functionable 지시어는 Ruby 모듈 내에서 정의된 인스턴스 메서드들을 자동으로 모듈 메서드로 승격시키는 핵심적인 역할을 수행합니다. 일반적으로 Ruby에서 모듈 메서드를 정의하려면 self.method_name과 같이 self 접두사를 사용하거나 module_function 키워드를 활용해야 합니다. 하지만 Functionable을 확장하면, 마치 일반적인 인스턴스 메서드를 정의하듯이 def method_name으로 메서드를 선언해도 해당 메서드가 모듈 자체에서 직접 호출 가능한 형태로 변환됩니다. 이는 코드의 반복을 줄이고, 모듈 인터페이스를 더욱 간결하게 만듭니다.
일반적인 모듈 메서드 정의와의 비교
Ruby에서 모듈 메서드를 정의하는 전통적인 방식은 다음과 같습니다:
-
self.접두사 사용:ruby module MyModule def self.greet = "Hello" end MyModule.greet # => "Hello" -
module_function사용:ruby module MyModule def greet = "Hello" module_function :greet end MyModule.greet # => "Hello"Functionable을 사용하면 위와 같은 명시적인 작업 없이, 단순히extend Functionable만 추가하면 됩니다. 이는 특히 많은 수의 메서드를 모듈 메서드로 노출해야 할 때 코드의 가독성과 유지보수성을 크게 향상시킵니다.
예시 분석: Math 모듈
제공된 Math 모듈 예시는 Functionable의 활용법을 명확히 보여줍니다.
ruby
module Math
extend Functionable
def add(first, second) = first + second
def subtract(first, second) = first - second
def multiply(first, second) = first * second
def divide(first, second) = first / second
end
여기서 add, subtract, multiply, divide 메서드는 def 키워드로 정의되어 마치 인스턴스 메서드처럼 보입니다. 그러나 extend Functionable 덕분에 이들은 Math.add 6, 3, Math.subtract 6, 3과 같이 Math 모듈 객체에 직접 호출될 수 있는 모듈 메서드로 동작합니다. 이는 Math 모듈이 일련의 순수 함수를 캡슐화하는 함수형 스타일의 유틸리티 모듈로 기능하도록 만듭니다. 이러한 접근 방식은 특정 상태 없이 입력에 따라 항상 동일한 출력을 반환하는 함수들을 모아두기에 매우 적합합니다.