본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 06. 15. 10:45

반복 처리를 이해하는 데 몇 년이 걸렸기에 쓸 수 있는, 초보자가 정말로 막히는 포인트와 해결책【Ruby】

요약

Ruby 프로그래밍의 핵심인 반복 처리(Iteration) 개념을 초보자의 시선에서 설명합니다. 블록 변수의 역할부터 each, times, each_with_index, map의 차이점까지 단계별로 정리했습니다.

핵심 포인트

  • 블록 변수는 객체의 요소를 하나씩 담는 그릇 역할을 함
  • each는 원본 배열을 유지하며, map은 계산된 새로운 배열을 반환함
  • 반복 횟수가 정해진 경우 times 메서드를 활용하면 편리함
  • 인덱스가 필요한 경우 each_with_index를 사용하여 순번을 추적함

Ruby를 배우기 시작한 후, 반복 처리(繰り返し処理)에는 꽤 고전했습니다.

[1, 2, 3].each do |num|
puts num
end

이것을 처음 보았을 때, 솔직히 "num이란 대체 무엇인가?"라고 생각했습니다. 배열의 내용물과 변수가 연결되어 있다는 사실이 전혀 와닿지 않았습니다.

마찬가지로 "어떻게든 돌아가고는 있지만, 솔직히 잘 모르겠다..."라고 느끼는 분들을 위해, 제가 이해할 수 있었던 포인트를 중심으로 정리했습니다.

반복 처리의 구문을 살펴보겠습니다.

# each의 경우
객체.each do |변수|
실행할 처리
...

처음에는 이 변수 (블록 변수(ブロック変数)·임시 변수(一時変数)라고도 불립니다)가 무엇인지 알 수 없었습니다.

정답은 간단합니다. "객체의 요소가 하나씩 들어가는 그릇"입니다.

[1, 2, 3].each do |num|
puts num
end

↓ 이렇게 이미지화합니다

1회차: num = 1 → 1을 표시
2회차: num = 2 → 2를 표시
3회차: num = 3 → 3을 표시

변수명은 무엇이든 OK입니다. num이어도 n이어도 item이어도, 자신이 이해하기 쉬운 이름으로 정할 수 있습니다.

배열이나 해시(Hash)의 요소를 하나씩 꺼내어 처리합니다. Ruby에서 반복이라고 하면 우선 이것입니다.

fruits = ["apple", "banana", "cherry"]
fruits.each do |fruit|
puts fruit
...

do ... end 대신 { }로도 쓸 수 있습니다 (1줄일 때 자주 사용됩니다).

fruits.each { |fruit| puts fruit }

each와 똑같이 할 수 있지만, for가 "일본어적인 읽기 방식"에 더 가까울지도 모릅니다.

for fruit in fruits do
puts fruit
end

"fruits 안에서 fruit를 꺼내어, 처리한다"라고 읽을 수 있어 직관적입니다.

단, Ruby에서는 for문보다 each가 일반적으로 더 많이 사용됩니다.

"○번 반복한다"라는 경우에는 times가 편리합니다.

3.times do
puts "Hello!"
end
...

몇 번째인지도 취득할 수 있습니다 (0부터 시작).

3.times do |i|
puts "#{i + 1}回目"
end
...

each만으로는 "몇 번째 요소인가"를 알 수 없습니다. 인덱스(Index)도 사용하고 싶을 때는 이것을 사용합니다.

fruits = ["apple", "banana", "cherry"]
fruits.each_with_index do |fruit, index|
puts "#{index}: #{fruit}"
...

변수가 2개(fruitindex)가 됩니다.

참고로 each.with_index(1)로 하면 1부터 시작하게 할 수도 있습니다.

fruits.each.with_index(1) do |fruit, index|
puts "#{index}: #{fruit}"
end
...

이것이 처음에는 특히 혼란스러웠습니다. each는 원래의 배열을 그대로 반환하지만, 다음 메서드는 새로운 배열을 만들어 반환합니다.

numbers = [1, 2, 3, 4, 5]
doubled = numbers.map do |n|
n * 2
...

each와의 차이점은 반환값(戻り値)입니다.

# each의 반환값 → 원래의 배열
result = [1, 2, 3].each { |n| n * 2 }
p result # [1, 2, 3] ← 변하지 않는다!
...

"each 안에서 n * 2를 하고 있는데, 왜 결과가 변하지 않는 거지?"라고 생각할지도 모릅니다.

each는 블록 내에서 계산하더라도, 그 결과를 버리고 있습니다. each의 역할은 "모든 요소를 순서대로 처리하는 것"이지, "새로운 값을 모으는 것"이 아니기 때문입니다.

each의 동작:
1 → n * 2 = 2 → 쓰레기통으로
2 → n * 2 = 4 → 쓰레기통으로
...

계산 결과를 사용하고 싶다면 puts로 출력하거나, map으로 받는 것 중 하나를 선택해야 합니다.

# 출력하고 싶을 뿐 → puts를 사용
[1, 2, 3].each { |n| puts n * 2 }
# 2
...

each는 "처리를 흘려보낼 뿐", map은 "처리 결과를 모은다"라고 기억하면 구분하기 쉽습니다.

포인트: map은 블록의 마지막 평가값이 새로운 배열의 요소가 됩니다. puts를 써버리면 반환값(return value)이 nil이 되므로 주의해야 합니다.

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = numbers.select do |n|
n.even? # 짝수인지 아닌지
...

select는 블록의 평가가 true가 된 요소만을 모은 새로운 배열을 반환합니다.

반대로, 조건에 맞지 않는 요소를 추출하는 reject도 있습니다.

odd_numbers = numbers.reject { |n| n.even? }
p odd_numbers # [1, 3, 5]

경쟁 프로그래밍(Competitive Programming)이나 데이터 처리에서 자주 사용합니다. 처음 봤을 때는 "이게 뭐야?" 싶었지만, 의외로 편리합니다.

numbers = [1, 2, 3, 4, 5]
numbers.each_cons(3) do |group|
p group
...

"3개의 연속된 요소를 슬라이드하며 추출한다"는 이미지입니다.

반복 도중에 빠져나가거나, 건너뛰는 방법입니다.

명령동작
break루프를 도중에 빠져나감
next이번 처리를 스킵하고 다음으로 진행
# break의 예: 2를 발견하면 루프를 빠져나감
[1, 2, 3].each do |n|
break if n == 2
...

배열뿐만 아니라, 해시(Hash)에도 each를 사용할 수 있습니다. 변수가 2개가 된다는 점이 포인트입니다.

person = { name: "Taro", age: 25, city: "Tokyo" }
person.each do |key, value|
puts "#{key}: #{value}"
...
메서드무엇을 하는가?반환값
each요소를 하나씩 처리원래의 객체
foreach와 동일 (잘 사용하지 않음)원래의 객체
timesN번 반복반복 횟수 (Integer)
each_with_index요소와 인덱스를 처리원래의 객체
map모든 요소를 변환새로운 배열
select조건에 맞는 요소를 추출새로운 배열
reject조건에 맞지 않는 요소를 추출새로운 배열
each_cons(n)n개씩 연속된 요소를 처리nil

처음에 each의 "객체의 요소가 변수에 하나씩 들어간다"라는 이미지를 잡을 수 있으면, 다른 메서드들도 같은 발상으로 읽을 수 있게 됩니다.

"어떻게든 돌아가고 있다"에서 "왜 돌아가는지 알고 사용할 수 있다"로의 스텝업에 조금이라도 도움이 되었다면 기쁘겠습니다.

이 기사는 Claude라는 AI의 지원을 받으며 작성했습니다.

구체적으로는, 제가 "이런 내용을 쓰고 싶다", "이 부분이 어려웠다"라는 경험을 대략적으로 전달하고, 기사의 구성이나 문장을 함께 만들어 나간 느낌입니다.

"each 안에서 n * 2를 하고 있는데 결과가 변하지 않는 이유는 무엇인가?"라는 저의 의문을 그대로 던졌더니, 쓰레기통 비유로 설명해 주어서 "이건 기사에도 넣자"라며 그대로 추가하기도 했습니다.

AI를 사용했다고 해서 손을 놓은 것이 아니라, 제가 실제로 막혔던 경험과 깨달은 포인트가 중심이 되어 있습니다. 오히려 "제 자신의 언어로 전달하고 싶은 것"을 AI가 정리하고 살을 붙여주는 이미지로, 아웃풋(Output)의 허들이 상당히 낮아졌습니다.

엔지니어 공부에서도 AI를 잘 사용하는 것이 당연해진 시대이기에, 이런 방식도 괜찮다고 생각합니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0