🎮Unreal4/Basic

[C++] 인터페이스(Interface), 추상클래스(Abstract), 추상함수/가상함수(Virtual)

공대 컴린이 2023. 4. 11. 19:27
728x90

💡 인터페이스 (Interface)

인터페이스 클래스는 무관한 클래스 간의 공통되는 함수를 구현할 수 있도록 하는데 쓰인다.

예를 들어, AActor 클래스에 구현한 함정기능과, APawn/ACharacter 클래스에 구현한 Enemy 객체, 점수를 매길 수 있는 UDataAsset같은 클래스들이 존재할 때, 이 클래스들에 특정 기능을 공유하고자 할 때 공통 조상이 UObject 밖에 존재하지 않는다. 이럴때 인터페이스를 사용하면 된다.

 

인터페이스의 선언은 세가지만 기억하면 된다.

1️⃣ UCLASS 매크로가 아닌 UINTERFACE 매크로를 사용한다.

2️⃣ UObject를 직접 상속하는것이 아닌 UInterface를 상속한다.

3️⃣ UINTERFACE 클래스는 실제 인터페이스가 아니기 때문같은 클래스 이름에 첫글자만 "U" → "I" 로 바꾼다.

💡 인터페이스와 추상클래스

인터페이스는 추상클래스(Abstract Class)의 극단적인 버전이라고 볼 수 있다.

(추상 클래스는 하나 이상의 순수 가상함수를 포함하는 클래스를 의미한다)

 

그렇다면 인터페이스와 추상클래스의 차이점은?
언리얼의 인터페이스에는 일반함수를 포함할 수 없다. 즉, 순수가상함수나 가상함수만을 포함한다.
반면 추상클래스는 순수가상함수, 가상함수, 일반함수를 다 포함할 수 있다.

추상클래스가 존재하는데 굳이 인터페이스를 사용하는 이유는?

인터페이스는 어떤 기능들에대한 집합(공통의 그룹)을 나타내는것이다.

예를 들어, Item 클래스를 만들때 Item 기능 구현에 필요한 함수들이 그룹으로 전부 묶여져있는 것과 같다.

 

추상클래스는 몇몇 기능은 이미 구현되어있고, 특정 기능만 새롭게 구현하여 적용시키는것이다.

예를 들어, Item에 대한 기능은 전부 구현해놓고, 누가 사용할지만 함수로 override 하여 사용하는 것과 같다.

즉, 원래 있던 기능에 추가적인 기능을 넣을 때 유용하다.

💡 추상함수와 가상함수

여기서 "추상(Abstract)"의 개념과 "가상(Vertual)"의 개념이 헷갈릴 수 있는데,

추상은 함수의 형태만 선언해놓는 것이고,

가상은 부모에 정의되어있는 것을 재정의하는것이다.

 

즉, 추상(Abstract)은 여러 개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의만 선언하고

가상(Virtual)하나의 기능을 하는 완전한 클래스로써, 파생클래스에서 상속해서 추가적인 기능추가virtual 한정자가 달린 것을 재정의해서 사용가능하다.

 

또한 추상(Abstract)은 abstract 키워드로 선언된 메서드에 본문을 정의할 수 없지만,

가상(Virtual)은 본문을 정의할 수 있다.

 

추상(Abstract)은 새로운 객체 생성이 불가능하며 (Example ex = new Example(); (X))

가상(Virtual)은 파생클래스에서 재정의하고, 자식클래스에서 new 또는 override 키워드로 생성할 수 있다.


참조

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/GameplayArchitecture/Interfaces/

 

인터페이스

인터페이스 생성 및 구현 관련 레퍼런스입니다.

docs.unrealengine.com

https://junco.tistory.com/133

 

[C#] virtual, abstract, interface

Virtual (가상) abstract 와는 다르게 본문을 정의할 수 있습니다. (비워 놓아도 됨) 파생 클래스에서 재정의 할 수 있습니다. 자식 클래스에서는 new 또는 override 키워드 사용이 가능합니다. override는

junco.tistory.com

 

728x90