UDN
Search public documentation:

UnrealScriptControlStructuresKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 언리얼스크립트 > 언리얼스크립트 언어 참고서 > 언리얼스크립트 제어 구조

언리얼스크립트 제어 구조


문서 변경내역: Tim Sweeney 원저. 홍성진 번역.

개요


자주 반복되는 코드 부분이나 특정 요소에 따라 달라지는 상황에 각기 다른 코드를 실행시키는 기능이 필요합니다. UnrealScript 는 다양한 제어 구조를 통해 이런 기능을 제공하고 있습니다. 바로 반복(loop), 조건문, switch 문 등입니다.

모든 흐름 제어 문에서 대괄호 없이 하나의 문을 실행할 수 있습니다:

// 아주 단순한 "if" 예제입니다.
if( LightBrightness < 20 )
	'log( "My light is dim" );

또는 대괄호로 둘러싸서 여러 문을 실행할 수도 있습니다:

// 조금 단순한 "if" 예제입니다.
if( LightBrightness < 20 )
{
	'log( "My light is dim" );
	'log( "Brightness ="@LightBrightness );
}

일반적으로 문의 수와는 상관없이 대괄호를 써 주는 것이 좋습니다. 코드 읽기가 쉬워지며, 문을 추가하고서 대괄호는 깜빡한 경우 생기는 논리 에러 예방에도 좋습니다.

선택 구조


선택 구조로 변수의 값, 표현식의 값 등 일정한 조건에 따라 코드의 흐름 방향을 결정할 수 있습니다.

If 문

if 문은 일정한 조건이 만족되면 코드를 실행시킵니다. 가장 간단한 형태는 if 문에 조건이 하나 달린 경우입니다. 여러 조건을 검사하려면 첫 if 문 뒤에 else if 문을 사용하여 조건을 각각 붙이면 됩니다. 마지막으로 모든 것을 잡는 else 문을 사용하여, 앞서 만족된 조건이 없는 경우에 실행시킬 코드 블럭을 지정할 수 있습니다.

// 단순한 "if" 예제입니다.
if( LightBrightness < 20 )
   log( "My light is dim" );

// "if-else" 예제입니다.
if( LightBrightness < 20 )
   log( "My light is dim" );
else
   log( "My light is bright" );

// "if-else if-else" 예제입니다.
if( LightBrightness < 20 )
   log( "My light is dim" );
else if( LightBrightness < 40 )
   log( "My light is medium" );
else if( LightBrightness < 60 )
   log( "My light is kinda bright" );
else
   log( "My light is very bright" );

// 대괄호가 포함된 "if" 예제입니다.
if( LightType == LT_Steady )
{
   log( "Light is steady" );
}
else
{
   log( "Light is not steady" );
}

위 예제는 모두 같은 변수 값을 검사하는 조건을 사용하나, if/else if 문에 달린 조건은 어떤 식으로든 서로간에 관계가 있을 필요가 없습니다. 일반적으로는 관계가 있는 것이 이치에 맞겠지만, 꼭 그럴 필요는 없습니다.

Switch 문

switch 문은 한 표현식 값에 따라 각기 다른 코드를 실행하는 데 사용됩니다. 이 구조는 swtich 키워드에다 괄호 안에 변수나 표현식을 넣는 것으로 시작됩니다. 올 수 있는 여러가지 값들은 case 키워드에 값과 콜론(:)을 붙여 지정합니다. 각각의 케이스에는, switch 표현식의 값이 case 의 값에 일치할 경우 실행시킬 문을 몇이든 넣을 수 있습니다. break 명령은 실행을 중지하고 switch 문을 빠져나가는 데 씁니다. break 명령이 없으면 swtich 문 끝까지 계속해서 통과시켜가며 실행합니다. 옵션인 default 키워드를 case 를 지정하던 것과 같은 식으로 사용하면, switch 표현식에 일치하는 case 가 없는 경우에 실행시킬 코드를 지정할 수 있습니다.

// switch-case 예제입니다.
function TestSwitch()
{
	// 아래 case 문 중 하나를 실행합니다.
	// LightType 값에 따라서요.
	switch( LightType )
	{
		case LT_None:
			log( "There is no lighting" );
			break;
		case LT_Steady:
			log( "There is steady lighting" );
			break;
		case LT_Backdrop:
			log( "There is backdrop lighting" );
			break;
		default:
			log( "There is dynamic" );
			break;
	}
}

실행을 통과시킬 수 있는 예제는 아래와 같습니다. 코드를 반복하지 않고 여러 값에 대해 같은 코드를 실행시키고자 할 때 좋습니다.

// switch-case 예제입니다.
function TestSwitch2()
{
	switch( LightType )
	{
		case LT_None:
			log( "There is no lighting" );
			break;
		case LT_Steady:   // LT_Backdrop 케이스로 통과됩니다.
		case LT_Backdrop:
			log( "There is lighting" );
			break;
		default:
			log( "Something else" );
			break;
	}
}

반복 구조


반복 구조, 또는 루프 (loop)는 일정한 조건이 충족될 때까지 코드의 일부를 여러가지 방법으로 반복하는 것을 말합니다.

For 루프

for 루프는 일정한 조건이 충족될 때까지 코드 블럭을 반복합니다. for 루프 안에는 세미콜론(;)으로 구분해서 표현식을 셋 지정해야 합니다. 첫 표현식은 변수를 시작 값으로 초기화시키는 용도입니다. 둘째 표현식은 루프가 매번 반복 실행될 때마다 검사할 조건을 나타냅니다. 이 표현식이 참이면 루프를 실행시킵니다. 거짓이면 루프를 중단합니다. 일반적으로 이 조건은 첫 표현식에서 초기화된 변수의 값을 검사합니다. 셋째 표현식은 각 루프 이후, 조건절을 다시 계산하기 전에 실행되는 항입니다. 일반적으로 어떤 방식으로든 첫 표현식에서 초기화된 변수를 변경합니다.

예를 들어:

// "for" 루프 예제입니다.
function ForExample()
{
	local int i;
	log( "Demonstrating the for loop" );
	for( i=0; i<4; i++ )
	{
		log( "The value of i is " $ i );
	}
	log( "Completed with i=" $ i);
}

이 루프의 결과는 이렇습니다:

Demonstrating the for loop
The value of i is 0
The value of i is 1
The value of i is 2
The value of i is 3
Completed with i=4

대부분의 for 루프 표현식이 카운터 업데이트용으로 쓰이긴 하지만, 초기화, 중단, 증가 표현식을 적절히 사용하면 연결(linked) 리스트 탐색같은 고급 작업에 사용할 수도 있습니다.

Do 루프

do 루프는 끝 표현식이 참인 동안 코드 블럭을 반복합니다. 코드 블럭이 한 번 실행될 때까지는 표현식이 계산되지 않으므로, 최소한 한 번은 실행된다는 뜻입니다.

주: 언리얼에서는 (do-while 을 사용하는) C/Java 와 달리 do-until 문법을 사용합니다.

// "do" 루프 예제입니다.
function DoExample()
{
	local int i;
	log( "Demonstrating the do loop" );
	do
	{
		log( "The value of i is " $ i );
		i = i + 1;
	} until( i == 4 );
	log( "Completed with i=" $ i);
}

이 루프의 결과는 이렇습니다:

Demonstrating the do loop
The value of i is 0
The value of i is 1
The value of i is 2
The value of i is 3
Completed with i=4

While 루프

while 루프는 시작 표현식이 참인 동안 코드 블럭을 반복합니다. 매번 코드 블럭을 실행하기 전 코드 블럭이 계산되므로, 시작 조건이 충족되지 않으면 루프가 실행되지 않을 수도 있습니다.

// "while" 루프 예제입니다.
function WhileExample()
{
	local int i;
	log( "Demonstrating the while loop" );
	while( i < 4 )
	{
		log( "The value of i is " $ i );
		i = i + 1;
	}
	log( "Completed with i=" $ i);
}

이 루프의 결과는 이렇습니다:

Demonstrating the do loop
The value of i is 0
The value of i is 1
The value of i is 2
The value of i is 3
Completed with i=4

Continue


continue 명령은 루프의 시작부분으로 되돌려, continue 명령 이후는 실행되지 않습니다. 특정한 경우 루프 코드를 건너뛰도록 하는 데 사용할 수 있습니다.

function ContinueExample()
{
   local int i;
   log( "Demonstrating continue" );
   for( i=0; i<4; i++ )
   {
      if( i == 2 )
         continue;
      log( "The value of i is " $ i );
   }
   log( "Completed with i=" $ i );
}

이 루프의 결과는 이렇습니다:

Demonstrating continue
The value of i is 0
The value of i is 1
The value of i is 3
Completed with i=4

Break


break 명령은 가장 가까운 루프("For" 나 "Do" 나 "While")를 빠져나갑니다.

function BreakExample()
{
   local int i;
   log( "Demonstrating break" );
   for( i=0; i<10; i++ )
   {
      if( i == 3 )
         break;
      log( "The value of i is " $ i );
   }
   log( "Completed with i=" $ i );
}

이 루프의 결과는 이렇습니다:

Demonstrating break
The value of i is 0
The value of i is 1
The value of i is 2
Completed with i=3

참고로 "break" 명령은 ("switch") 조건절 나머지를 건너뛰는데도 사용할 수 있습니다.

Goto


Goto 명령은 현재 함수나 스테이트 내 어딘가에 지정된 라벨로 "이동"하여 거기서부터 실행하는 식으로, 코드 실행 흐름을 임의로 제어할 수 있습니다.

// "goto" 예제입니다.
function GotoExample()
{
	log( "Starting GotoExample" );
	goto Hither;
Yon:
	log( "At Yon" );
	goto Elsewhere;
Hither:
	log( "At Hither" );
	goto Yon;
Elsewhere:
	log( "At Elsewhere" );
}

결과는 이렇습니다:

Starting GotoExample
At Hither
At Yon
At Elsewhere

특정 상황에서, 특히나 스테이트 안에서 유용하게 쓸 수 있지만, 코드 실행 순서를 척 보고 알기가 힘들어지기에 문제가 생길 수 있습니다. 있다 해도 스테이트 코드 이외에서는 이런 방식의 제어 코드를 보기가 거의 힘들텐데, 대부분의 상황에서는 다른 제어 구조에 적합하기 때문입니다.