어떤 조건이 참인 동안 루비에서 특정 작업을 계속 반복시키려 하지만, 얼마동안 반복시켜야 할 지 모르는 경우가 종종 있습니다. 특정 형태의 입력값을 사용자에게 요구하는 경우가 좋은 예시가 되겠군요: 사용자가 계속 잘못된 입력값을 입력한다면, 올바른 입력값을 얻을 때까지 계속해서 여러번 입력을 요구해야 하기 때문이죠.
이런 경우에 while
반복문을 사용합니다. 이 반복문은 만약 특정 조건이 참인 동안(while), 계속해서 해당 코드의 실행을 반복합니다. 그러다가 특정 조건이 거짓으로 판명되는 순간, 반복을 멈춥니다!
1 2 3 4 5 | counter = 1 while counter < 11 puts counter counter = counter + 1 end | cs |
보셨습니까? 반복문이 1부터 10까지의 숫자를 차례로 출력한 뒤 멈췄습니다. 이는 반복문의 조건 수식이 변수 counter
가 11보다 작은 동안 반복을 계속하라는 내용이었기 때문입니다; 반복문이 매번 반복될 때마다 변수 counter
의 값이 1씩 증가하기 떄문에, counter
가 11이 되는 순간 반복이 멈춘 것입니다.
만약 여기서 실수로 변수 counter
의 값을 증가시키지 않으면 어떻게 될까요? 값은 계속해서 1에 머무를 것이고, 반복문은 해당 값이 11보다 작은지 여부를 계속 확인할테니, 반복문은 영원히 끝나지 않을 것입니다. 이를 가리켜 무한 루프(infinite loop)라고 부르며, 프로그램에 충돌을 야기할 것입니다. 무한루프에 빠지지 않도록 항상 주의하세요!
untile
반복문은 while
반복문을 보완하는데요, 일종의 while
반복문의 반대라고 할 수 있습니다: 특정 조건이 거짓
인 동안 해당 코드를 실행시키기 때문입니다. 그러다가 특정 조건이 참이 되는 순간, 반복을 멈춥니다.
1 2 3 4 5 | counter = 1 until counter > 10 puts counter counter = counter + 1 end | cs |
지금까지 counter = counter + 1
과 같은 구문들을 사용해 왔고, 실제로 잘 작동했었습니다. 하지만 어떤 수식이나 표현에는 항상 또 다른 방법이 있다는 것을 앞으로 계속 루비를 배워감에 따라 아시게 될 겁니다.
여기서의 손쉬운 방법은 바로 할당 연산자(assignment operator)를 사용하는 것입니다. 이미 여러분은 하나의 할당 연산자 =
를 알고 계신데요, 이는 변수에 값을 할당할 때 사용되었습니다. 하지만 그 외에도 +=
, -=
, *=
, /=
와 같은 추가적인 할당 연산자를 활용하여 변수의 값을 갱신시킬 수 있습니다. 이를 테면,
counter += 1
위의 코드는 루비에게 이렇게 지시합니다: "변수 counter
에 값 1을 더하고, 더한 값을 변수 counter
에 할당해". 이는 프로그램에서 변수의 값을 간단하게 갱신하는 방법을 제공합니다.
몇몇 프로그래밍 언어들은 증가 연산자로 ++
그리고 --
(각각 값을 1씩 증가 및 감소시킴)을 갖기도 하지만, 루비는 그렇지 않습니다. 이들과 같은 기능을 구현하려면 +=
그리고 -=
을 사용해야 합니다.
만약 코드 안에서 어떤 작업을 몇 번이나 반복해야 할 지 알고 있다면, for
반복문을 사용해야 합니다.
1 2 3 | for num in 1...10 puts num end | cs |
이전 과제에서 for num in 1…10
라는 새로운 구문을 보셨을 겁니다. 이 구문이 루비에게 의미하는 바는 다음과 같습니다: "범위 1부터 10까지 안에서(in) 변수 num
에 대해(for), 뒤따르는 코드 내용을 실행." 뒤따르는 코드는 print "#{num}"
이었으므로, 변수 num가 1부터 9까지의 값을 가져와 한 번에 하나씩 console에 출력되었던 것입니다.
루비가 10이 아니라 9까지 값을 센 이유는 범위를 지정할 때 세 개의 점(.
)을 사용했기 때문입니다; 세 개의 점은 범위 지정에서 마지막 수를 세지말고 제외하라는 뜻입니다: 따라서 for num in 1...10
의 의미는 "1부터 시작해서 10까지, 하지만 10은 포함하지 말고 숫자를 증가시킬 것"이 됩니다. 이와 달리 만약 두 개의 점만 사용하면, 범위 지정의 두 번째 숫자를 포함하여 숫자를 세라는 의미가 됩니다.
지금까지 루비에서 어떤 작업을 반복시키기 위해 사용하는 한 가지 방법을 배웠습니다: 바로 반복문이었죠. 하지만 다른 여러 경우에서도 그렇듯, 루비에서 특정 작업을 반복시키기 위한 방법이 하나 더 있습니다. 바로 반복자(iterator)라고 불리는 것을 이용하면 됩니다.
반복자는 루비 메소드로, 반복적으로 코드 블록을 불러오는 역할을 합니다. 코드 블록은 반복될 지시 사항들을 담고 있으며, 여러분이 원하는 어떤 내용이라도 여기에 포함될 수 있습니다!
가장 간단한 반복자는 loop
메소드입니다. 단순히 loop라고 작성해 넣음으로써 기초적인 반복문(하지만 무한 루프 상태인)을 생성할 수 있습니다.
loop { print "Hello, world!" }
루비에서, 중괄호({}
)는 일반적으로 do
(블록의 시작을 의미)와 end
(블록의 종료를 의미) 키워드로 교체할 수 있습니다. 이를 통해 위의 무한 루프 상태의 반복문을 아래와 같이 다시 작성할 수 있습니다:
i = 0
loop do
i += 1
print "#{i}"
break if i > 5
end
여기서 break
키워드는 마치 석방같은 역할을 합니다: 즉, 반복문이 break의 조건 수식을 만족시키는 순간, 반복을 끝내고 반복문을 탈출합니다.
next
키워드는 반복문 안의 특정 단계를 건너뛰는데 사용됩니다. 예를 들어, 반복문이 짝수를 출력하지 않도록 만들고 싶다면 다음과 같이 작성하면 됩니다:
i = 20
loop do
i -= 1
next if i % 2 == 0
print "#{i}"
break if i <= 0
end
기억하세요, 모듈로 연산자(%
)는 어떤 숫자를 다른 숫자로 나누고 남은 나머지를 값으로 반환합니다; 만약 어떤 숫자를 2로 나눈 뒤 나머지가 0 이라면, 해당 숫자는 짝수라는 의미입니다.
하나의 변수에 여러 값들을 저장하고 싶다고 합시다. 변수는 오직 하나의 값만을 가질 수 있는데, 그렇다면 어떻게해야 할까요?
루비에서는 배열(array)을 사용하여 여러 값을 하나의 변수 안에 담을 수 있습니다. 배열은 대괄호([]
) 사이에 들어있는 요소(items)들의 목록(list)으로, 다음과 같은 형태입니다: [1, 2, 3, 4]
또한 요소들을 순서에 맞게 정렬할 필요없이, 다음과 같이 작성해도 상관없습니다: [10, 31, 19, 400]
잘하셨습니다! 반복자에 관해 잘 이해해 나가고 계십니다.
loop
반복자는 가장 단순한 동시에, 가장 덜 강력합니다. 이보다 더 유용한 반복자는 .each
메소드입니다. 이 메소드는 객체(object)의 각 요소에 한 번에 하나씩 수식을 적용할 수 있습니다. 문법은 다음과 같습니다:
object.each { |item| # 실행할 코드 }
여기서도 마찬가지로 {}
대신 do
와 end
키워드를 사용할 수 있습니다:
object.each do |item| # 실행할 코드 end
코드에서 | |
사이에 위치하는 변수의 이름은 무엇이든 될 수 있습니다: 이는 메소드에서 사용되는 객체의 요소를 임시로 나타내는, 일종의 자리표시자(placeholder)이기 때문입니다.
1 2 3 4 5 6 | array = [1,2,3,4,5] array.each do |x| x += 10 print "#{x}" end | cs |
1 2 3 4 5 6 | odds = [1,3,5,7,9] odds.each do |x| x *= 2 print "#{x}" end | cs |
.times
메소드는 for
반복문의 매우 단순화된 형태라고 할 수 있습니다: 이 메소드는 객체 안의 각 요소들에 대해, 지정된 수 만큼 반복해서 작업을 수행하도록 합니다.
예를 들어, 만약 "Chunky bacon!"
이라는 문자열을 열 번 출력하고 싶다면, 다음과 같이 작성하면 됩니다:
10.times { print "Chunky bacon!" }
마찬가지로 중괄호({}
)는 do
와 end
키워드로 변경할 수 있습니다.
Ruby 실습하기 : https://www.codecademy.com/en/tracks/ruby-ko
'Back-End > Ruby' 카테고리의 다른 글
[Ruby] Codecademy - 4. Thith Meanth War! (0) | 2018.02.13 |
---|---|
[Ruby] Codecademy - 3. 루비에서의 흐름제어(Control Flow) (0) | 2018.02.13 |
[Ruby] Codecademy - 2. Formatter 안에 양식 넣기 (0) | 2018.02.10 |
[Ruby] Codecademy - 1. Ruby 입문 (0) | 2018.02.10 |