반응형
2. 제어문과 반복문

가장 흔히 쓰이는게 if 문이죠? 먼저 다루어 보도록 하겠습니다.

irb(main):027:0> a=1
=> 1
irb(main):028:0> puts "a=1" if a==1
a=1
=> nil
irb(main):029:0> if a==1 then puts "a=1"
irb(main):030:1> end
a=1
=> nil
irb(main):031:0> if a==1 then puts "a=1" end
a=1
=> nil
irb(main):032:0> if a==1
irb(main):033:1> puts "a=1"
irb(main):034:1> end
a=1
=> nil


대강결과는 이렇군요. 한줄로 쓸땐 then 을 쓴다는것과 끝은 end 로 끝나야 된다는 정도를 제외하곤 다른 언어들과 큰차이는 없습니다.

다만 이런 형식의 문장은 처음봤을땐 제 경우는 좀 놀랍더군요. 'puts "a=1" if a==1'  조건문은 언제나 앞에 써야 한다는 고정관념을 날려버렸던 문장이었습니다. 그러고 보니 perl에서도 이게 가능했나 안했나 가물가물 하군요.

이번엔 for 문과 each 문을 보도록 하겠습니다.

irb(main):049:0> a=0
=> 0
irb(main):050:0> (1..100).each {|x| a+=x}
=> 1..100
irb(main):051:0> a
=> 5050


흔히 쓰는 1부터 100까지의 합을 구하는 문제입니다. 일단 a 변수에 합계를 더할테니 0으로 초기화 시키고
(1..100) 은 range 값입니다. 즉 1부터 100까지 숫자를 나타내는 겁니다. 1부터 50까지면 (1..50) 으로 쓰면 되겠지요.
루비는 모든것이 객체라는 말을 했었지요? 따라서 (1..100) 도 객체이고 그런 객체의 each 문을 사용한겁니다. each문을 한줄로 쓸때는 저렇게 '{' 중괄호를 이용합니다. 여러줄로 쓸때는 do~end 를 사용하죠.

irb(main):056:0> (1..100).each do |x|
irb(main):057:1* a+=x
irb(main):058:1> end
=> 1..100
irb(main):059:0> a
=> 5050


이런식으로 쓰면 됩니다.

for 문을 써보도록 하겠습니다.

irb(main):075:0> a=0
=> 0
irb(main):076:0> for x in (1..100)
irb(main):077:1> a+=x
irb(main):078:1> end
=> 1..100
irb(main):079:0> a
=> 5050


아마 python을 좀 보신분이라면 익숙하실 것 같습니다. 내용은 굳이 설명할 필요도 없겠지요.

혹시나 싶어서 이야기 하자면 for 문이나 each문에서 숫자를 예로 들었는데 당연히 숫자가 아닌것도 가능합니다.

irb(main):045:0> for x in ["a","b","c","d"]
irb(main):046:1> puts x
irb(main):047:1> end
a
b
c
d


리스트의 값에서 문자를 하나씩 가져옵니다.

while 문 역시 다른 언어들과 비슷합니다.

irb(main):023:0> x=0
=> 0
irb(main):024:0> while x<10 do
irb(main):025:1* x+=1
irb(main):026:1> puts x
irb(main):027:1> break if x==5
irb(main):028:1> end
1
2
3
4
5
=> nil


이 예는 break 까지 설명하기 위해 적었습니다. x가 5이면 루프를 탈출합니다. 다른언어에도 많이 있죠? 이 외에도 next 나 redo 가 있습니다. 사용방법은 영어 그대로이니 따로 설명안하겠습니다.

그외에 while 문과 비슷한 until 문이라던가 if 문과 비슷한 unless 문도 있지만 생략하겠습니다. 대충 짐작하실수 있을거라고 생각하고요...

마지막으로 반복문을 좀 보충해 보겠습니다. 다른언어에 없는 사용법입니다.

irb(main):014:0> 3.times  do
irb(main):015:1* print "hi!!!  "
irb(main):016:1> end
hi!!!  hi!!!  hi!!!  => 3


숫자.times 하고 블럭을 만들면 그 블럭이 숫자만큼 반복 실행 됩니다. 말그대로 숫자만큼 반복해라...라는게 되는거죠.
여기선 puts 대신 print를 썼는데 결과를 보시면 아시겠지만 print 는 줄바꿈을 하지 않습니다.

irb(main):023:0> 1.upto(10) do |x|
irb(main):024:1* a+=x
irb(main):025:1> end
=> 1
irb(main):026:0> a
=> 55


위에서 x 값은 1부터 10까지 값을 갖게 됩니다. 굳이 이렇게 쓸일은 없을지도...

그러면 1부터 10까지의 짝수의 합은 어떻게 구할 수 있을까요?

irb(main):038:0> a=0
=> 0
irb(main):039:0> 0.step(10,2) do |x|
irb(main):040:1* a+=x
irb(main):041:1> end
=> 0
irb(main):042:0> a
=> 30


step 을 쓰면 되겠군요. x 값은 0부터 10까지 2씩 더해 갑니다.


'프로그래밍 > ruby' 카테고리의 다른 글

루비정리> 4. Block  (0) 2009.06.29
루비정리> 3. 클래스  (0) 2009.06.25
루비 정리> 1. 자료형  (0) 2009.06.13
객체지향 스크립트 언어 루비.  (0) 2008.01.25

+ Recent posts