Ruby 메서드는 def...end로 정의됩니다. Ruby는 유연하고 표현력 있는 인자 처리를 갖추고 있습니다 — 기본값, 키워드 인자, 가변 인자를 위한 splat(*), block — 그리고 마지막 표현식이 암묵적 반환값이라는 관례가 있습니다.
기본 메서드와 암묵적 반환
()
a + b
add(, )
()
Ruby 메서드는 마지막으로 평가된 표현식을 자동으로 반환합니다 — return은 거의 쓰지 않습니다(조기 반환에만 사용). 이것이 관용적입니다.
# 기본 인자
def greet(name, greeting = "Hello")
"#{greeting}, #{name}"
end
greet("Ann") # "Hello, Ann"
greet("Ann", "Hi") # "Hi, Ann"
# 키워드 인자 (더 명확하고 순서 무관) — 현대 Ruby에서 흔함
def create_user(name:, age: 0, role: :user)
# name은 필수 (기본값 없음); age/role은 선택
end
create_user(name: "Ann", role: :admin) # 키워드로 전달 — 읽기 쉬움
키워드 인자(name:)는 관용적인 현대 Ruby입니다 — 호출을 자체 문서화되고 순서 무관하게 만듭니다.
def sum(*numbers) # * 는 추가 위치 인자를 배열로 수집
numbers.sum
end
sum(1, 2, 3, 4) # 10
def config(**options) # ** 는 키워드 인자를 해시로 수집
options[:timeout]
end
config(timeout: 30, retries: 3)
*args는 가변 위치 인자를 배열로 수집하고; **options는 키워드 인자를 해시로 수집합니다.
def valid?(x) # ? 관례 → boolean 반환 (술어 메서드)
x > 0
end
def process!(data) # ! 관례 → 제자리 수정 / "위험한" 버전
data.map!(&:upcase)
end
명명 규칙: **?**로 끝나는 메서드는 boolean을 반환하고(술어), **!**는 파괴적/제자리 또는 "위험한" 버전을 나타냅니다.
메서드는 Ruby에서 동작의 구성 요소이며, Ruby의 유연하고 표현력 있는 인자 처리와 관례를 이해하는 것은 중요한 일상 지식입니다.
몇 가지 측면은 Ruby에 특화되어 알아둘 가치가 있습니다: 암묵적 반환(메서드가 마지막으로 평가된 표현식을 반환하므로 return을 거의 쓰지 않음 — 관용적인 Ruby는 이에 의존함), 키워드 인자(name: — 명확하고 자체 문서화되며 순서 무관한 메서드 호출을 작성하는 현대적이고 관용적인 방법), splat 인자(가변 개수 인자를 위한 *args/**options).
마찬가지로 중요한 것은 명명 규칙입니다 — **?**로 끝나는 메서드는 boolean을 반환하는 술어이고(valid?, empty?), **!**로 끝나는 메서드는 파괴적/제자리 또는 "위험한" 버전입니다(map!, sort!) — 이는 Ruby와 Rails에 만연하며 메서드의 동작을 한눈에 전달합니다(!이 보통 "제자리에서 수정"을 의미함을 아는 것은 의도치 않은 변경을 피하는 데 중요함).
Ruby의 유연한 인자(기본값, 키워드, splat)로 메서드를 정의하는 법, 암묵적 반환 관용구, 그리고 ?/! 명명 규칙을 이해하는 것은 관용적인 Ruby를 작성하고 읽는 데 기초가 됩니다 — 이 기능과 관례는 끊임없이 등장하며, 이를 파악하는 것(특히 깔끔한 API를 위한 키워드 인자와 메서드 동작을 이해하기 위한 ?/! 관례)은 효과적인 Ruby 개발에 필수적이고 자주 적용되는 지식입니다.