루비(Ruby)에서 메서드(method)란 무엇일까요?
메서드는 특정 목적을 수행하기 위해 하나 이상의 루비 코드를 하나로 묶어놓은 것입니다. 이렇게 묶인 코드에는 이름이 붙여지기 때문에, 코드를 다시 작성하거나 복사·붙여넣기 할 필요 없이 언제든지 재사용할 수 있습니다.
메서드의 용도
메서드는 주로 다음과 같은 목적으로 사용됩니다.
- 정보 가져오기 — 객체에서 원하는 데이터를 조회합니다.
- 객체 변경 또는 생성 — 기존 객체를 수정하거나 새로운 객체를 만듭니다.
- 데이터 필터링 및 포맷팅 — 데이터를 원하는 형태로 가공합니다.
예시로 이해하기
예제 1: 배열(Array) 객체의 size 메서드는 요소의 개수를 반환합니다. (정보 가져오기)
예제 2: pop 메서드는 배열의 마지막 요소를 제거합니다. (객체 변경)
객체, 클래스, 메서드 사이의 관계를 이해하면 루비의 동작 방식이 한층 명확해집니다. 그럼 지금부터 본격적으로 배워보겠습니다!
메서드 정의하는 방법
루비는 강력한 내장 메서드를 다수 제공하지만, 직접 메서드를 만들 수도 있습니다. 어떻게 할까요?
def 키워드를 사용하면 자신만의 인스턴스 메서드를 정의할 수 있습니다.
기본 문법은 다음과 같습니다:
def gimme_bacon puts "Bacon plz." end
코드가 하는 일을 하나씩 살펴볼까요?
def— 루비 문법의 일부로, "메서드를 정의(define)하겠다"는 의미입니다.gimme_bacon— 메서드의 이름입니다.puts "Bacon plz."— 메서드의 본문(body)입니다.end— 메서드 정의의 끝을 표시합니다.
주의할 점은, 메서드를 정의하는 것만으로는 루비에게 "이런 메서드를 만들고 싶다"고 알려준 것에 불과하다는 것입니다. 실제로 사용하려면 메서드를 호출(call)해야 합니다.
루비에서 메서드 호출하기
루비에서 메서드를 사용하는 행위를 "호출한다"고 표현합니다. 흔히 "메서드 호출(method call)"이라는 말을 듣게 되는데, 객체지향 순수주의자와 함께 작업한다면 "메시지를 보낸다(sending a message)"라는 표현을 들을 수도 있습니다.
어느 쪽이든, 직접 예시를 통해 확인해 보겠습니다.
메서드 호출:
gimme_bacon
실행 결과:
"Bacon plz."
메서드는 객체에 대해서도 호출할 수 있습니다.
예를 들면:
n = [1,2,3] n.size # 3
n.size는 배열인 객체 n에 대해 size 메서드를 호출하는 코드입니다. 그 결과로 배열의 크기인 3을 얻게 됩니다.
어떤 메서드를 사용할 수 있을까?
사용 가능한 메서드는 메서드를 호출하는 객체의 클래스에 따라 달라집니다. 배열은 해시(Hash)와 서로 다른 메서드들을 가지고 있습니다. 각 클래스가 제공하는 메서드 목록은 공식 루비 문서(Ruby documentation)에서 확인할 수 있습니다.
메서드의 반환값 이해하기
루비의 핵심 개념 중 하나는 모든 메서드는 반드시 값을 반환한다는 점입니다.
메서드를 호출하면 무언가를 돌려받게 되는데, 이 값은 메서드 정의 안에서 마지막으로 평가된 표현식에서 나옵니다.
예제:
def number_one 1 end number_one # 1
또 다른 예제:
def add(x,y) x + y end add(5, 6) # 11
이것을 암시적 반환(implicit return)이라고 부르며, 쉽게 말해 "마지막 값을 자동으로 반환한다"는 뜻입니다.
추가로, return 키워드를 사용해 명시적으로 값을 반환할 수도 있습니다.
def two return 2 end # 2
단, return을 사용하면 그 시점에서 메서드 실행이 즉시 중단된다는 점에 유의하세요. 이러한 특성 때문에 조건에 따른 조기 반환(early return)이나 반복문 탈출에 활용됩니다.
메서드 이름에 물음표가 있는 이유는?
루비 코드를 보다 보면 낯선 형태의 메서드 이름을 만나게 됩니다.
예를 들면:
empty?sort!title=
이 모든 것이 유효한 메서드 이름입니다. 물음표(?), 느낌표(!), 등호(=)는 각각 무슨 의미일까요? 이들은 루비 커뮤니티에서 널리 사용되는 네이밍 컨벤션(naming convention)입니다.
각 기호의 의미:
- 물음표 메서드 — 조건 메서드(predicate method)라고도 하며,
true또는false를 반환합니다. - 느낌표 메서드 — 느낌표가 없는 버전과 다르게 동작함을 의미합니다. 보통 요소 추가/삭제처럼 객체 자체를 변경(destructive)하는 경우에 붙으며, "뱅 메서드(bang methods)"라고도 불립니다.
- 등호 메서드 — 할당(assignment)을 의미하며, 인스턴스 변수에 값을 할당할 때 사용됩니다.
이러한 컨벤션은 언어 차원에서 강제되지 않습니다. 하지만 이 규칙을 따르면 훨씬 더 루비다운(Ruby-like) 코드를 작성할 수 있습니다!
마무리
지금까지 루비 메서드의 강력함, 정의 방법, 호출 방법, 그리고 올바른 네이밍 컨벤션까지 살펴보았습니다. 이제 직접 코드를 작성하면서 익혀볼 차례입니다 🙂
읽어주셔서 감사합니다!