Ruby / / 2022. 12. 22. 22:46

Ruby on Rails 6 : Ruby 문법 톺아보기 4 - 반복문

저번 글에서 말했다 싶이, Ruby on Rails는 Ruby를 기반으로 한 풀 프레임워크입니다. 그렇기에 어느정도 Ruby 언어에 대한 숙지가 필요합니다. 저번 글에 이어서 대략 3~4개 정도의 글을 Ruby 언어에 대한 간략한 톺아보기로 채워보려고 합니다. 이번 시간에는 반복문 등을 함께 보기로 하겠습니다.

블록

잠깐 블록에 대해 짚고 넘어가겠습니다. 블록은 하나의 덩어리로 인자를 넘기고 그 인자가 처리되는 스코프(Scope)라고 봐주시면 편할 것 같습니다. 이 블록에 대해 잠시 이해를 해보기 전에 JavaScript에서의 반복문 - for 문 - 에 대해서 이야기해보려고 합니다.

 

JavaScript에서의 반복문

var numbers = [1, 2, 3, 4];
var sum = 0;
for (var i = 0; i < numbers.length; i++) {
	sum += numbers[i];
}
console.log(sum)
//=> 10

위의 예시처럼 for문은 하나의 블록으로 볼 수 있으며, 그 블록에 넘겨지는 인자는 numbers라고 볼 수 있습니다. 또한 최근에는 다음과 같은 forEach가 사용됩니다.

const numbers = [1, 2, 3, 4];
let sum = 0;
numbers.forEach(function(n) {
	sum += n;
})
console.log(sum);
//=> 10

 

Ruby에서의 반복문

Ruby에도 for문이 있지만, 대부분의 개발자들은 이 for문을 잘 사용하지 않습니다. 대신 여기서 등장하는 것이 위의 JavaScript의 forEach같은 each 메소드 입니다. 

numbers = [1, 2, 3, 4]
sum = 0
numbers.each do |n|
	sum += n
end
sum #=> 10

numbers.each가 여기서 for문과 같은 역할을 합니다. 여기서 블록의 개념이 등장하기도 합니다. 먼저 each 메소드의 역할은 numbers의 요소들을 하나하나씩 처음부터 마지막까지 순서대로 꺼내는 것입니다. 하지만, 꺼낸 요소를 어떻게 사용할 것인가는, 블록에다가 쓴 코드에 따라 처리 방법이 달라집니다. 위의 코드에서는 do부터 end까지가 블록의 범위입니다.

 

numbers.each do |n|

    sum += n

end

 

|n|에서 n은 블록 파라메터(Block Parameter)라고 불리웁니다. 블록 내부에는 자유롭게 코드를 쓰면 되고, 위의 예시에서는 sum += n을 쓴 것입니다. JavaScript의 콜백 함수와 비슷해 보이지만 다른 점이라면, 메소드에 전달할 수 있는 블록 개수는 단 한개밖에 없습니다.

 

자유로운 반복문 다루기

배열에서 특정 조건으로 요소 삭제하기

이제 다시 한번 irb를 켜서 이야기해보겠습니다.

위의 예시처럼, a라는 배열에서 2를 삭제하고 싶을 때, a.delete(2)를 사용하면 배열 내의 모든 2를 삭제할 수 있습니다. 하지만 2가아닌, 2의 배수를 삭제하고 싶을 때는 어떻게 해야될까요? 기존에 제공하는 메소드로는 처리할 수 없습니다. 그래서 여기에는 delete_if라는 조건문을 걸어서 2의 배수만 남길 수 있습니다.

delete_if는 each메소드와 똑같이 배열의 요소를 순서대로 꺼냅니다. 그리고 그 요소를 블록에 전달합니다. 그래서 위의 each처럼 1, 2, 3, 1, 2, 3이 똑같이 블록 즉 statement가 쓰인 곳에 전달됩니다. 이때 delete_if는 블록에서 돌아온 값을 체크합니다. 여기서 n.odd?를 체크하게되고, n.odd?는 n이 짝수인지 아닌지를 체크해서 Boolean값을 반환합니다. 그래서 2의 경우만 true가 반환되게 됩니다.

 

그렇다면 여기서 다시한번 블록 파라메터는 n만 써도 되는지 등등 한번 이야기해보겠습니다.

 

아래 n, number, element모두 같은 역할을 한다.

numbers.each do |n|
	sum += n
end

numbers.each do |number|
	sum += number
end

numbers.each do |element|
	sum += element
end

만약 블록 파라메터를 사용하지 않으면 삭제해도 아무 문제 없습니다.

 

아래와 같이 자유롭게 블록에 무엇을 적든 상관 없습니다.

하지만 위의 sum_value의 경우 블록 내에서만 유효한 변수이기 때문에 블록 밖에서 사용할 경우 에러를 뿜게 됩니다.

 

do...end 그리고 {}

numbers = [1,2,3,4]
sum = 0
numbers.each do |n| sum += n end

numbers = [1,2,3,4]
sum = 0
numbers.each { |n| sum += n }

do...end의 경우 한줄로도 작성이 가능하나, 보기가 불편하다는 단점이 있습니다. 그래서 위와 같이 do와 end를 생략하고 {}로 감싸서 간단하고 보기좋게 표현할 수 있습니다. 그래서 위와 같이 코드를 짤 때 좋은 기준이 있습니다.

  1. 만약 개행을 하거나, 여러 줄을 써야할 경우 do...end를 쓰자
  2. 만약 한줄로 된 코드를 작성하게 되면 {}로 쓰자

Summary

이렇듯 이번 글에서는 반복문에 대해 알아보았습니다. 다음 시간에는 Range에 대해 알아보겠습니다. 감사합니다.

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유