UDN
Search public documentation:

UnrealScriptExpressionsKR
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 원저. 홍성진 번역.

개요


표현식(expression) 이란 문자 값, 변수, 함수 호출, 연산자 등을 조합한 것을 말합니다. 예를 들어 x + 2, x - y, y = x * 2, SetCollision(true, true, true), x = Gethealth() 같은 것이 모두 표현식입니다. 표현식은 함수 내 모든 코드를 구성하는 것이며, 게임을 이루는 UnrealScript 내 모든 동작을 구동하는 부분입니다. 함수가 실행되면, 함수 내 코드, 그 코드를 구성하는 표현식의 값을 UnrealScript 가상 머신이 구합니다. 대부분의 경우 표현식 값을 구할 때는, 같은 코드 줄 안에 포함된 다른 표현식이 사용할 수 있는 값을 만들어 냅니다. 이런 경우에 대한 예외라면, 값을 반환하지 않는 함수를 호출할 때가 되겠죠.

표현식에서 한 가지 중요한 점은, 연산자(operator) 를 사용한다는 점입니다. 연산자란 본질적으로 입력 하나(단항, unary), 둘(이항, binary), 가끔은 셋(삼항, ternary)에 대해 지정된 연산을 하고 그 결과를 반환하는 특수 함수입니다. 가장 흔히 쓰이는 연산자는 더하기 (+), 빼기 (-), 곱하기 (*), 나누기 (/) 연산자입니다. 산수를 배운 사람이라면 익숙할 것입니다. 이들 모두 좌 우에 입력을 둘 받아 일정한 연산을 합니다. 왼쪽 또는 오른쪽에 입력을 하나만 받는 연산자도 있고, (삼항 연산자같은 경우는) 입력이 셋 필요한 경우도 있습니다.

표현식 몇 개로 구성됐든, UnrealScript 에서 완전한 코드 한 줄은 문(statement) 이라고 합니다.

내장된 연산자


UnrealScript 는 숫자를 서로 더하고, 값을 비교하고, 변수 값을 증가시키고 하는 데 있어 폭넓은 C/C++/Java 스타일의 연산자를 제공합니다. 전체 연산자 세트는 Object.u 에 정의되어 있으며, 이 글은 요약본입니다. 참고로 모든 C 스타일 연산자는 C 에서와 동일한 우선 순위를 갖습니다.

할당 (=)

변수에 값을 할당(assign)하려면 == 연산자를 사용하며, 변수는 그 왼편에, 거기 할당시킬 값은 오른편에 놓습니다:

function Test()
{
   local int i;
   local string s;
   local vector v, q;

   i = 10;		// 정수형 변수 i 에 값을 할당합니다.
   s = "Hello!";	// 문자열 변수 s 에 값을 할당합니다.
   v = q;		// 벡터 q 의 값을 v 에 복사합니다.
}

UnrealScript 에서 함수나 어떤 표현식이 ("float" 같은) 특정 데이터형을 요구하는 곳에 ("int" 같은) 다른 데이터형을 지정할 때마다, 컴파일러는 자동으로 지정된 값을 적절한 유형으로 변환 시도합니다. 모든 숫자형 데이터(byte, int, float)간의 변환은 자동으로 이루어지며, 뭔가 수동으로 해 줄 것은 없습니다. UnrealScript 는 코드에서 명시적으로 변환해 주기만 하면, 다수의 내장 데이터형을 다른 유형으로 변환하는 것도 가능합니다.

function Test()
{
   local int i;
   local string s;
   local vector v, q;
   local rotator r;

   s = string(i);	// 정수형 i 를 문자열로 변환하여 s 에 할당합니다.
   s = string(v);	// 벡터 v 를 문자열로 변환하여 s 에 할당합니다.
   v = q + vector(r);	// 로테이터 r 을 벡터로 변환하여 q 에 더합니다.
}

UnrealScript 에서 자동으로 변환되지 않는 세트는 이렇습니다:

  • String 을 Byte, Int, Float 로: "123" 같은 문자열을 123 같은 값으로 변환 시도합니다. 스트링에 숫자 값이 없으면 결과는 0 이 됩니다.
  • Byte, Int, Float, Vector, Rotator 을 String 으로: 숫자를 문자열 형태로 변환합니다.
  • String 을 Vector, Rotator 로: 문자열을 벡터나 로테이터 식으로 맞춰 변환해 봅니다.
  • String 을 Bool 로: 대소문자를 구분하지 않고 "True""False"TrueFalse 로 변환합니다. 0 이외의 값은 True 로, 나머지는 False 로 변환합니다.
  • Bool 을 String 으로: 결과는 "True" 아니면 "False" 입니다.
  • Byte, Int, Float, Vector, Rotator 를 Bool 로 : 0 이외의 값은 True 로, 0 은 False 로 변환합니다.
  • Bool 을 Byte, Int, Float 로: True1, False0 으로 변환합니다.
  • Name 을 String 으로: 이름을 그에 맞는 문자열로 변환합니다.
  • Rotator 를 Vector 로: 로테이터가 향하는 "앞면" 벡터를 반환합니다.
  • Vector 를 Rotator 로: 로테이터의 Pitch 와 Yaw 를 벡터 방향으로 반환합니다. Roll 은 0 입니다.
  • Object (나 Actor) 를 Int 로: 오브젝트에 고유한 것이 확실한 정수를 반환합니다.
  • Object (나 Actor) 를 Bool 로: 오브젝트가 None 이면 False 를, 아니면 True 를 반환합니다.
  • Object (나 Actor) 를 String 으로: 오브젝트의 문자열 형태를 반환합니다.

이 개념 관련 자세한 내용은 형 변환(Type Casting) 부분을 참고하시기 바랍니다.

산술 연산

반대 (-)
단항. 항을 반대로 만듭니다. 입력된 값에 -1 을 곱하는 것과 같습니다. 이 연산자에 대한 문법은 아래와 같습니다:
   -Input1
   
사칙연산 (+, -, *, /)
이항. 두 항으로 사칙연산을 합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 + Input2
   Input1 - Input2
   Input1 * Input2
   Input1 / Input2
   
제곱 (*)*
이항. 좌항을 우항만큼 제곱합니다. 예를 들어 산술 표현식 x2 는 UnrealScript 에서 x ** 2 로 쓰입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 ** Input2
   
나머지 (%)
이항. 좌항을 우항으로 나눈 나머지를 반환합니다. 예를 들어 6 % 4 의 결과는 2 인데, 6 을 4 로 나누면 1 에 나머지는 2 이기 때문입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 % Input2
   
사칙연산후 할당 (+=, -=, *=, /=)
이항. 사칙연산 결과를 (변수여야 하는) 좌항에 할당합니다. 예를 들어 x 가 2 일 때 x *= 4 를 하면 x 값은 8 이 됩니다. 곱하기를 먼저 한 다음 결과가 좌항, 이 경우 x 에 할당됩니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 += Input2
   Input1 -= Input2
   Input1 *= Input2
   Input1 /= Input2
   

문자열 연산자

연쇄/연쇄후 할당 ($/$=)
이항. 좌항 문자열에 우항 문자열을 덧붙인 다음 결과를 반환합니다. "할당" 버전은 그 결과를 (변수여야 하는) 좌항에 할당합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 $ Input2
   Input1 $= Input2
   
공백 포함 연쇄/공백 포함 연쇄후 할당 (@/@=)
이항. 좌항 문자열에 공백을 더한 뒤 우항 문자열을 덧붙인 후 결과를 반환합니다. "할당" 버전은 그 결과를 (변수어야 하는) 좌항에 할당합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 @ Input2
   Input1 @= Input2
   

비교 연산자

같음 (==)
이항. 좌우항을 비교한 다음 같으면 TRUE 를, 아니면 FALSE 를 반환합니다. 두 항이 String 값이면 대소문자를 구분해서 비교합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 == Input2
   
비슷함 (~=)
이항. 두 항이 Float 값인 경우, 좌우항을 비교한 다음 두 값의 차이가 0.0001 이내면 TRUE 를, 아니면 FALSE 를 반환합니다. 두 항이 String 값이면, 대소문자를 구분하지 않고 비교를 해서 같으면 TRUE 를, 그렇지 않으면 FALSE 를 반환합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 ~= Input2
   
다름 (!=)
이항. 좌우항을 비교한 다음 같으면 FALSE 를, 아니면 TRUE 를 반환합니다. 두 항이 String 값인 경우, 대소문자를 구분해서 비교합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 != Input2
   
작음 (<)
이항. Byte, Int, Float, String 값이 가능합니다. 좌우항을 비교한 다음 우항 값이 좌항 값보다 작으면 TRUE 를 반환합니다. String 값의 경우, 알파벳 순서를 비교합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 < Input2
   
작거나 같음 (<=)
이항. Byte, Int, Float, String 값이 가능합니다. 좌우항을 비교한 다음 우항 값이 좌항 보다 작거나 같으면 TRUE 를 반환합니다. String 값의 경우, 알파벳 순서를 비교합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 <= Input2
   
큼 (>)
이항. Byte, Int, Float, String 값이 가능합니다. 좌우항을 비교한 다음 우항 값이 좌항 값보다 크면 TRUE 를 반환합니다. String 값의 경우, 알파벳 순서를 비교합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 > Input2
   
크거나 같음 (>=)
이항. Byte, Int, Float, String 값이 가능합니다. 좌우항을 비교한 다음 우항 값이 좌항 값보다 크거나 같으면 TRUE 를 반환합니다. String 값의 경우, 알파벳 순서를 비교합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 >= Input2
   

논리 연산

AND (&&)
이항. (Bool 이어야 하는) 좌우항 값을 비교하여, 두 항 값 모두 TRUE 이면 TRUE 를 반환합니다. 좌항 값이 FALSE 이면 더이상 비교할 필요가 없으니 우항은 무시하고 바로 FALSE 를 반환합니다. 좌항이 TRUE 이면 우항도 계산합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 && Input2
   
OR (||)
이항. (Bool 이어야 하는) 좌우항 값을 비교하여, 어느 하나만 TRUE 이면 TRUE 를 반환합니다. 좌항 값이 TRUE 이면 더이상 비교할 필요가 없으니 우항은 무시하고 바로 TRUE 를 반환합니다. 좌항이 FALSE 이면 우항도 계산합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 || Input2
   
XOR (^^)
이항. (Bool 이어야 하는) 좌우항 값을 비교하여, 둘 중 하나만 TRUE 이면 TRUE 를 반환합니다. 항상 두 항 모두 계산합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 ^^ Input2
   

비트 연산자

반대 (~)
단항. 입력 값 각 비트를 반전시킵니다. 즉 0 은 1 이 되고, 1 은 0 이 됩니다. 이 연산자에 대한 문법은 아래와 같습니다:
   ~Input1
   
AND (&)
이항. 입력 값을 이진화하여 개별 비트를 비교, 둘 다 1 이면 결과 비트도 1 로 설정합니다. 두 비트 모두 0 이거나 서로 다르면, 결과 비트는 0 으로 설정합니다. 이 연산자는 Int 입력에만 가능하며, 반환되는 결과도 Int 입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 & Input2
   
OR (|)
이항. 입력 값을 이진화하여 개별 비트를 비교, 둘 중 하나가 1 이면 결과 비트도 1 로 설정합니다. 두 비트 모두 0 이면 결과 비트도 0 으로 설정합니다. 이 연산자는 Int 입력에만 가능하며, 반환되는 결과도 Int 입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 | Input2
   
XOR (^)
이항. 입력 값을 이진화하여 개별 비트를 비교, 두 비트가 다를 때만 결과 비트를 1 로 설정합니다. 두 비트가 같으면 결과 비트는 0 으로 설정합니다. 이 연산자는 Int 입력에만 가능하며, 반환되는 결과도 Int 입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 ^ Input2
   
우측 시프트 (>>)
이항. 둘 다 Int 값이어야 합니다. 좌항 값을 오른쪽으로 비트 단위 시프트(이동)합니다. 이동하는 비트 수는 우항으로 결정됩니다. 오른쪽 시프트는 입력 값 이진 표현의 오른쪽 비트를 버리며, 본질적으로 한 번 시프트할 때마다 2 로 나누는 것입니다. Int 이기에, 홀수는 2 로 나눈 뒤 소수점을 버립니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 >> Input2
   
좌측 시프트 (<<)
이항. 둘 다 Int 값이어야 합니다. 좌항 값을 왼쪽으로 비트 단위 시프트(이동)합니다. 이동하는 비트 수는 우항으로 결정됩니다. 왼쪽 시프트는 입력 값 이진 표현의 오른편에 비트를 추가하며, 본질적으로 한 번 시프트할 때마다 2 를 곱하는 것입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 << Input2
   

벡터 연산자

교차 곱 (Cross)
이항. 두 항 Vector 값에 교차 곱 연산을 하여, 두 항에 수직인 Vector 를 출력합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 Cross Input2
   
도트 곱 (Dot)
이항. 두 항 Vector 값에 도트 곱 연산을 하여, 우항에 대한 좌항의 스칼라 프로젝션(, 즉 비율)을 나타내는 Float 값을 출력합니다. (두 항 모두 단위 벡터, 즉 길이가 1 인 것으로 가정하면) 결과는 -1.0 에서 1.0 사이가 될 것이며, -1.0 이면 두 벡터가 반대 방향임을, 0.0 이면 수직임을, 1.0 이면 같은 방향을 가리키는 평행임을 나타냅니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 Dot Input2
   
역회전 (>>)
이항. 좌항은 Vector, 우항은 Rotator 여야 합니다. 왼쪽 입력 벡터에 오른쪽 입력 로테이션만큼 역회전시키는 것으로, 본질적으로는 로컬 스페이스의 벡터를 주어진 로테이션만큼 월드 스페이스로 트랜스폼(전환)시키는 것입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 >> Input2
   
정회전 (<<)
이항. 좌항은 Vector, 우항은 Rotator 여야 합니다. 왼쪽 입력 벡터에 오른쪽 입력 로테이션만큼 정회전시키는 것으로, 본질적으로는 월드 스페이스의 벡터를 주어진 로테이션만큼 로컬 스페이스로 트랜스폼(전환)시키는 것입니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 << Input2
   

플레이어 앞 64 유닛 지점을 향하는 Vector 가 있는 경우, vect(64,0,0) 은 로컬 플레이어 스페이스입니다. 이걸 월드 스페이스 기준으로 적용하려면 플레이어의 로테이션을 사용해서 월드 스페이스로 트랜스폼(전환)시키면 되므로, 다음과 같이 계산하면 됩니다:

myWorldSpaceVect = vect(64,0,0) >> playerPawn.rotation;

월드 스페이스 벡터가 있는데 그걸 로컬 플레이어 스페이스로 적용시키려는 경우엔 정회전을 사용하면 됩니다. 차 액터 속력을 구하는 것을 예로 들면, 차 액터의 월드 스페이스 속도를 로컬 스페이스로 변환해야, 그 X (전방 속도) 값을 구해 HUD 에 출력하면 될 것입니다.

로테이터 연산자

ClockwiseFrom
이항. 좌우항은 Rotator 의 개별 성분 (Pitch, Yaw, Roll) 을 나타내는 Int 값이어야 합니다. 좌항이 우항을 기준으로 시계방향에 있는지에 따라 Bool 값 (TRUE 또는 FALSE) 을 반환합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 ClockwiseFrom Input2
   

삼항 연산자

조건 (? :)
삼항. 첫 항의 결과에 따라 둘째 항이나 셋째 항의 값 중 하나를 반환합니다. 실질적으로 첫째 항은 TRUE 또는 FALSE 입니다. 첫째 항이 TRUE 로 나오면, 둘째 항의 값을 반환합니다. FALSE 로 나오면, 셋째 항의 값을 반환합니다. 이 연산자에 대한 문법은 아래와 같습니다:
   Input1 ? Input2 : Input3
   

연산자 우선순위


연산자를 계산하는 순서는 표현식의 결과를 완전히 뒤바꿀 수 있습니다. 각 연산자에는 고유한 우선순위 값이 있어, 한 문에 연산자가 여럿 있을 때는 그를 통해 어느 연산자를 먼저 계산할지 결정합니다. 1 * 2 + 3 * 4 처럼 복잡한 연산자를 사용하면, UnrealScript 는 우선순위에 따라 연산자 그룹을 자동으로 나눕니다. 곱하기의 우선순위가 더하기보다 높기에, 위 표현식은 (1 * 2) + (3 * 4) 와 같은 식으로 계산됩니다.

아래 표는 (처음부터 마지막까지) 내장 연산자의 계산 순서와, 우선순위가 같은 연산자는 어느 방향부터 계산할지(결합 열) 입니다:

연산자 결합
( ) 왼쪽부터
!, ++, --, -, ~ 오른쪽부터
Dot, Cross, ClockwiseFrom 왼쪽부터
*, /, % 왼쪽부터
+, - 왼쪽부터
<<, >> 왼쪽부터
<, >, <=, >= 왼쪽부터
=, !, ~= 왼쪽부터
& 왼쪽부터
^ 왼쪽부터
| 왼쪽부터
&& 왼쪽부터
|| 왼쪽부터
^^ 왼쪽부터
@, $ 왼쪽부터
, +, -=, *=, /=, @=, $= 오른쪽부터

가끔 엔진에 연산자가 새로 추가될 때가 있습니다. 전체 연산자 목록은 최신 UnrealScript 소스 코드, 특히 Object 클래스를 확인해 보시기 바랍니다.