메뉴 건너뛰기

창조도시 기록보관소

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 이렇게 출력되지요.

간단하죠?
번호 제목 글쓴이 날짜 조회 수
54 전직 (제작중인 라르카르 온라인) 펄기아의향기 2009.09.16 444
53 메세지 플러스 3.1 수정버전 암호화 시 나타나는 문제 제거 [8] psh4989 2007.02.19 243
52 RPG_xp업그레이드 팩키지(스크립트, 그래픽)-Final ver [20] file 星の카비 2007.01.13 827
51 스크립트를 이용하여 텍스트색상과 갯수를 바꿔보자 ! [3] file 준돌 2006.12.29 270
50 RPGXP xy의 치명적 문제를 보완하자 [5] A. 미스릴 2006.11.19 727
49 스크립트 실행여부를 알아보거나 스크립트를 봉인시켜보자 [3] A. 미스릴 2006.09.30 456
48 액션 게임을 만들어 보자! [5] 『연금술사』 2006.09.14 1581
47 이런거 올려도 되나? Action Rpg 개념 [3] BB.Crow 2006.08.29 855
46 게임기초 쌓기! [5] 천류지유 2006.08.08 1230
45 [비밀소년] 비공정 스크립트 [6] 비밀소년 2006.07.28 877
44 어떻게 하면 스토리를 잘 구성할수 있을까? [6] Game/over 2006.07.26 1089
43 [스크립트기초] 제 4과. 그림표시, 배열과 해시의 클래스. [1] 천무 2006.05.24 473
42 [스크립트] 배틀포인트, 배틀샵 [1] 천무 2006.05.24 669
41 [스크립트] 창고 시스템 [9] 천무 2006.05.24 621
40 [스크립트] KGC 몬스터도감 [4] 천무 2006.05.24 795
39 [연금술사] 드디어 완성! 스크립트로 점프&데쉬하기 [5] file 천무 2006.05.24 762
38 [비밀소년] 한글이름입력기 v1.76 [6] file 천무 2006.05.24 2117
37 [비밀소년] ◆공부용◆ 01 - 숫자게이지바 [1] file 천무 2006.05.24 683
36 [툴기능] RPG XP로 액알만들기.(스샷) [10] 천무 2006.05.24 1541
» [스크립트기초] 제 3과. 조건분기와 루프. [2] 천무 2006.05.24 222