모의 면접준비 자료
Actor와 Component
Actor
게임 내에서 직접 배치할 수 있는 독립적인 오브젝트로써 위치 회전 크기 같은 정보를 가지고 있으며 월드에서 다른 오브젝트와 상호작용을 할 수 있습니다.
Component
Component는 메쉬를 입히는 Static Mesh Component, 충돌 처리를 위한 Collision Component 등과 같이 Actor에 부가적인 기능을 추가하는 요소입니다.
Actor 클래스의 생성자에서 CreateDefaultSubobject<>() 함수를 사용해 Component를 생성하고, 생성된 Component를 Actor의 루트나 적절한 위치에 부착합니다. 예를 들어 캐릭터의 경우 기본 Capsule Component를 루트로 설정하고, 그 위에 메쉬나 카메라 Component를 추가합니다.
-> Scene Component가 있어야지 Root Component가 있을 수 있음.
Blueprint와 C++
Blueprint
Blueprint는 에디터 내에서 수정하고 결과를 바로 확인할 수 있어 반복 작업과 작업 속도 측면에서 유리하며, 프로그래밍 경험이 적은 디자이너나 아티스트도 쉽게 접근할 수 있습니다. 그러나 로직이 복잡해지면 가독성이 떨어지고, 인라인 최적화가 어려워 C++에 비해 성능이 다소 낮을 수 있습니다.
C++
C++은 네이티브 코드 기반으로 실행되어 최적화와 실행 속도 측면에서 강점을 가지며, 엔진의 깊은 부분까지 제어할 수 있습니다. 또한 버전 관리와 협업 측면에서도 유리하지만, 수정할 때마다 컴파일과 빌드 과정을 거쳐야 하므로 반복 테스트가 느리고 디버깅 난이도가 높다는 단점이 있습니다.
UI 이벤트, 간단한 게임플레이 로직, 이펙트 등은 Blueprint로 빠르게 구현할 수 있습니다. 물리 연산, 복잡한 AI, 네트워크 통신, 그리고 매 프레임 호출되는 핵심 로직은 C++로 구현하는 것이 좋습니다.
C++로 작성한 코드를 UFUNCTION과 UPROPERTY를 활용해 Blueprint에 노출시켜, 디자이너나 아티스트가 에디터 내에서 쉽게 조정할 수 있도록 하여 두 가지를 적절히 혼합해 사용하는 것이 좋습니다.
Tick
Tick 함수는 게임 내 오브젝트의 상태나 행동을 프레임 단위로 지속적으로 업데이트하는 역할을 합니다.
컴퓨터마다 프레임률이 다르기 때문에 직전 프레임부터 현재프레임까지 걸린 시간(초)를 뜻하는 DeltaTime이라는 매개변수를 사용하여 일정한 시간 기반의 연산을 가능하게 해줍니다. 예를 들어, 캐릭터가 일정한 속도로 이동해야 한다면 ‘이동거리 = 속도 * DeltaTime’으로 계산하여 프레임 차이에 따른 영향을 최소화할 수 있습니다. 다만, Tick 함수는 매 프레임 호출되므로 필요할 때만 사용하거나 이벤트 기반이나 타이머를 활용하여 불필요한 성능 저하를 방지하는 것이 중요합니다.
포인터
포인터는 데이터가 저장된 메모리의 주소를 저장하는 변수입니다. 쉽게 말해 데이터가 저장된 위치를 기억하는 변수라고 할 수 있습니다.
포인터를 사용하면 데이터를 직접 복사하지않고 주소만 전달해 메모리 관리에 효율적입니다.
포인터가 유효한지 확인하지 않으면 잘못된 메모리 주소에 접근하여 프로그램이 충돌할 수 있습니다. 따라서 항상 포인터 사용 전에 if (p != nullptr)와 같이 체크하는 것이 필수이고, 메모리 누수를 피하기 위해 알맞은 메모리 해제가 필요합니다
오버로딩 오버라이딩
오버로딩
같은 이름의 함수를 매개변수의 종류나 개수를 다르게 여러 개 만드는 것입니다
컴파일 시 인자에 따라 호출되는 함수가 결정됩니다.
오버라이딩
상속 관계에서 부모 클래스의 가상 함수를 자식 클래스에서 재정의 하는 것입니다.
런타임때에 객체의 실제 타입에 따라서 호출됩니다.
override 키워드를 사용하면 부모 클래스의 가상 함수와 시그니처가 정확히 일치하지 않을 경우 컴파일러가 오류를 발생시켜 실수를 방지할 수 있습니다.
언리얼의 예로는 BeginPlay()와 Tick()등이 있습니다.
템플릿
데이터 타입에 관계없이 하나의 코드를 여러 타입에 대하여 재사용 할 수 있게 하는 기능입니다.
코드 중복을 줄이고 재사용성이 높지만 컴파일 시간이 늘어나고, 템플릿 관련 오류 메세지가 복잡해져 디버깅일 어려워 질 수있다는 단점이 있습니다.
STL
C++에서 제공하는 미리 구현된 자료구조와 알고리즘 모음입니다.
언리얼 엔진은 STL과 유사한 역할을 하는 TArray와 TMap 등의 자체 컨테이너를 제공합니다. 이들은 엔진의 메모리 관리, 가비지 컬렉션, 리플렉션 등과 잘 통합되어 있어 엔진 내부 작업에 최적화되어 있습니다.
TArray -> 동적 배열 컨테이너로써 여러 데이터를 순서대로 저장하며 필요한 경우 크기를 조절 할 수 있습니다.
TMap -> 키와 값을 쌍으로 저장하는 연관 컨테이너로써 특정 키를 통해 해당하는 값을 빠르게 찾아올 수 있습니다.