RPGXP [스크립트기초] 제 3과. 조건분기와 루프.
2006.05.24 09:48
2000, 2003에도 이벤트커맨드에서 쓰이던 것인만큼 건너뛸까 생각도 해봤지만 기초중에서도 워낙 핵심적인 것인지라 강좌를 하기로 했습니다.
핵심적이긴 하지만 워낙 재미없는 부분이므로 귀차니즘의 압박을 받아 도움말을 토대로 설명하겠습니다. 이해 못하는 부분이 있으면 댓글 달아주세요.
조건분기란?
조건분기란 프로그램의 실행을 제어하는 기능입니다. 특정 조건이 충족되어 있으면 연산을 처리하고 충족되지 않았을 경우 처리하지 않도록 제어하는 것이지요.
비교 연산자
== 동일하다
! = 동일하지 않다
< 작다
> 크다
<= 작거나 같다
>= 크거나 같다
진위값
비교 연산자의 연산 결과는진위값이라고 불립니다. 참인가, 거짓인가의 두 상태로 결정됩니다.
참이면 true, 거짓이면 false입니다.
예문:
p ("안녕하세요 " == "안녕하세요 ") # => true
p ("안녕하세요 " == "안녕하세요 ") # => false
p (3 + 1 == 3 + 5) # => false
p (3 + 1 == 2 + 2) # => true
논리연산자
and
&& 「이고」
or
|| 「이거나」
not
! 「아님」
예문
p (100 > 77 and 1 + 1 == 2) # => true
p (100 > 77 && 1 + 1 == 2) # => true
위의 경우, 77은 100보다 "작고" 1+1은 2와 같다는 것은 참이기 때문에 true가 산출됩니다.
예문
p (1 + 1 == 3 or 2 + 2 == 3) # => false
p (1 + 1 == 3 || 2 + 2 == 3) # => false
위의 경우 1+1은 3이 아니고, 2+2도 3이 아니므로 false가 산출됩니다.
예문
p (1 + 1 == 2 or 2 + 2 == 3) # => true
p (1 + 1 == 2 || 2 + 2 == 3) # => true
둘 중 하나만 참이면, "이거나"의 논리가 적용되어 true가 산출됩니다.
예문
p (not true) # => false
p (! true) # => false
위와 같이 true 앞에 not 또는 !를 붙혀주면 false가 산출됩니다.
예문
p (not false) # => true
p (! false) # => true
거꾸로 해주면 정반대가 산출되지요.
if문의 이해.
if를 사전에서 찾아보면 "만일"이라는 뜻입니다.
조건분기는 if로 시작해서 end로 끝납니다.
예문:
a = 20 # 변수 a 에 20 을 대입한다.
if a >= 10 # 만약 a 가 10 이상이면,
print "big" # big 와 표시한다.
end # 분기 종료.
a는 20이고, 20은 10보다 크기 때문에 big이 출력됩니다.
else의 이해
else를 사전에서 찾아보면 "그 외의 경우"를 뜻합니다.
예문
a = 7 # 변수 a 에 7 을 대입한다.
if a >= 10 # 만약 a 가 10 이상이면,
print "big" # big 와 표시한다.
elsif a >= 5 # 그 이외로 a 가 5 이상이면,
print "medium" # medium 와 표시한다.
else # 그 이외이면,
print "small" # small 와 표시한다.
end # 분기 종료.
따라서 결과적으로, a는 7이고 7은 10보다는 작고 5보다는 크기 때문에 medium이 출력됩니다.
unless문의 이해
unless의 뜻을 사전에서 찾아봅시다. ㅡ.ㅡ;;;
if의 뜻은 "만일 ~이라면", unless는 그 반대인, "만일 ~이 아니라면"을 뜻합니다.
예문을 들어서 설명하겠습니다.
if a > 10
p 11
else
p 9
end
위의 식과 아래의 식은 같은 뜻입니다. 위의 경우 a가 10보다 크면 11을 출력, 아닌 경우 9를 출력하고, 아래의 식의 경우 역시 a가 10과 같거나 더 작은 경우 9를 출력 (즉, a가 10보다 크지 않은 경우), 그리고 a가 10과 같거나 더 작은 경우가 아닌 경우 (즉, a가 10보다 큰 경우) 11을 출력합니다.
unless a > 10
p 9
else
p 11
end
if문을 사용할 경우 elsif를 사용할 수 있으나, unless문에서는 elsif를 사용할 수 없습니다. 그러나 편법은 당연히 존재하지요.
unless a > 10
p 9
else
if a < 15
p 11
else
p 16
end
end
이렇게 else와 end 사이에 if를 넣어주면 elsif와 같은 효과를 볼 수 있습니다. 그러나 end와 end 사이에도 명령을 실행시킬 수 있다는 점에서 elsif와 아주 같은 것은 아닙니다.
case문의 이해.
특정의 변수의 값에 의해 분기 시키고 싶은 경우, case 를 사용하는 것이 편리합니다.
a = 0 # 변수 a 에 0 을 대입한다.
case a # 분기 개시.
when 0 # a 가 0 때,
print "굿 " # 굿과 표시한다.
when 1 # a 가 1 때,
print "쵸키 " # 쵸키와 표시한다.
when 2 # a 가 2 때,
print "파 " # 파와 표시한다.
end # 분기 종료.
연습문제: 기존스크립트에서 case문이 쓰인곳을 찾아봅시다. Scene_Battle, Scene_Menu와 Scene_Title에 있습니다.
조건연산자의 이해.
물음표와 콜론이라는 기호를 사용합니다.
? 물음표
: 콜론
a = 3
p (a >= 10 ? "big" : "small") # => "small"
저것의 뜻은 a가 10과 같거나 큰가?
하고 우선 물어준 후, 답이 "예"일 경우, big, "아니오"일 경우 small을 출력합니다.
if문을 사용한 아래 예문과 같은 뜻입니다.
a = 3
if a >= 10
p "big"
else
p "small"
end
사용법을 뽑자면...
p (조건? 참일 경우 : 거짓일 경우)
조건 연산자는 p외에 다른 명령어나 메소드를 사용할 수도 있습니다. if문보다 훨씬 간결하다는 장점이 있지만, 복잡한 제어구조를 짤 경우 if문이나 case문을 사용할 것을 권합니다.
루프
프로그램에서 말하는 "루프"란, 반복처리를 말합니다. 사전에서 loop을 찾아보면 역시 반복처리의 의미가 있습니다. 조건분기가 end로 끝나듯 이것도 끝에 end를 붙혀줘야 합니다. end까지 가면 다시 처음으로 가서 반복처리를 하는 기능이지요.
while문의 이해.
특정의 조건이 채워지고 있는 동안 루프 시키고 싶은 경우, while 를 사용합니다.
a = 0 # 변수 a 에 0 을 대입한다.
i = 1 # 변수 i 에 1 을 대입한다.
while i <= 5 # 변수 i 가 5 이하의 사이 루프 시켜,
a += i # 변수 a 에 각각의 i 의 값을 가산한다.
i += 1 # 변수 i 의 값을 1 늘린다.
end # 루프 종료.
p a # 계산 결과를 표시한다.
반복처리 모양새는 아래와 같습니다.
루프 a 의 값 i 의 값
초기 상태 0 1
1 주 후 1 2 # 0+1, 1+1
2 주 후 3 3 # 1+2, 2+1
3 주 후 6 4 # 3+3, 3+1
4 주 후 10 5 # 6+4, 4+1
5 주 후 15 6 # 10+5, 5+1
연습문제: 스크립트의 Main에서 while이 쓰이는 곳을 찾아봅시다.
범위 오브젝트의 이해
수치의 범위, 예를 들어 「1 에서 5 까지」라고 하는 것 같은 개념을 나타내는 것을 범위오브젝트라고 부릅니다.
1..5
1에서 5까지, 5를 포함.
1...5
1에서 5까지, 5를 포함하지 않음.
for문의 이해
범위 오브젝트를 사용해서 루프를 할 때는 for문을 사용합니다.
a = 0 # 변수 a 에 0 을 대입한다.
for i in 1..5 # 변수 i 를 1 에서 5 까지의 범위로 변화 시켜,
a += i # 변수 a 에 각각의 i 의 값을 가산한다.
end # 루프 종료.
p a # 계산 결과를 표시한다.
연습문제: 기존 스크립트에서 for문이 쓰이는 곳을 찾아봅시다.
도움말에서 RPG::Actor라는 곳을 찾아서
for i in 1..99
@parameters[0, i] = 500+i*50
@parameters[1, i] = 500+i*50
@parameters[2, i] = 50+i*5
@parameters[3, i] = 50+i*5
@parameters[4, i] = 50+i*5
@parameters[5, i] = 50+i*5
end
이것이 무엇을 하는 것인지 이해합시다.
loop문의 이해
i = 0 # 변수 i 에 0 을 대입한다.
loop do # 루프 개시.
i += 1 # 변수 i 의 값을 1 늘린다.
p i # 변수 i 의 값을 표시한다.
end # 루프 종료.
반복하는 횟수나 조건이 없는 루프를 만들 때 사용합니다. 즉, 끝없이 돌아가는 루프지요.
그러나 "무조건적으로" 끝없이 돌아가면...ㅡ.ㅡ;;;; 그게 프로그램인가... 바이러스지... 따라서 break라는 것으로 루프를 중단시킬 수 있습니다. 역시 아까 배운 if문을 사용해서 조건을 걸어주는 겁니다.
i = 0 # 변수 i 에 0 을 대입한다.
loop do # 루프 개시.
i += 1 # 변수 i 의 값을 1 늘린다.
if i == 5 # 만약 변수 i 의 값이 5 라면,
break # 루프를 중단한다.
end # 조건 분기 종료.
p i # 변수 i 의 값을 표시한다.
end # 루프 종료.
break는 while, for에서도 사용가능합니다.
next의 이해
루프 중간에서 건너뛰고 싶을 때는 next를 사용합니다.
아래 예문에서는 i가 3일 때 건너뛰고 4로 넘어가게 되어 있습니다.
for i in 1..5 # 변수 i 를 1 에서 5 까지의 범위로 변화 시켜,
if i == 3 # 만약 변수 i 의 값이 3 이라면,
next # 다음의 반복에.
end # 조건 분기 종료.
p i # 변수 i 의 값을 표시한다.
end # 루프 종료.
즉, 1, 2, (3 건너뛰고) 4, 5 이렇게 출력되지요.
간단하죠?
핵심적이긴 하지만 워낙 재미없는 부분이므로 귀차니즘의 압박을 받아 도움말을 토대로 설명하겠습니다. 이해 못하는 부분이 있으면 댓글 달아주세요.
조건분기란?
조건분기란 프로그램의 실행을 제어하는 기능입니다. 특정 조건이 충족되어 있으면 연산을 처리하고 충족되지 않았을 경우 처리하지 않도록 제어하는 것이지요.
비교 연산자
== 동일하다
! = 동일하지 않다
< 작다
> 크다
<= 작거나 같다
>= 크거나 같다
진위값
비교 연산자의 연산 결과는진위값이라고 불립니다. 참인가, 거짓인가의 두 상태로 결정됩니다.
참이면 true, 거짓이면 false입니다.
예문:
p ("안녕하세요 " == "안녕하세요 ") # => true
p ("안녕하세요 " == "안녕하세요 ") # => false
p (3 + 1 == 3 + 5) # => false
p (3 + 1 == 2 + 2) # => true
논리연산자
and
&& 「이고」
or
|| 「이거나」
not
! 「아님」
예문
p (100 > 77 and 1 + 1 == 2) # => true
p (100 > 77 && 1 + 1 == 2) # => true
위의 경우, 77은 100보다 "작고" 1+1은 2와 같다는 것은 참이기 때문에 true가 산출됩니다.
예문
p (1 + 1 == 3 or 2 + 2 == 3) # => false
p (1 + 1 == 3 || 2 + 2 == 3) # => false
위의 경우 1+1은 3이 아니고, 2+2도 3이 아니므로 false가 산출됩니다.
예문
p (1 + 1 == 2 or 2 + 2 == 3) # => true
p (1 + 1 == 2 || 2 + 2 == 3) # => true
둘 중 하나만 참이면, "이거나"의 논리가 적용되어 true가 산출됩니다.
예문
p (not true) # => false
p (! true) # => false
위와 같이 true 앞에 not 또는 !를 붙혀주면 false가 산출됩니다.
예문
p (not false) # => true
p (! false) # => true
거꾸로 해주면 정반대가 산출되지요.
if문의 이해.
if를 사전에서 찾아보면 "만일"이라는 뜻입니다.
조건분기는 if로 시작해서 end로 끝납니다.
예문:
a = 20 # 변수 a 에 20 을 대입한다.
if a >= 10 # 만약 a 가 10 이상이면,
print "big" # big 와 표시한다.
end # 분기 종료.
a는 20이고, 20은 10보다 크기 때문에 big이 출력됩니다.
else의 이해
else를 사전에서 찾아보면 "그 외의 경우"를 뜻합니다.
예문
a = 7 # 변수 a 에 7 을 대입한다.
if a >= 10 # 만약 a 가 10 이상이면,
print "big" # big 와 표시한다.
elsif a >= 5 # 그 이외로 a 가 5 이상이면,
print "medium" # medium 와 표시한다.
else # 그 이외이면,
print "small" # small 와 표시한다.
end # 분기 종료.
따라서 결과적으로, a는 7이고 7은 10보다는 작고 5보다는 크기 때문에 medium이 출력됩니다.
unless문의 이해
unless의 뜻을 사전에서 찾아봅시다. ㅡ.ㅡ;;;
if의 뜻은 "만일 ~이라면", unless는 그 반대인, "만일 ~이 아니라면"을 뜻합니다.
예문을 들어서 설명하겠습니다.
if a > 10
p 11
else
p 9
end
위의 식과 아래의 식은 같은 뜻입니다. 위의 경우 a가 10보다 크면 11을 출력, 아닌 경우 9를 출력하고, 아래의 식의 경우 역시 a가 10과 같거나 더 작은 경우 9를 출력 (즉, a가 10보다 크지 않은 경우), 그리고 a가 10과 같거나 더 작은 경우가 아닌 경우 (즉, a가 10보다 큰 경우) 11을 출력합니다.
unless a > 10
p 9
else
p 11
end
if문을 사용할 경우 elsif를 사용할 수 있으나, unless문에서는 elsif를 사용할 수 없습니다. 그러나 편법은 당연히 존재하지요.
unless a > 10
p 9
else
if a < 15
p 11
else
p 16
end
end
이렇게 else와 end 사이에 if를 넣어주면 elsif와 같은 효과를 볼 수 있습니다. 그러나 end와 end 사이에도 명령을 실행시킬 수 있다는 점에서 elsif와 아주 같은 것은 아닙니다.
case문의 이해.
특정의 변수의 값에 의해 분기 시키고 싶은 경우, case 를 사용하는 것이 편리합니다.
a = 0 # 변수 a 에 0 을 대입한다.
case a # 분기 개시.
when 0 # a 가 0 때,
print "굿 " # 굿과 표시한다.
when 1 # a 가 1 때,
print "쵸키 " # 쵸키와 표시한다.
when 2 # a 가 2 때,
print "파 " # 파와 표시한다.
end # 분기 종료.
연습문제: 기존스크립트에서 case문이 쓰인곳을 찾아봅시다. Scene_Battle, Scene_Menu와 Scene_Title에 있습니다.
조건연산자의 이해.
물음표와 콜론이라는 기호를 사용합니다.
? 물음표
: 콜론
a = 3
p (a >= 10 ? "big" : "small") # => "small"
저것의 뜻은 a가 10과 같거나 큰가?
하고 우선 물어준 후, 답이 "예"일 경우, big, "아니오"일 경우 small을 출력합니다.
if문을 사용한 아래 예문과 같은 뜻입니다.
a = 3
if a >= 10
p "big"
else
p "small"
end
사용법을 뽑자면...
p (조건? 참일 경우 : 거짓일 경우)
조건 연산자는 p외에 다른 명령어나 메소드를 사용할 수도 있습니다. if문보다 훨씬 간결하다는 장점이 있지만, 복잡한 제어구조를 짤 경우 if문이나 case문을 사용할 것을 권합니다.
루프
프로그램에서 말하는 "루프"란, 반복처리를 말합니다. 사전에서 loop을 찾아보면 역시 반복처리의 의미가 있습니다. 조건분기가 end로 끝나듯 이것도 끝에 end를 붙혀줘야 합니다. end까지 가면 다시 처음으로 가서 반복처리를 하는 기능이지요.
while문의 이해.
특정의 조건이 채워지고 있는 동안 루프 시키고 싶은 경우, while 를 사용합니다.
a = 0 # 변수 a 에 0 을 대입한다.
i = 1 # 변수 i 에 1 을 대입한다.
while i <= 5 # 변수 i 가 5 이하의 사이 루프 시켜,
a += i # 변수 a 에 각각의 i 의 값을 가산한다.
i += 1 # 변수 i 의 값을 1 늘린다.
end # 루프 종료.
p a # 계산 결과를 표시한다.
반복처리 모양새는 아래와 같습니다.
루프 a 의 값 i 의 값
초기 상태 0 1
1 주 후 1 2 # 0+1, 1+1
2 주 후 3 3 # 1+2, 2+1
3 주 후 6 4 # 3+3, 3+1
4 주 후 10 5 # 6+4, 4+1
5 주 후 15 6 # 10+5, 5+1
연습문제: 스크립트의 Main에서 while이 쓰이는 곳을 찾아봅시다.
범위 오브젝트의 이해
수치의 범위, 예를 들어 「1 에서 5 까지」라고 하는 것 같은 개념을 나타내는 것을 범위오브젝트라고 부릅니다.
1..5
1에서 5까지, 5를 포함.
1...5
1에서 5까지, 5를 포함하지 않음.
for문의 이해
범위 오브젝트를 사용해서 루프를 할 때는 for문을 사용합니다.
a = 0 # 변수 a 에 0 을 대입한다.
for i in 1..5 # 변수 i 를 1 에서 5 까지의 범위로 변화 시켜,
a += i # 변수 a 에 각각의 i 의 값을 가산한다.
end # 루프 종료.
p a # 계산 결과를 표시한다.
연습문제: 기존 스크립트에서 for문이 쓰이는 곳을 찾아봅시다.
도움말에서 RPG::Actor라는 곳을 찾아서
for i in 1..99
@parameters[0, i] = 500+i*50
@parameters[1, i] = 500+i*50
@parameters[2, i] = 50+i*5
@parameters[3, i] = 50+i*5
@parameters[4, i] = 50+i*5
@parameters[5, i] = 50+i*5
end
이것이 무엇을 하는 것인지 이해합시다.
loop문의 이해
i = 0 # 변수 i 에 0 을 대입한다.
loop do # 루프 개시.
i += 1 # 변수 i 의 값을 1 늘린다.
p i # 변수 i 의 값을 표시한다.
end # 루프 종료.
반복하는 횟수나 조건이 없는 루프를 만들 때 사용합니다. 즉, 끝없이 돌아가는 루프지요.
그러나 "무조건적으로" 끝없이 돌아가면...ㅡ.ㅡ;;;; 그게 프로그램인가... 바이러스지... 따라서 break라는 것으로 루프를 중단시킬 수 있습니다. 역시 아까 배운 if문을 사용해서 조건을 걸어주는 겁니다.
i = 0 # 변수 i 에 0 을 대입한다.
loop do # 루프 개시.
i += 1 # 변수 i 의 값을 1 늘린다.
if i == 5 # 만약 변수 i 의 값이 5 라면,
break # 루프를 중단한다.
end # 조건 분기 종료.
p i # 변수 i 의 값을 표시한다.
end # 루프 종료.
break는 while, for에서도 사용가능합니다.
next의 이해
루프 중간에서 건너뛰고 싶을 때는 next를 사용합니다.
아래 예문에서는 i가 3일 때 건너뛰고 4로 넘어가게 되어 있습니다.
for i in 1..5 # 변수 i 를 1 에서 5 까지의 범위로 변화 시켜,
if i == 3 # 만약 변수 i 의 값이 3 이라면,
next # 다음의 반복에.
end # 조건 분기 종료.
p i # 변수 i 의 값을 표시한다.
end # 루프 종료.
즉, 1, 2, (3 건너뛰고) 4, 5 이렇게 출력되지요.
간단하죠?
|+rp2+|22|+rp3+|manual