extend self는 Ruby 모듈의 인스턴스 메서드를 모듈 자체에서 직접 호출할 수 있도록 만드는 핵심적인 역할을 합니다.
extend self의 작동 방식
-
모듈 내부에
extend self를 선언하면, 해당 모듈에 정의된 모든def메서드는 모듈의 인스턴스 메서드가 아닌, 모듈 자체의 메서드로 동작합니다. -
이는
MyModule.my_method와 같이 모듈 이름을 통해 직접 메서드를 호출할 수 있음을 의미하며, 별도의include나extend없이 유틸리티 기능을 제공할 수 있습니다.
예시: CurrencyFormatter 모듈
영상의 예시에서는 CurrencyFormatter 모듈을 통해 통화 형식 지정 기능을 구현합니다.
```ruby
module CurrencyFormatter
extend self
@default_currency = “USD” # 모듈 레벨 인스턴스 변수
def format(amount, currency = @default_currency) “#{currency} %.2f” % amount # 금액을 두 자리 소수점으로 포맷 end # … format_list 메서드도 유사하게 정의 end ```
-
extend self덕분에CurrencyFormatter.format(12.5)와 같이 모듈 이름을 통해format메서드를 직접 호출할 수 있습니다. -
@default_currency와 같은 모듈 레벨 인스턴스 변수를 사용하여 모듈의 기본 상태를 유지할 수 있습니다.
모듈 설정 변경: attr_accessor 활용
모듈의 기본 설정을 동적으로 변경해야 할 경우, attr_accessor를 활용하여 모듈 레벨의 인스턴스 변수에 대한 접근자를 노출할 수 있습니다.
ruby
module CurrencyFormatter
extend self
attr_accessor :default_currency # 접근자 추가
@default_currency = "USD"
# ...
end
# 외부에서 기본 통화 변경 가능:
CurrencyFormatter.default_currency = "EUR"
attr_accessor :default_currency를 추가함으로써,CurrencyFormatter.default_currency = "EUR"와 같이 모듈의 상태를 외부에서 쉽게 변경할 수 있습니다.
활용 사례
extend self는 특정 클래스의 인스턴스화가 필요 없는 유틸리티성 메서드 그룹을 모듈로 구성할 때 매우 유용합니다. 수학 계산, 문자열 처리, 데이터 검증 등 상태를 크게 가지지 않으면서 독립적인 기능을 제공하는 모듈에 적합합니다.