UDN
Search public documentation:

UnrealScriptInterfacesKR
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 홈 > UnrealScript > UnrealScript 인터페이스

UnrealScript 인터페이스


문서 변경내역: Michiel Hendriks 작성. 홍성진 번역.

개요


언리얼 엔진 3 UnrealScript 는 인터페이스 클래스를 지원합니다. 대부분의 다른 UnrealScript 와 마찬가지로 인터페이스 구현은 Java 구현과 많이 비슷합니다.

다른 프로그래밍 언어와 마찬가지로 인터페이스는 함수 선언만 포함할 뿐, 함수 본문은 포함하지 않습니다. 이렇게 선언된 메서드에 대한 구현은 인터페이스를 실제로 구현하는 클래스에서 이루어 져야 합니다. 모든 함수 종류, 보통의 함수는 물론 이벤트도 허용됩니다. 심지어 델리게이트(delegate) 조차 (한계 부분의 설명대로 제약은 있지만) 인터페이스에서 구현할 수 있습니다.

인터페이스는 클래스의 메모리 레이아웃에 영향을 끼치지 않는 선언, 즉 열거형, 구조체, const 만 선언할 수 있으며, 다른 변수는 안됩니다.

인터페이스 만들기


인터페이스 클래스 선언을 위한 문법은 다음과 같습니다 (각괄호 [] 안의 부분은 옵션입니다):

   interface InterfaceName [extends ParentInterface] [classSpecifiers];

   // 인터페이스 본문

인터페이스는 선택적으로 다른 인터페이스를 확장(extend)할 수 있습니다. 베이스 인터페이스가 지정되지 않으면 묵시적으로 Core.Interface 를 상속합니다.

클래스 지정자를 사용할 수도 있습니다. 인터페이스에 사용할 수 있는 클래스 지정자는 다음과 같습니다:

native 네이티브
인터페이스를 네이티브(원래부터 속해있는 것으)로 만들어, C++ 인터페이스 선언이 생성됩니다. 네이티브로 선언된 인터페이스는 네이티브 클래스에 의해서만 구현 가능합니다. 네이티브 클래스에 대한 다른 제약도 네이티브 인터페이스에만 의미가 있습니다. 'native' 키워드에는 네이티브 선언을 익스포트할 파일명을 덧붙일 수 있습니다. 예를 들면 native(MyInterface) 식이죠. 이름 inherit 을 사용하면 부모 인터페이스에서 그 파일명을 상속합니다.
dependson(Class)
특별한 기능은 없고, 컴파일러에게 알리는 역할을 합니다.

인터페이스 본문은 cpptext 블록을 포함할 수 있습니다. 단순히 네이티브 선언과 함께 익스포트되는 부분입니다.

인터페이스 구현하기


인터페이스는 Java 에서와 마찬가지로 구현합니다:

   class MyClass extends Object implements(InterfaceName)

이 클래스도 인터페이스가 선언한 모든 함수를 선언해야 할 것입니다. 이 클래스의 함수 선언은 네이티브 키워드만 빼고 인터페이스의 선언에 일치해야 합니다. 인터페이스에서 네이티브로 선언한 함수가 꼭 인터페이스를 구현하는 클래스에서 네이티브가 될 필요는 없으며, 그 반대의 경우도 마찬가지입니다.

둘 이상의 인터페이스를 구현하는 클래스는 다음과 같은 문법을 따릅니다:

   class MyClass extends Object implements(FirstInterface, SecondInterface)

인터페이스 사용하기


인터페이스는 다른 클래스와 똑같이 사용됩니다.

   var InterfaceName InterfaceReference;

   function DoSomething()
   {
      InterfaceReference.callInterfaceFunction();
   }

   function DoSomethingElse(Object anObject)
   {
      if (InterfaceReference(anObject) != none)
      {
         // ...
      }
   }

C++ 에서 네이티브 인터페이스 변수는 UnTemplate.h 에 선언된 TScriptInterface 로 표현됩니다. 이 구조체는 같은 오브젝트로의 포인터 둘, 즉 UObject 포인터와 인터페이스 종류의 포인터를 저장합니다.

UObject 함수 GetInterfaceAddress 는 UObject 인스턴스가 특정 인터페이스를 구현하는지 검사한 후 구현한다면 그에 대한 포인터를 구하는 데 사용되는 함수입니다. 예를 들어,

UObject* pObj;
IInterfaceName* Interface = (IInterfaceName*)pObj->GetInterfaceAddress(IInterfaceName::UClassType::StaticClass());
// (pObj 가 IInterfaceName 를 구현하지 않으면, Interface 는 NULL 이 됩니다.)

한계


  • 네이티브 인터페이스(native 키워드로 선언된 인터페이스 클래스)는 네이티브 클래스에 의해서만 구현 가능합니다.
  • 공통의 베이스를 갖는 인터페이스 클래스를 복수로 구현하는 것은 지원되지 않으며, vtable 오프셋이 잘못 나오게 됩니다. 이런 젼차로 인터페이스 클래스는 상속을 통한 계층구조나 논리그룹으로 정리하기 보다는, 수평적인 구조로 관리할 것을 추천합니다.
  • 델리게이트는 인터페이스에서 정의할 수는 있지만, 인터페이스 참조를 통해 새로운 값을 할당하거나 호출하는 것은 불가능합니다. 반드시 인터페이스를 구현하는 오브젝트로 형 변환(cast)해 줘야 합니다.