4. 메소드 호출하기

메소드를 호출할 때는 수신자(클래스명 or 인스턴스명)의 이름을 써주고 그 뒤에 메소드의 이름을 쓴다. 그 뒤에 필요한 경우 몇 개의 매개변수(형식인자)를 써준다. 마지막으로 맨 뒤에 블럭이 올 수도 있다.(블럭은 다음 글에서 살펴볼 것이다.)

메소드 호출 방법
connection.download_MP3("wonder girls") {|p| show_progress(p)}

connection -> 수신자
download_MP3 -> 메소드명
("wonder girls") -> 매개변수(형식인자)
{|p| show_progress(p)} -> 블럭

크래스나 모듈의 메소드를 호출할 때, 수신자 위치에 클래스 이름이나 모듈이름을 적어주면 된다.
File.size("test_file.txe")

수신자를 생략하면, 기본값은 self가 되고 이는 현재 객체를 나타낸다.
# 메소드 호출    -> 결과값
self.class #     -> Object
self.frozen? #   -> false
frozen? #        -> false
self.object_id # -> 978140
object_id #      -> 978140
위 예제에서 self.class를 호출하는 부분이 있는데 class는 클래스 선언을 의미하는 키워드이기 때문에 class 메소드만은 수신자를 생략하고 사용할 수 없다.

메소드 이름 다음에 선택적으로 매개변수가 오게 되는데 이때 괄호로 묶어줘도 되과 묶지 않아도 된다.
# 두 문장은 같다.
a = obj.hash
a = obj.hash()

# 두 문장은 같다.
obj.some_mehtod "arg1", "arg2", "arg3"
obj.some_mehtod ("arg1", "arg2", "arg3")

5. 메소드 결과값 반환하기

호출된 모든 메소드는 값을 반환한다. 메소드의 반환값은 마지막으로 실행된 표현식의 결과값이거나 return문을 이용한 매개변수의 값이다. 수행중에 빠져나가야 하는 등 특별한 경우가 아니라면 루비에서는 return문을 쓸 필요가 없다.

def meth_one
  "one"
end

def meth_two(arg)
  case
  when arg > 0
    "positive"
  when arg < 0
    "negative"
  else
    "zero"
  end
end

# 메소드 실행
puts meth_one
puts meth_two(23)
puts meth_two(-20)
puts meth_two(0)
- 실행결과 -
one
positive
negative
zero

6. 배열형태의 반환값 받기

def meth_three
  100.times do |num|
    square = num * num
    return num, square if square > 1000
  end
end

num, square = meth_three
puts num
puts square
- 실행결과 -
32
1024

- return의 매개변수로 여러 개의 값을 동시에 넘기면 배열의 형태로 값을 반환한다.
- 배열로 반환된 값을 받기 위해서는 num, square = meth_three 과 같은 병렬대입문을 이용한다.

7. 메소드 호출 시에 배열로 확장하기

메소드를 호출할 때 배열을 확장해서 구성 원소가 각각의 형식인수에 대응되도록 할 수 있다. * 를 배열 매개변수 앞쪽에 붙여주면 되고 단, 이런 배열 인수는 일반적인 인수 뒤에 와야만 한다.
def five(a, b, c, d, e)
  "I was passed #{a} #{b} #{c} #{d} #{e}"
end

puts five(1, 2, 3, 4, 5)
puts five(1, 2, 3, *['a', 'b'])
puts five(*(10..14).to_a)
- 실행결과 -
I was passed 1 2 3 4 5
I was passed 1 2 3 a b
I was passed 10 11 12 13 14


※ 위 내용은 데이브토머스 차드파울러 앤디헌트 지음, 강문식, 박지인, 양석호 옮김 『Programming Ruby』 책의 내용을 바탕으로 정리한 것입니다.