메뉴 건너뛰기

창조도시 기록보관소

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

간단하죠?
번호 제목 글쓴이 날짜 조회 수
371 레벨에 따라 값을 더 받아보자! [5] 다크세이버™ 2006.06.05 273
370 강력한 무료 에디터 Elitpad 6.5 file 나라 2006.06.04 138
369 제 2 부 ! 나도 게임을 만들수 있다 ! [5] 다크세이버™ 2006.06.01 320
368 [스크립트기초] 제 4과. 그림표시, 배열과 해시의 클래스. [1] 천무 2006.05.24 473
367 [스크립트] 배틀포인트, 배틀샵 [1] 천무 2006.05.24 669
366 [스크립트] 창고 시스템 [9] 천무 2006.05.24 621
365 [스크립트] KGC 몬스터도감 [4] 천무 2006.05.24 795
364 [연금술사] 드디어 완성! 스크립트로 점프&데쉬하기 [5] file 천무 2006.05.24 762
363 [비밀소년] 한글이름입력기 v1.76 [6] file 천무 2006.05.24 2117
362 [비밀소년] ◆공부용◆ 01 - 숫자게이지바 [1] file 천무 2006.05.24 683
361 [툴기능] RPG XP로 액알만들기.(스샷) [10] 천무 2006.05.24 1541
» [스크립트기초] 제 3과. 조건분기와 루프. [2] 천무 2006.05.24 222
359 [스크립트] 파티원 교체. [2] 천무 2006.05.24 424
358 [스크립트] 스탯포인트로 스테이터스 조절하기입니다. 출처:gunmong [6] 천무 2006.05.24 506
357 [스크립트] 이전의 액알게이지바와는 비교도 안될 멋진 초고속 게이지바 - 그라데이션 [7] 천무 2006.05.24 879
356 [스크립트] 대화창에 이름+얼굴 띄우기: 메시지 플러스 가장 최신버전 (2005년 2월1일 버전) [4] 천무 2006.05.24 755
355 [스크립트] 소지수 한계 돌파 [1] 천무 2006.05.24 250
354 [스크립트] 대화창 크기 위치를 내맘대로! 좀더 간단화 시켰습니다.(소형윈도우 네임도 추가) [1] 천무 2006.05.24 444
353 [스크립트] 전투시 몬스터 머리위로 게이지바 만들기 [6] 천무 2006.05.24 835
352 [스크립트] 레벨과 능력치 한계를 자유자재로. 출처: 모모모 [1] 천무 2006.05.24 384