반응형
2. 제어문과 반복문
가장 흔히 쓰이는게 if 문이죠? 먼저 다루어 보도록 하겠습니다.
대강결과는 이렇군요. 한줄로 쓸땐 then 을 쓴다는것과 끝은 end 로 끝나야 된다는 정도를 제외하곤 다른 언어들과 큰차이는 없습니다.
다만 이런 형식의 문장은 처음봤을땐 제 경우는 좀 놀랍더군요. 'puts "a=1" if a==1' 조건문은 언제나 앞에 써야 한다는 고정관념을 날려버렸던 문장이었습니다. 그러고 보니 perl에서도 이게 가능했나 안했나 가물가물 하군요.
이번엔 for 문과 each 문을 보도록 하겠습니다.
흔히 쓰는 1부터 100까지의 합을 구하는 문제입니다. 일단 a 변수에 합계를 더할테니 0으로 초기화 시키고
(1..100) 은 range 값입니다. 즉 1부터 100까지 숫자를 나타내는 겁니다. 1부터 50까지면 (1..50) 으로 쓰면 되겠지요.
루비는 모든것이 객체라는 말을 했었지요? 따라서 (1..100) 도 객체이고 그런 객체의 each 문을 사용한겁니다. each문을 한줄로 쓸때는 저렇게 '{' 중괄호를 이용합니다. 여러줄로 쓸때는 do~end 를 사용하죠.
이런식으로 쓰면 됩니다.
for 문을 써보도록 하겠습니다.
아마 python을 좀 보신분이라면 익숙하실 것 같습니다. 내용은 굳이 설명할 필요도 없겠지요.
혹시나 싶어서 이야기 하자면 for 문이나 each문에서 숫자를 예로 들었는데 당연히 숫자가 아닌것도 가능합니다.
리스트의 값에서 문자를 하나씩 가져옵니다.
while 문 역시 다른 언어들과 비슷합니다.
이 예는 break 까지 설명하기 위해 적었습니다. x가 5이면 루프를 탈출합니다. 다른언어에도 많이 있죠? 이 외에도 next 나 redo 가 있습니다. 사용방법은 영어 그대로이니 따로 설명안하겠습니다.
그외에 while 문과 비슷한 until 문이라던가 if 문과 비슷한 unless 문도 있지만 생략하겠습니다. 대충 짐작하실수 있을거라고 생각하고요...
마지막으로 반복문을 좀 보충해 보겠습니다. 다른언어에 없는 사용법입니다.
숫자.times 하고 블럭을 만들면 그 블럭이 숫자만큼 반복 실행 됩니다. 말그대로 숫자만큼 반복해라...라는게 되는거죠.
여기선 puts 대신 print를 썼는데 결과를 보시면 아시겠지만 print 는 줄바꿈을 하지 않습니다.
위에서 x 값은 1부터 10까지 값을 갖게 됩니다. 굳이 이렇게 쓸일은 없을지도...
그러면 1부터 10까지의 짝수의 합은 어떻게 구할 수 있을까요?
step 을 쓰면 되겠군요. x 값은 0부터 10까지 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
=> 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
=> 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
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
=> 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
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
=> 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
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
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
=> 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 |