벌써 다섯 번째 시간입니다! 🥳 지난 Part 4: 데이터 정리의 기술에서는 루비의 강력한 데이터 묶음 관리 도구인 배열과 해시를 마스터했습니다. 이제 그 데이터들을 가지고 좀 더 의미있는 작업을 수행하고, 반복되는 코드들을 효율적으로 관리하는 방법을 배울 시간이에요!
이번 파트에서는 프로그래밍의 중요한 원칙 중 하나인 **"반복하지 마라(Don't Repeat Yourself, DRY)"** 를 실현하는 핵심 도구, 바로 메소드(Method)에 대해 알아봅니다. 메소드는 특정 작업을 수행하는 코드 묶음에 이름을 붙여놓고 필요할 때마다 불러서 사용하는 기능이에요. 마치 자주 사용하는 도구를 상자에 정리해두고 필요할 때 꺼내 쓰는 것과 같죠! 🛠️
메소드를 사용하면 코드가 훨씬 간결해지고, 읽기 쉬워지며, 수정하기도 편리해집니다. 루비에서 메소드를 어떻게 만들고 사용하는지, 함께 마법 같은 코드 재사용의 세계로 떠나볼까요? 🪄
🤔 메소드(Method), 왜 필요할까요?
프로그래밍을 하다 보면 비슷한 코드를 여러 곳에서 반복해서 작성해야 할 때가 많습니다. 예를 들어, 사용자에게 인사하는 코드를 프로그램 시작 시, 특정 이벤트 발생 시, 종료 시 등 여러 번 사용해야 할 수 있죠.
이때 메소드가 없다면?
# 프로그램 시작
puts "--------------------"
puts "안녕하세요! 반갑습니다."
puts "--------------------"
# 이벤트 발생
# ... (다른 코드) ...
puts "--------------------"
puts "안녕하세요! 반갑습니다."
puts "--------------------"
# 프로그램 종료
# ... (다른 코드) ...
puts "--------------------"
puts "안녕하세요! 반갑습니다."
puts "--------------------"
똑같은 코드가 세 번이나 반복되었네요! 만약 인사 문구를 바꿔야 한다면? 세 곳을 모두 찾아서 수정해야 하는 번거로움이 발생합니다. 😩
바로 이럴 때 메소드가 빛을 발합니다! ✨ 메소드를 사용하면,
- ✅ 코드 재사용성 UP: 반복되는 코드를 한 곳에 정의하고 필요할 때마다 호출하여 사용합니다.
- ✅ 가독성 향상: 코드 묶음에 의미 있는 이름을 부여하여 어떤 작업을 하는지 쉽게 파악할 수 있습니다.
- ✅ 유지보수 용이: 수정이 필요할 때 메소드 정의 부분만 고치면 호출된 모든 곳에 반영됩니다.
✍️ 나만의 메소드 만들기: `def ... end`
루비에서 메소드를 만드는 것은 아주 간단합니다. `def` 키워드로 시작해서 메소드 이름을 정하고, 실행할 코드를 작성한 뒤 `end` 키워드로 마무리하면 됩니다.
# 'say_hello' 라는 이름의 메소드를 정의합니다.
def say_hello
puts "--------------------"
puts "안녕하세요! 반갑습니다. 😊"
puts "--------------------"
end # 메소드 정의 끝
메소드 이름도 변수 이름처럼 소문자와 밑줄(_
)을 사용한 snake_case
로 짓는 것이 루비 스타일입니다!
메소드 사용하기 (호출)
메소드를 정의했다고 해서 바로 실행되는 것은 아니에요. 우리가 이름을 불러줘야(호출해야) 비로소 정의된 코드가 실행됩니다. 메소드를 호출하는 방법은 그냥 메소드 이름을 써주면 됩니다.
# 위에서 정의한 say_hello 메소드를 호출합니다.
say_hello
# 필요할 때마다 몇 번이고 다시 호출할 수 있어요!
puts "\n잠시 후..."
say_hello
아까보다 코드가 훨씬 깔끔해졌죠?
🎁 메소드에 정보 전달하기: 매개변수와 인자
메소드가 항상 똑같은 일만 하라는 법은 없죠! 때로는 외부에서 정보를 받아 그 정보에 따라 다르게 동작해야 할 때가 있습니다. 예를 들어, 특정 사람의 이름을 받아서 그 사람에게 맞춤 인사를 건네는 메소드를 만들고 싶을 수 있습니다.
이때 사용하는 것이 매개변수(Parameter)와 인자(Argument)입니다.
- 매개변수(Parameter): 메소드를 정의할 때, 메소드 이름 뒤 괄호
()
안에 선언하는 변수입니다. 외부에서 전달받을 값을 담는 그릇 역할을 합니다. - 인자(Argument): 메소드를 호출할 때, 매개변수에 실제로 전달하는 값입니다.
# 'name' 이라는 매개변수를 받는 greet 메소드를 정의합니다.
def greet(name) # name 이 매개변수
puts "안녕하세요, #{name}님! 만나서 반갑습니다."
end
# greet 메소드를 호출하면서 '루비' 라는 인자를 전달합니다.
greet("루비") # "루비" 가 인자
# 다른 인자를 전달하여 호출할 수도 있습니다.
greet("해시")
이제 greet
메소드는 전달받은 이름에 따라 다른 인사를 출력하게 됩니다!
매개변수는 여러 개를 사용할 수도 있습니다. 쉼표(,
)로 구분해주면 돼요.
def print_info(name, age) # 매개변수 두 개!
puts "이름: #{name}, 나이: #{age}"
end
print_info("김개발", 30) # 인자도 순서대로 두 개 전달!
매개변수 기본값 설정
메소드를 호출할 때 인자를 항상 전달하지 않아도 되도록 매개변수에 **기본값(Default Value)**을 설정할 수도 있습니다.
def say_goodbye(name = "여러분") # name 매개변수의 기본값을 "여러분"으로 설정
puts "안녕히 가세요, #{name}!"
end
say_goodbye("철수") # 인자를 전달하면 전달한 값 사용 -> 안녕히 가세요, 철수!
say_goodbye # 인자를 생략하면 기본값 사용 -> 안녕히 가세요, 여러분!
⏎ 메소드의 결과 돌려받기: 반환 값 (Return Value)
메소드는 단순히 어떤 작업을 수행하고 끝날 수도 있지만, 작업 결과를 계산하여 호출한 곳으로 돌려줄 수도 있습니다. 이 돌려주는 값을 반환 값(Return Value)이라고 합니다.
값을 반환하기 위해 return
키워드를 사용할 수 있습니다.
def add(a, b)
result = a + b
return result # 계산 결과를 반환합니다.
end
sum = add(10, 5) # add 메소드가 반환한 값을 sum 변수에 저장
puts "두 수의 합은 #{sum} 입니다." # 출력: 두 수의 합은 15 입니다.
💎 루비의 마법: 암시적 반환 (Implicit Return)
루비의 매우 편리하고 독특한 특징 중 하나는 암시적 반환입니다! 메소드 내에서 return
키워드를 명시적으로 사용하지 않으면, 메소드에서 마지막으로 실행된(계산된) 줄의 결과가 자동으로 반환 값이 됩니다.
def subtract(a, b)
a - b # 이 줄이 마지막으로 계산되는 값이므로, 이 결과가 자동으로 반환됩니다.
end
difference = subtract(100, 30)
puts "두 수의 차는 #{difference} 입니다." # 출력: 두 수의 차는 70 입니다.
대부분의 경우, 루비 개발자들은 이 암시적 반환을 활용하여 코드를 더 간결하게 작성합니다. 하지만 코드를 명확하게 하고 싶거나 중간에서 값을 반환해야 할 때는 return
을 사용하기도 합니다.
💡puts
의 반환 값은?
IRB에서puts "hello"
를 실행하면hello
가 출력된 후=> nil
이라고 뜨는 것을 본 적 있을 거예요.puts
메소드 자체는 화면에 값을 출력하는 '작업'을 하지만, 그 결과로 반환하는 값은 '없음'을 의미하는nil
이기 때문입니다!
🌍 변수가 사는 동네: 스코프 (Scope) - 간단 맛보기
메소드 안에서 만든 변수(지역 변수, Local Variable)는 기본적으로 그 메소드 안에서만 사용할 수 있습니다. 메소드 밖에서는 그 변수가 존재하는지조차 알 수 없죠. 이것을 변수의 **스코프(Scope)** 또는 유효 범위라고 합니다.
def my_method
local_var = "메소드 안에서만 살아요!"
puts local_var
end
my_method # 출력: 메소드 안에서만 살아요!
# puts local_var # 이 줄은 오류 발생! 메소드 밖에서는 local_var를 알 수 없음.
스코프는 변수 이름 충돌을 막고 코드를 더 안전하게 만드는 중요한 개념입니다. 지금은 '메소드 안의 변수는 메소드 안에서만!' 정도만 기억해두세요. 더 자세한 내용은 나중에 다룰 기회가 있을 거예요.
🎮 오늘의 실습: 할 일 목록 출력 코드를 메소드로!
지난 Part 4 실습에서 만들었던 할 일 목록 출력 코드를 기억하시나요? 그 부분을 별도의 메소드로 만들어서 코드를 개선해 봅시다!
목표: 할 일 목록 배열을 받아서 번호와 함께 예쁘게 출력하는 `print_todos` 메소드를 정의하고 사용해보기.
👇 아래는 개선된 코드 예시입니다. 어떻게 달라졌는지 비교해보세요!
# 할 일 목록을 받아서 출력하는 메소드 정의
def print_todos(todo_list) # 할 일 목록 배열을 'todo_list' 매개변수로 받음
puts "--- 할 일 목록 (총 #{todo_list.length}개) ---"
if todo_list.empty? # 만약 목록이 비어있다면
puts "할 일이 없습니다! 🎉"
else
todo_list.each_with_index do |todo, index|
puts "#{index + 1}. #{todo}"
end
end
puts "---------------------------"
end
# ----- 프로그램 메인 로직 -----
todos = [] # 초기 할 일 목록
# 초기 목록 출력
print_todos(todos) # 정의한 메소드 호출!
# 할 일 추가
todos << "루비 메소드 공부하기"
todos.push("블로그 글쓰기")
todos << "커피 마시기"
# 변경된 목록 출력
print_todos(todos) # 또 호출! 코드가 훨씬 깔끔해졌죠?
# 첫 번째 할 일 완료
if !todos.empty?
puts "\n'#{todos.first}' 완료 처리!"
todos.shift
end
# 최종 목록 출력
print_todos(todos)
어떤가요? 할 일 목록을 출력하는 코드가 `print_todos` 메소드 안에 깔끔하게 정리되었고, 필요할 때마다 메소드 이름만 불러주면 되니 훨씬 보기 좋고 관리하기 쉬워졌죠? 이것이 바로 메소드의 힘입니다! 💪
💡 Part 5 핵심 요약
- 메소드: 특정 작업을 수행하는 코드 묶음.
def 메소드이름 ... end
로 정의.- 코드 재사용성, 가독성, 유지보수성 향상! (DRY 원칙 실현)
- 호출: 메소드 이름으로 실행.
- 매개변수(Parameter): 메소드 정의 시 괄호 안에 선언, 외부 값을 받는 그릇.
- 인자(Argument): 메소드 호출 시 매개변수에 전달하는 실제 값.
- 기본값: 매개변수에
= 값
형태로 기본값 설정 가능.- 반환 값: 메소드의 실행 결과.
return
사용 또는 암시적 반환 (마지막 줄 결과 자동 반환).- 스코프: 메소드 내 지역 변수는 기본적으로 메소드 안에서만 유효.
🚀 다음 단계로!
메소드라는 강력한 도구를 손에 넣으신 것을 축하합니다! 🎉 이제 여러분은 반복되는 코드를 효율적으로 관리하고, 더 구조화된 프로그램을 만들 수 있게 되었습니다. 메소드는 앞으로 루비 프로그래밍 여정 내내 함께할 중요한 친구이니, 오늘 배운 내용을 충분히 연습하고 익숙해지시길 바랍니다.
다음 Part 6: 객체 지향 첫걸음 (클래스, 객체) 에서는 드디어 루비의 핵심 철학이자 강력함의 근원인 '객체 지향 프로그래밍(OOP)'의 세계로 들어갑니다! 클래스와 객체라는 흥미로운 개념을 배울 준비를 하세요! 😉
루비 #ruby #메소드 #함수 #코드재사용 #매개변수 #인자 #반환값 #dry원칙 #프로그래밍기초 #루비강좌
'루비' 카테고리의 다른 글
🧬 루비(Ruby) 객체 지향 레벨 업: 상속, 모듈, 믹스인 마스터! (Part 7) (0) | 2025.03.30 |
---|---|
🏛️ 루비(Ruby) 객체 지향 첫걸음: 클래스와 객체 완벽 이해! (Part 6) (0) | 2025.03.29 |
🗂️ 루비(Ruby) 데이터 정리의 기술: 배열과 해시 완전 정복! (Part 4) (2) | 2025.03.29 |
🧭 루비(Ruby) 코드 흐름 제어 마스터: 조건문과 반복문! (Part 3) (0) | 2025.03.29 |
🧱 루비(Ruby) 기초 체력 다지기: 변수, 자료형, 연산자 정복! (Part 2) (1) | 2025.03.29 |