🧭 루비(Ruby) 코드 흐름 제어 마스터: 조건문과 반복문! (Part 3)

루비 기초 체력 단련은 잘 하고 계신가요? 💪 지난 Part 2: 루비 기초 체력 다지기에서는 변수, 자료형, 연산자 등 루비의 기본 구성 요소들을 배웠습니다. 이제 이 재료들을 가지고 좀 더 똑똑하게 작동하는 프로그램을 만들 준비가 되셨어요!

이번 파트에서는 프로그램의 흐름을 제어하는 두 가지 핵심 도구, 바로 조건문(Conditional Statement)반복문(Loop)에 대해 알아볼 거예요. 조건문을 사용하면 특정 조건에 따라 다른 코드를 실행할 수 있고, 반복문을 사용하면 지루한 작업을 루비에게 맡겨버릴 수 있답니다! 🤖✨

이제 여러분의 코드가 단순한 명령어 나열을 넘어, 상황에 맞게 판단하고 반복 작업을 수행하는 진짜 '프로그램'다워지는 순간입니다. 함께 마법을 부려볼까요? 🪄


🚦 상황 따라 다른 길로! 조건문 (If Statements)

살다 보면 "만약 ~라면 ~하고, 아니면 ~한다" 와 같이 상황에 따라 다른 행동을 할 때가 많죠? 프로그래밍에서도 마찬가지입니다. 특정 조건이 참(true)인지 거짓(false)인지에 따라 다른 코드를 실행하게 만드는 것이 바로 조건문입니다.

기본 중의 기본: `if`

가장 기본적인 조건문은 `if` 입니다. '만약 조건이 참이면, 이 코드를 실행해!' 라는 의미죠.


temperature = 30

if temperature > 25
  puts "날씨가 덥네요! ☀️"
end # if 블록의 끝을 반드시 end로 닫아줘야 해요!
  

위 코드에서 temperature > 25 라는 조건이 참(true)이기 때문에, puts 문이 실행됩니다.

참일 때와 거짓일 때: `if ... else`

'만약 조건이 참이면 A를 하고, 그렇지 않으면(거짓이면) B를 해!' 라고 말하고 싶을 때는 else를 함께 사용합니다.


score = 75

if score >= 60
  puts "합격입니다! 🎉"
else
  puts "아쉽지만 불합격입니다. 😢"
end
  

여러 조건을 차례로: `if ... elsif ... else`

조건이 여러 개일 수도 있겠죠? "만약 첫 번째 조건이 참이면 A, 그건 아니고 두 번째 조건이 참이면 B, 그것도 아니면 C를 해!" 와 같이 여러 조건을 순서대로 검사하고 싶을 때는 elsif (else if의 줄임말)를 사용합니다.


signal = "yellow"

if signal == "green"
  puts "출발! 🟢"
elsif signal == "yellow"
  puts "주의! 🟡"
elsif signal == "red"
  puts "정지! 🔴"
else
  puts "알 수 없는 신호입니다. 🤔"
end
  

💡 elsif 는 여러 개 사용할 수 있지만, else는 맨 마지막에 한 번만 쓸 수 있어요.

반대의 조건: `unless`

루비에는 '만약 조건이 거짓이라면 실행해!' 라는 의미의 unless도 있습니다. if not 과 같은 의미예요.


is_logged_in = false

unless is_logged_in  # is_logged_in 이 false 라면 (로그인 안 했다면)
  puts "로그인이 필요합니다."
end

# 위 코드는 아래와 동일합니다.
# if !is_logged_in # !는 부정(not)을 의미
#   puts "로그인이 필요합니다."
# end
  

unless는 코드를 좀 더 읽기 쉽게 만들어 줄 때 유용하게 사용될 수 있습니다.

한 줄로 쓰는 조건문 (Modifier if/unless)

실행할 코드가 한 줄이고 간단하다면, ifunless를 코드 뒤에 붙여서 더 간결하게 표현할 수 있어요.


puts "성인입니다." if age >= 19
puts "미성년자입니다." unless age >= 19
  

✨ 루비 스타일: 삼항 연산자와 case 문

if/else 를 더 간결하게 표현하는 방법들도 있어요.

  • 삼항 연산자 (`조건 ? 참일때_값 : 거짓일때_값`): 간단한 값 할당에 유용합니다.
    
    age = 20
    status = age >= 19 ? "성인" : "미성년자" # age가 19 이상이면 "성인", 아니면 "미성년자"를 status에 할당
    puts status # 출력: 성인
          
  • case 문: 특정 변수의 값에 따라 여러 경우를 처리할 때 if/elsif 보다 깔끔할 수 있어요.
    
    day = "수요일"
    
    case day
    when "월요일", "화요일", "수요일", "목요일", "금요일" # 여러 값을 ,로 나열 가능
      puts "평일입니다. 힘내세요! 💪"
    when "토요일", "일요일"
      puts "주말입니다! 즐겁게 보내세요! 😎"
    else
      puts "무슨 요일인지 모르겠어요. 🤔"
    end
          

🔄 지루한 작업은 루비에게! 반복문 (Loops)

똑같은 코드를 여러 번 실행해야 할 때, 복사 붙여넣기를 할 건가요? 🙅‍♀️ 프로그래머는 게을러야(?) 합니다! 이럴 때 사용하는 것이 바로 반복문입니다. 특정 조건이 만족되는 동안 코드 블록을 계속해서 반복 실행하게 해줍니다.

가장 기본적인 반복: `while`

while은 '조건이 참인 동안 계속 반복해!' 라는 의미입니다.


count = 0

while count < 5 # count가 5보다 작은 동안 반복
  puts "현재 숫자는 #{count} 입니다."
  count = count + 1 # 중요! count 값을 1 증가시켜 언젠가 조건이 false가 되게 해야 함
end

puts "반복 끝!"
  

⚠️ 무한 루프 주의! while 문 안에서 조건이 언젠가는 `false`가 되도록 상태를 변경하는 코드가 없다면, 프로그램은 영원히 반복을 멈추지 않는 '무한 루프'에 빠지게 됩니다! (예: count = count + 1 코드가 없다면)

조건이 거짓일 때까지: `until`

untilwhile과 반대로, '조건이 거짓인 동안 계속 반복해!' 라는 의미입니다. while not 과 같아요.


target = 10
current = 0

until current >= target # current가 target(10)보다 크거나 같아질 때까지 (즉, 작을 동안) 반복
  puts "Current: #{current}"
  current += 1 # current = current + 1 과 같은 표현
end
  

💎 루비스러운 반복: 이터레이터 (Iterators) - 초강추!

사실, while이나 until보다 루비에서는 더 우아하고 안전한 반복 방법이 있습니다. 바로 이터레이터(Iterator) 또는 반복자라고 불리는 메소드들을 사용하는 거예요! 이터레이터는 배열, 해시, 범위(Range) 같은 데이터 묶음의 각 요소를 순회하면서 작업을 처리할 때 아주 유용합니다.

  • .each: 가장 기본적이고 많이 사용되는 이터레이터. 컬렉션의 각 요소를 하나씩 꺼내 블록(do...end 또는 {...})으로 전달하여 실행합니다.
    
    fruits = ["사과", "바나나", "딸기"]
    
    fruits.each do |fruit| # 배열 fruits의 각 요소를 fruit 변수에 담아 반복
      puts "#{fruit} 맛있어요! 🍎🍌🍓"
    end
    
    # 한 줄로 쓸 때는 중괄호 {} 사용
    (1..5).each { |number| puts "숫자: #{number}" } # 1부터 5까지 숫자를 반복
          
  • .times: 정해진 횟수만큼 반복할 때 사용합니다. (0부터 시작하는 인덱스 값을 블록으로 넘겨줍니다.)
    
    3.times do |i|
      puts "#{i + 1}번째 인사: 안녕하세요!"
    end
          
  • .map (또는 .collect): 각 요소를 변형하여 새로운 배열을 만들 때 사용합니다. (매우 유용!)
    
    numbers = [1, 2, 3, 4, 5]
    squared_numbers = numbers.map do |n|
      n * n # 각 숫자를 제곱한 결과를 반환
    end
    
    puts squared_numbers.inspect # 출력: [1, 4, 9, 16, 25] (새로운 배열이 생성됨!)
          

이 외에도 select(조건에 맞는 요소만 골라내기), inject(누적 계산) 등 강력하고 편리한 이터레이터들이 많습니다. 루비에서는 while 보다는 .each와 같은 이터레이터를 사용하는 것이 훨씬 더 권장됩니다. 코드가 더 간결하고 안전해져요!


🎮 오늘의 실습: 짝수만 골라 출력하기!

1부터 10까지의 숫자 중에서 짝수만 골라서 화면에 출력하는 코드를 작성해 봅시다!

요구사항:

  1. 1부터 10까지의 숫자를 반복합니다.
  2. 각 숫자가 짝수인지 확인합니다. (힌트: 짝수는 2로 나누었을 때 나머지가 0!)
  3. 짝수일 경우에만 해당 숫자를 화면에 출력합니다.

힌트: 이터레이터(.each)와 조건문(if), 그리고 나머지 연산자(%)를 사용해보세요!

👇 아래는 정답 코드 예시입니다. 꼭 먼저 직접 도전해보세요! 😉


puts "1부터 10까지의 짝수 목록:"

(1..10).each do |number| # 1부터 10까지의 숫자를 number 변수에 담아 반복
  if number % 2 == 0  # number를 2로 나눈 나머지가 0이면 (짝수이면)
    puts number        # 해당 숫자를 출력
  end
end
  

💡 Part 3 핵심 요약

  • 조건문: 상황에 따라 코드 실행 흐름을 바꿈.
    • if (조건 참일 때)
    • if-else (참/거짓일 때)
    • if-elsif-else (여러 조건 순차 검사)
    • unless (조건 거짓일 때)
    • 간결한 표현: 한 줄 if/unless, 삼항 연산자, case
  • 반복문: 특정 코드를 반복 실행.
    • while (조건 참인 동안) - 무한 루프 주의!
    • until (조건 거짓인 동안)
    • 이터레이터 (강추👍): .each, .times, .map 등 컬렉션 순회에 유용하고 안전!

🚀 다음 단계로!

짝짝짝! 이제 여러분의 루비 코드는 스스로 판단하고 반복 작업까지 할 수 있게 되었습니다! 🎉 조건문과 반복문은 프로그래밍에서 정말 정말 중요하고 자주 사용되는 개념이니, 오늘 배운 내용들을 충분히 연습해서 익숙해지시길 바랍니다. 특히 이터레이터는 루비의 매력을 듬뿍 느낄 수 있는 부분이랍니다!

다음 Part 4: 데이터 묶음 관리의 달인되기 (배열, 해시) 에서는 여러 개의 데이터를 효과적으로 묶어서 관리하는 방법, 바로 배열(Array)과 해시(Hash)에 대해 배울 거예요. 데이터를 더욱 체계적으로 다루는 방법을 기대해주세요! 😉