Module

Module

Module은 메서드와 상수의 모음이에요. 모듈 안의 메서드는 인스턴스 메서드일 수도 있고 모듈 메서드일 수도 있어요. 인스턴스 메서드는 모듈이 include될 때 클래스의 메서드로 나타나지만, 모듈 메서드는 그렇게 나타나지 않아요. 반대로 모듈 메서드는 캡슐화하는 객체를 만들지 않고도 호출할 수 있지만, 인스턴스 메서드는 그럴 수 없어요. (Module#module_function 참고.)

module Mod
  include Math
  CONST = 1
  def meth
    # ...
  end
end

Mod.class            #=> Module
Mod.constants        #=> [:CONST, :PI, :E]
Mod.instance_methods #=> [:meth]

출처: Ruby 4.0 API

본문

아래 설명들에서 인자 sym은 심볼을 가리켜요. 따옴표로 감싼 문자열이거나 Symbol(예: :name)이에요.

Public Class Methods

constants → array
constants(inherited) → array

첫 번째 형태는 호출 시점에서 접근 가능한 모든 상수의 이름 배열을 돌려줘요. 전역 스코프에 정의된 모든 모듈·클래스 이름도 포함돼요.

Module.constants.first(4)
# => [:ARGF, :ARGV, :ArgumentError, :Array]

Module.constants.include?(:SEEK_SET)   # => false

class IO
  Module.constants.include?(:SEEK_SET) # => true
end

두 번째 형태는 인스턴스 메서드 constants를 호출해요.

nesting → array

호출 지점에 중첩된 Module 목록을 돌려줘요.

module M1
  module M2
    $a = Module.nesting
  end
end
$a          #=> [M1::M2, M1]
$a[0].name  #=> "M1::M2"
new → mod
new {|mod| block } → mod

새 익명 모듈을 만들어요. 블록이 주어지면 모듈 객체가 넘겨지고, 그 블록은 module_eval처럼 이 모듈의 문맥에서 평가돼요.

fred = Module.new do
  def meth1
    "hello"
  end
  def meth2
    "bye"
  end
end
a = "my string"
a.extend(fred)  #=> "my string"
a.meth1         #=> "hello"
a.meth2         #=> "bye"

일반 모듈처럼 취급하고 싶다면 모듈을 상수(대문자 시작 이름)에 할당하세요.

used_modules → array

현재 스코프에서 사용된 모든 모듈의 배열을 돌려줘요. 배열의 순서는 정의되지 않았어요.

used_refinements → array

현재 스코프에서 사용된 모든 refinement의 배열을 돌려줘요. 순서는 정의되지 않았어요.

Public Instance Methods

self < other → true, false, or nil

selfother의 서브클래스인지 여부를 돌려줘요. 둘 사이에 관계가 없으면 nil이에요.

Float < Numeric # => true
Numeric < Float # => false
Float < Float   # => false
Float < Hash    # => nil
mod <= other → true, false, or nil

modother의 서브클래스이거나 같으면 true를 돌려줘요. 관계가 없으면 nil. "클래스 정의 관점에서 생각해 보세요. class A < BA < B를 뜻해요."

self <=> other → -1, 0, 1, or nil

selfother를 비교해요. selfother를 include하거나 other의 서브클래스면 -1, 둘이 같으면 0, otherself를 include하거나 self의 서브클래스면 1, 그 외엔 nil을 돌려줘요.

# Class Array includes module Enumerable.
  Array <=> Enumerable # => -1
Enumerable <=> Enumerable # =>  0
Enumerable <=> Array      # =>  1
# Class File is a subclass of class IO.
  File <=> IO         # => -1
  File <=> File       # =>  0
    IO <=> File       # =>  1
# Class File has no relationship to class String.
  File <=> String     # => nil
obj == other → true or false
equal?(other) → true or false
eql?(other) → true or false

동등성(Equality) — Object 수준에서 ==objother가 같은 객체일 때만 true를 돌려줘요. 보통 서브클래스에서 클래스 고유의 의미를 주도록 재정의해요. ==와 달리 equal?은 객체 정체성(identity)을 판별하므로 서브클래스에서 재정의하면 안 돼요.

obj = "a"
other = obj.dup

obj == other      #=> true
obj.equal? other  #=> false
obj.equal? obj    #=> true

eql?objother가 같은 해시 키를 가리킬 때 true를 돌려줘요. Hash가 멤버 동등성을 검사할 때 써요. eql?true인 어떤 객체 쌍이든 둘의 hash 값은 같아야 해요. 그래서 eql?를 재정의하면 hash도 적절히 재정의해야 해요. Object 클래스의 객체에서 eql?==과 동의어예요. Numeric 같은 예외도 있는데, ==에서는 타입 변환을 하지만 eql?에서는 하지 않아요.

1 == 1.0    #=> true
1.eql? 1.0  #=> false
mod === obj → true or false

Case Equality — objmod의 인스턴스이거나 mod의 하위(descendant) 인스턴스면 true를 돌려줘요. case 문에서 객체를 클래스별로 분류할 때 쓸 수 있어요.

mod > other → true, false, or nil

modother의 조상(ancestor)이면 true, 같거나 하위면 false, 관계 없으면 nil.

mod >= other → true, false, or nil

modother의 조상이거나 두 모듈이 같으면 true, 관계 없으면 nil.

alias_method(new_name, old_name) → symbol

old_name 메서드의 새 복사본 new_name을 만들어요. 재정의되는 메서드에 대한 접근을 유지할 때 쓸 수 있어요.

module Mod
  alias_method :orig_exit, :exit #=> :orig_exit
  def exit(code=0)
    puts "Exiting with code #{code}"
    orig_exit(code)
  end
end
include Mod
exit(99)
# Exiting with code 99
ancestors → array

mod에 include/prepend된 모듈 목록(mod 자신 포함)을 돌려줘요.

module Mod
  include Math
  include Comparable
  prepend Enumerable
end

Mod.ancestors        #=> [Enumerable, Mod, Comparable, Math]
attr(name, ...) → array
attr(name, true) → array
attr(name, false) → array

첫 형태는 attr_reader와 같아요. 두 번째 형태는 attr_accessor(name)과 같지만 deprecated예요. 마지막 형태는 attr_reader(name)과 같지만 deprecated예요. 정의된 메서드 이름들을 심볼 배열로 돌려줘요.

attr_accessor(symbol, ...) → array
attr_accessor(string, ...) → array

이 모듈에 이름이 붙은 속성을 정의해요. 인스턴스 변수(@name)와 그것을 읽는 접근 메서드를 만들고, 값을 세팅하는 name= 메서드도 만들어요. String 인자는 심볼로 변환돼요. 정의된 메서드 이름 배열을 돌려줘요.

module Mod
  attr_accessor(:one, :two) #=> [:one, :one=, :two, :two=]
end
Mod.instance_methods.sort  #=> [:one, :one=, :two, :two=]
attr_reader(symbol, ...) → array
attr(symbol, ...) → array
attr_reader(string, ...) → array
attr(string, ...) → array

각 인스턴스 변수의 값을 돌려주는 인스턴스 변수와 대응 메서드를 만들어요. 각 이름에 대해 attr :name을 호출하는 것과 같아요. String 인자는 심볼로 변환돼요.

attr_writer(symbol, ...) → array
attr_writer(string, ...) → array

symbol.id2name이라는 속성에 값을 할당하게 해주는 접근 메서드를 만들어요. String 인자는 심볼로 변환돼요.

autoload(const, filename) → nil

mod의 네임스페이스에서 const(문자열 또는 심볼)를 처음 접근할 때 filename을 로드하도록(내부적으로 Kernel::require 사용) 등록해요.

module A
end
A.autoload(:B, "b")
A::B.doit  # autoloads "b"

const가 autoload로 정의돼 있으면 로드할 파일 이름이 filename으로 교체돼요. autoload가 아닌 상수로 정의돼 있으면 아무것도 하지 않아요. 현재 로드 중인 파일은 autoload로 등록하면 안 돼요.

autoload?(name, inherit=true) → String or nil

namemod 또는 그 조상의 네임스페이스에 autoload로 등록돼 있으면 로드할 파일 이름을 돌려줘요.

module A
end
A.autoload(:B, "b")
A.autoload?(:B)  #=> "b"

inheritfalse면 리시버 자신의 autoload만 검사해요.

class_eval(string [, filename [, lineno]]) → obj
class_eval {|mod| block } → obj

mod의 문맥에서 문자열 또는 블록을 평가해요. 블록이 주어질 때는 상수/클래스 변수 조회에 영향이 없어요. 클래스에 메서드를 추가할 때 쓸 수 있어요. module_eval은 인자를 평가한 결과를 돌려줘요. 선택적 filenamelineno는 오류 메시지의 텍스트를 설정해요.

class Thing
end
a = %q{def hello() "Hello there!" end}
Thing.module_eval(a)
puts Thing.new.hello()
Thing.module_eval("invalid code", "dummy", 123)
# Hello there!
# dummy:123:in `module_eval': undefined local variable
#     or method `code' for Thing:Class

module_eval의 별칭이에요.

class_exec(arg...) {|var...| block } → obj

주어진 블록을 클래스/모듈의 문맥에서 평가해요. 블록에서 정의한 메서드는 리시버에 속해요. 메서드에 넘긴 인자는 블록에 전달돼요. 블록이 인스턴스 변수에 접근해야 할 때 유용해요.

class Thing
end
Thing.class_exec{
  def hello() "Hello there!" end
}
puts Thing.new.hello()
# Hello there!

module_exec의 별칭이에요.

class_variable_defined?(symbol) → true or false
class_variable_defined?(string) → true or false

obj에 주어진 클래스 변수가 정의돼 있으면 true를 돌려줘요. String 인자는 심볼로 변환돼요.

class Fred
  @@foo = 99
end
Fred.class_variable_defined?(:@@foo)  #=> true
Fred.class_variable_defined?(:@@bar)  #=> false
class_variable_get(symbol) → obj
class_variable_get(string) → obj

주어진 클래스 변수의 값을 돌려줘요(없으면 NameError). 일반 클래스 변수는 이름에 @@ 부분을 포함해야 해요. String 인자는 심볼로 변환돼요.

class Fred
  @@foo = 99
end
Fred.class_variable_get(:@@foo)  #=> 99
class_variable_set(symbol, obj) → obj
class_variable_set(string, obj) → obj

symbol이름의 클래스 변수를 주어진 객체로 설정해요. 문자열로 넘기면 심볼로 변환돼요.

class Fred
  @@foo = 99
  def foo
    @@foo
  end
end
Fred.class_variable_set(:@@foo, 101)  #=> 101
Fred.new.foo                          #=> 101
class_variables(inherit=true) → array

mod의 클래스 변수 이름 배열을 돌려줘요. inheritfalse가 아니면 include된 모듈의 클래스 변수 이름도 포함돼요.

class One
  @@var1 = 1
end
class Two < One
  @@var2 = 2
end
One.class_variables        #=> [:@@var1]
Two.class_variables        #=> [:@@var2, :@@var1]
Two.class_variables(false) #=> [:@@var2]
const_defined?(sym, inherit=true) → true or false
const_defined?(str, inherit=true) → true or false

mod나 그 조상이 주어진 이름의 상수를 갖고 있는지 말해줘요.

Float.const_defined?(:EPSILON)    #=> true, found in Float itself
Float.const_defined?("String")    #=> true, found in Object (ancestor)
BasicObject.const_defined?(:Hash) #=> false

modModule이면 추가로 Object와 그 조상도 검사해요. 각 검사 대상에서 상수가 없는데 autoload가 있으면 실제로 autoload하지 않고 바로 true를 돌려줘요. 상수를 못 찾으면 const_missing 콜백은 호출되지 않고 false를 돌려줘요. inheritfalse면 리시버 자신의 상수만 검사해요. 유효하지 않은 상수 이름이면 NameError(메시지 "wrong constant name name")가 나요.

const_get(sym, inherit=true) → obj
const_get(str, inherit=true) → obj

mod에서 주어진 이름의 상수를 찾아요. inherit가 설정돼 있으면 조상도(그리고 modModule이면 Object도) 검색해요. 정의를 찾으면 그 상수 값을, 아니면 NameError를 돌려줘요. 네임스페이스가 붙은 클래스 이름이 주어지면 재귀적으로 상수 이름을 찾아요. 유효하지 않은 상수 이름이면 경고와 함께 NameError가 나요.

const_missing(sym) → obj

mod에서 정의되지 않은 상수를 참조할 때 호출돼요. 정의되지 않은 상수의 심볼이 전달되고, 그 상수에 사용할 값을 돌려줘요.

def Foo.const_missing(name)
  name # return the constant name as Symbol
end

Foo::UNDEFINED_CONST  #=> :UNDEFINED_CONST -- symbol returned

const_missing은 꼭 상수를 만들어야 하는 건 아니에요(그래도 종종 부작용으로 만들죠). 트리거되면 호출자는 그 반환값을 받아요. 상수가 이미 정의돼 있으면 이후 조회는 const_missing을 거치지 않고 상수에 저장된 값을 돌려줘요. 아니면 또 호출돼요. 자동 로드(autoload)를 구현하는 데도 쓸 수 있어요.

const_set(sym, obj) → obj
const_set(str, obj) → obj

이름 붙은 상수를 주어진 객체로 설정하고 그 객체를 돌려줘요. 이전에 없던 이름이라면 새 상수를 만들어요. 유효하지 않은 상수 이름이면 경고와 함께 NameError가 나요.

Math.const_set("HIGH_SCHOOL_PI", 22.0/7.0) #=> 3.14285714285714
Math::HIGH_SCHOOL_PI - Math::PI             #=> 0.00126448926734968
const_source_location(sym, inherit=true) → [String, Integer]
const_source_location(str, inherit=true) → [String, Integer]

지정된 상수의 정의가 들어 있는 Ruby 소스 파일명과 줄 번호를 돌려줘요. 못 찾으면 nil, C 코드에 정의돼 있어 위치를 추출할 수 없으면 빈 배열을 돌려줘요. inheritmod.ancestors에서 찾을지를 지정해요(기본 true).

constants(inherit=true) → array

mod에서 접근 가능한 상수 이름 배열을 돌려줘요. inheritfalse가 아니면 include된 모듈의 상수 이름도 포함돼요. 순서는 보장되지 않아요. Module#const_defined?도 참고하세요.

define_method(symbol, method) → symbol
define_method(symbol) { block } → symbol

리시버에 인스턴스 메서드를 정의해요. method 파라미터는 Proc, Method, UnboundMethod 객체일 수 있어요. 블록이 지정되면 그 블록이 메서드 본문으로 쓰여요. 블록이나 method 파라미터에 파라미터가 있으면 그게 메서드 파라미터가 돼요. 이 블록은 instance_eval로 평가돼요.

class A
  def fred
    puts "In Fred"
  end
  def create_method(name, &block)
    self.class.define_method(name, &block)
  end
  define_method(:wilma) { puts "Charge it!" }
  define_method(:flint) {|name| puts "I'm #{name}!"}
end
class B < A
  define_method(:barney, instance_method(:fred))
end
a = B.new
a.barney
a.wilma
a.flint('Dino')
a.create_method(:betty) { p self }
a.betty
# In Fred
# Charge it!
# I'm Dino!
# #<B:0x401b39e8>
deprecate_constant(symbol, ...) → mod

기존 상수 목록을 deprecated로 만들어요. 참조하면 경고가 나요.

module HTTP
  NotFound = Exception.new
  NOT_FOUND = NotFound # previous version of the library used this name
  deprecate_constant :NOT_FOUND
end

HTTP::NOT_FOUND
# warning: constant HTTP::NOT_FOUND is deprecated
freeze → mod

mod에 대한 추가 수정을 막아요. self를 돌려줘요.

include(module, ...) → self

각 파라미터에 대해 역순으로 Module.append_features를 호출해요.

include?(module) → true or false

modulemod 또는 mod의 조상 중 하나에 include/prepend돼 있으면 true를 돌려줘요.

included_modules → array

mod 또는 mod의 조상에 include/prepend된 모듈 목록을 돌려줘요.

instance_method(symbol) → unbound_method

mod의 주어진 인스턴스 메서드를 나타내는 UnboundMethod를 돌려줘요.

instance_methods(include_super=true) → array

리시버의 public·protected 인스턴스 메서드 이름 배열을 돌려줘요. 모듈이면 public·protected 메서드, 클래스면 인스턴스(싱글턴이 아닌) 메서드예요. 선택 파라미터가 false면 조상의 메서드는 제외돼요. 현재 클래스에서의 메서드 가시성 변경과 별칭도 이 메서드에선 현재 클래스의 메서드로 간주돼요.

method_defined?(symbol, inherit=true) → true or false
method_defined?(string, inherit=true) → true or false

이름 붙은 메서드가 mod에 정의돼 있으면 true를 돌려줘요. inherit가 설정돼 있으면 mod의 조상도 검색해요. public·protected 메서드가 매치돼요. String 인자는 심볼로 변환돼요.

module_eval(string [, filename [, lineno]]) → obj
module_eval {|mod| block } → obj

mod의 문맥에서 문자열 또는 블록을 평가해요. class_eval로도 부를 수 있어요. (설명은 위 class_eval과 동일.)

module_exec(arg...) {|var...| block } → obj

주어진 블록을 클래스/모듈의 문맥에서 평가해요. class_exec로도 부를 수 있어요. (설명은 위 class_exec과 동일.)

name → string or nil

모듈 mod의 이름을 돌려줘요. 익명 모듈이면 nil.

prepend(module, ...) → self

각 파라미터에 대해 역순으로 Module.prepend_features를 호출해요.

private_class_method(symbol, ...) → mod
private_class_method(string, ...) → mod
private_class_method(array) → mod

기존 클래스 메서드를 private으로 만들어요. 기본 생성자 new를 숨길 때 자주 쓰여요. String 인자는 심볼로 변환되고, Symbol/String 배열도 받아요.

private_constant(symbol, ...) → mod

기존 상수 목록을 private으로 만들어요.

private_instance_methods(include_super=true) → array

mod에 정의된 private 인스턴스 메서드 목록을 돌려줘요. 선택 파라미터가 false면 조상의 메서드는 제외돼요.

private_method_defined?(symbol, inherit=true) → true or false
private_method_defined?(string, inherit=true) → true or false

이름 붙은 private 메서드가 mod에 정의돼 있으면 true를 돌려줘요. inherit가 설정돼 있으면 조상도 검색해요. String 인자는 심볼로 변환돼요.

protected_instance_methods(include_super=true) → array

mod에 정의된 protected 인스턴스 메서드 목록을 돌려줘요. false면 조상 메서드 제외.

protected_method_defined?(symbol, inherit=true) → true or false
protected_method_defined?(string, inherit=true) → true or false

이름 붙은 protected 메서드가 mod에 정의돼 있으면 true를 돌려줘요. inherit가 설정돼 있으면 조상도 검색해요.

public_class_method(symbol, ...) → mod
public_class_method(string, ...) → mod
public_class_method(array) → mod

기존 클래스 메서드 목록을 public으로 만들어요.

public_constant(symbol, ...) → mod

기존 상수 목록을 public으로 만들어요.

public_instance_method(symbol) → unbound_method

instance_method와 비슷하지만 public 메서드만 검색해요.

public_instance_methods(include_super=true) → array

mod에 정의된 public 인스턴스 메서드 목록을 돌려줘요. false면 조상 메서드 제외.

public_method_defined?(symbol, inherit=true) → true or false
public_method_defined?(string, inherit=true) → true or false

이름 붙은 public 메서드가 mod에 정의돼 있으면 true를 돌려줘요. inherit가 설정돼 있으면 조상도 검색해요.

refinements → array

리시버 안에 정의된 Refinement 배열을 돌려줘요.

remove_class_variable(sym) → obj

리시버에서 이름 붙은 클래스 변수를 제거하고 그 값을 돌려줘요.

remove_method(symbol) → self
remove_method(string) → self

현재 클래스에서 symbol로 식별되는 메서드를 제거해요. String 인자는 심볼로 변환돼요. undef_method와 달리 슈퍼클래스나 include된 모듈에 같은 이름의 메서드가 있으면 여전히 찾을 수 있어요.

set_temporary_name(string) → self
set_temporary_name(nil) → self

모듈의 임시 이름을 설정해요. 이 이름은 모듈의 인트로스펙션과 관련 값들(인스턴스, 상수, 메서드)에 반영돼요. 이름은 nil이거나 유효한 상수 경로가 아닌 비어있지 않은 문자열이어야 해요(영구 이름과 혼동 방지). 동적으로 생성된 클래스/모듈을 상수에 할당하지 않고 구분할 때 유용해요. 상수에 할당해 영구 이름을 주면 임시 이름은 버려져요. nil을 주면 모듈은 다시 익명이 돼요.

singleton_class? → true or false

mod가 싱글턴 클래스면 true, 일반 클래스/모듈이면 false.

class C
end
C.singleton_class?                  #=> false
C.singleton_class.singleton_class?  #=> true
to_s → string

이 모듈/클래스를 나타내는 문자열을 돌려줘요. 기본 클래스·모듈이면 이름이에요. 싱글턴이면 붙어 있는 대상의 정보도 보여줘요. inspect로도 부를 수 있어요.

undef_method(symbol) → self
undef_method(string) → self

현재 클래스가 이름 붙은 메서드 호출에 응답하지 않도록 해요. remove_method가 특정 클래스에서 메서드를 지우는 것과는 대조적이에요. undef_method는 슈퍼클래스나 include된 모듈까지 찾지 못하게 완전히 막아요. String 인자는 심볼로 변환돼요.

undefined_instance_methods → array

mod에 정의된 미정의(undefined) 인스턴스 메서드 목록을 돌려줘요. 조상의 미정의 메서드는 포함되지 않아요.

콜백 메서드 (Private Instance)

append_features(mod) → mod

이 모듈이 다른 모듈에 include될 때 Ruby가 이 모듈의 append_features를 호출하며 받는 모듈을 mod로 전달해요. 기본 구현은 이 모듈이 이미 mod나 그 조상에 추가되지 않았다면 상수·메서드·모듈 변수를 mod에 추가해요. Module#include도 참고하세요.

const_added(const_name)

리시버에 상수가 할당될 때마다 콜백으로 호출돼요. class 키워드로 클래스를 정의하면 const_addedinherited보다 먼저 실행돼요.

extend_object(obj) → obj

이 모듈의 상수와 메서드를(싱글턴 메서드로) 추가해 지정된 객체를 확장해요. Object#extend가 사용하는 콜백 메서드예요.

extended(othermod)

included와 같은 역할이지만 확장(extend)된 모듈용이에요.

included(othermod)

리시버가 다른 모듈/클래스에 include될 때마다 호출되는 콜백이에요. 모듈이 include될 때 무언가 수행하려면 Module.append_features보다 이걸 쓰는 게 좋아요.

method_added(method_name)

리시버에 인스턴스 메서드가 추가될 때마다 콜백으로 호출돼요.

method_removed(method_name)

리시버에서 인스턴스 메서드가 제거될 때마다 콜백으로 호출돼요.

method_undefined(method_name)

리시버에서 인스턴스 메서드가 미정의(undef)될 때마다 콜백으로 호출돼요.

module_function → nil
module_function(method_name) → method_name
module_function(method_name, method_name, ...) → array

이름 붙은 메서드들에 대한 모듈 함수를 만들어요. 이 함수들은 모듈을 리시버로 해서 호출할 수 있고, 그 모듈을 믹스인한 클래스의 인스턴스 메서드로도 사용할 수 있어요. 모듈 함수는 원본의 복사본이라 독립적으로 바뀔 수 있어요. 인스턴스 메서드 버전은 private으로 만들어져요. 인자 없이 쓰면 이후 정의되는 메서드들이 모듈 함수가 돼요.

module Mod
  def one
    "This is one"
  end
  module_function :one
end
class Cls
  include Mod
  def call_one
    one
  end
end
Mod.one     #=> "This is one"
c = Cls.new
c.call_one  #=> "This is one"
prepend_features(mod) → mod

이 모듈이 다른 모듈에 prepend될 때 Ruby가 이 모듈의 prepend_features를 호출하며 받는 모듈을 mod로 전달해요. 기본 구현은 이 모듈이 이미 추가되지 않았다면 상수·메서드·모듈 변수를 mod에 겹쳐(overlay) 추가해요. Module#prepend도 참고하세요.

prepended(othermod)

included와 같은 역할이지만 prepend된 모듈용이에요.

private → nil
private(method_name) → method_name
private(method_name, method_name, ...) → array
private(array) → array

인자 없이 쓰면 이후 정의되는 메서드들의 기본 가시성을 private으로 설정해요. 인자와 함께 쓰면 이름 붙은 메서드를 private으로 설정해요.

protected → nil
protected(method_name) → method_name
protected(method_name, method_name, ...) → array
protected(array) → array

섹션 또는 메서드 이름 목록의 가시성을 protected로 설정해요. Ruby의 protected 메서드는 Java 같은 언어와 달라요. Java에서 protected는 서브클래스 접근을 위해 쓰지만, Ruby에선 서브클래스가 이미 부모의 모든 메서드(private 포함)에 접근할 수 있어요. protected로 표시하면 같은 클래스의 서로 다른 객체들이 그 메서드를 호출할 수 있어요. == 같은 비교 메서드에서, 다른 클래스의 객체에는 public으로 노출하지 않고 같은 클래스 객체 간 비교를 노출하고 싶을 때 유용해요. protected 메서드는 인라인 캐시를 못 써서 다른 메서드보다 느려요.

class Account
  # Mark balance as protected, so that we can compare between accounts
  # without making it public.
  attr_reader :balance
  protected :balance

  def initialize(balance)
    @balance = balance
  end

  def >(other)
    # The invocation to `other.balance` is allowed because `other` is a
    # different object of the same class (Account).
    balance > other.balance
  end
end

account1 = Account.new(100)
account2 = Account.new(50)

account1 > account2  # => true (works)
account1.balance     # => NoMethodError (fails because balance is not public)
public → nil
public(method_name) → method_name
public(method_name, method_name, ...) → array
public(array) → array

인자 없이 쓰면 이후 정의되는 메서드들의 기본 가시성을 public으로 설정해요. 인자와 함께 쓰면 이름 붙은 메서드를 public으로 설정해요.

refine(mod) { block } → module

리시버에서 mod를 refine해요. refine된 메서드가 정의되는 모듈을 돌려줘요.

remove_const(sym) → obj

주어진 상수의 정의를 제거하고 그 상수의 이전 값을 돌려줘요. 그 상수가 모듈을 가리켰다면 그 모듈의 이름은 바뀌지 않고 혼동을 일으킬 수 있어요.

ruby2_keywords(method_name, ...) → nil

이름 붙은 메서드들에 대해, 키워드를 일반 인자 스플랫(*args)을 통해 전달되도록 표시해요. 이 메서드는 인자 스플랫(*args)은 받지만 명시적 키워드나 키워드 스플랫은 받지 않는 메서드에만 호출해야 해요. Ruby 3.0 이전 버전과의 호환성용으로만, 키워드를 다른 메서드에 위임하는 메서드에만 사용해야 해요. 언젠가 제거될 수 있으니, 호출 전에 respond_to?(:ruby2_keywords, true)로 확인하는 게 좋아요.

using(module) → self

module의 클래스 refinement를 현재 클래스/모듈 정의로 가져와요.