Q: Quaternion(쿼터니언)에 대해 설명하시오.

A: 사원수, 혹은 해밀턴 수라고도 부르며 복소수를 확장해 만든 수 체계이다.

덧셈에 대해서는 결합법칙, 교환법칙이 성립하지만, 곱셈에 대해서는 결합법칙만 성립하고 교환법칙은 성립하지 않는다.

쿼터니언은 하나의 실수와 3개의 서로 다른 복소수로 구성이 되며, 곱셈 연산 시 겹선형 연산을 한다.

예를 들어, a0 + a1i + a2j + a3k에 대해 곱의 결과는 다음과 같이 나타난다.

× 1 i j k
1 1 i j k
i i -1 k -j
j j k -1 -i
k k -j -i -1

단, 여기서 a0, a1, a2, a3는 모두 실수이다.

 

쿼터니언은 실수부와 허수부로 나눌 수 있는데,

이를 벡터에 적용하면 실수부를 스칼라 값으로, 허수부를 3차원 벡터로 간주한다.

 

마지막으로 위 예시에서 언급한 쿼터니언을 2×2 Complex matrix(복소행렬)로 나타내면 다음과 같다.

a + bi c + di
-c + di a - bi

 

Q: 물체의 회전을 연산 할 때 쿼터니언을 사용해야 하는 이유를 설명하시오

A: 오일러 각을 이용해 행렬 연산을 할 때 회전하는 축이 정지한 축과 겹쳐지는 상황이 발생하는데, 

이를 짐벌락이라 부른다.

짐벌락은 오일러 각을 연산 할 때 3개의 축을 기반으로 연산을 하기 때문인데,

이를 회피하기 위해 쿼터니언을 이용한다.

쿼터니언을 이용해서 문제가 해결되는 이유는

3개의 축의 연산이 서로 다른 복소수로 되어 있기 때문에 서로가 독립적으로 연산이 될 수 있다.

 

참고자료

ko.wikipedia.org/wiki/%EC%98%A4%EC%9D%BC%EB%9F%AC_%EA%B0%81

 

오일러 각 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 오일러 각(Euler角, Euler angle)은 강체가 놓인 방향을 3차원 공간에 표시하기 위해 레온하르트 오일러가 도입한 세 개의 각도이다.[1] 즉, 3차원 회전군 SO(3)의 한 좌

ko.wikipedia.org

ko.wikipedia.org/wiki/%EC%82%AC%EC%9B%90%EC%88%98

 

사원수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 브로엄 다리에 새겨진 기념비. 이 곳에서 해밀턴이 사원수를 발견하였다고 한다. 수학에서, 사원수(四元數, 영어: quaternion 쿼터니언[*]) 또는 해밀턴 수(영어: Ham

ko.wikipedia.org

 

Animation은 오직 하나의 애니메이션만 담을 수 있다면, 

Montage는 여러 Animation을 하나의 애셋으로 합칠 수도 있고, Montage 앞에 선행 Animation을 붙일 수 있다.

 

또한 그 안에서 Notify를 이용해 사운드, 파티클, 루트모션 등의 추가 작업을 가할 수 있다.

그리고 이러한 작업들을 Replication 할 수 있다.

 

마지막으로 Animation은 C++이나 Blueprint에서 직접 조작이 불가능하지만, Montage는 직접 조작이 가능하다.

 

참고자료: https://docs.unrealengine.com/ko/Engine/Animation/AnimMontage/Overview/index.html

 

애니메이션 몽타주 개요

애니메이션 몽타주 애셋 작업 방식과 어디에 사용할 수 있는지에 대한 설명입니다.

docs.unrealengine.com

 

UE4에서 GC는 Object들의 Reference Graph를 만들어 참조되지 않은 Object들이 있는지 파악합니다.

Graph의 Root에는 Root Set으로 지정된 Object Set이 있고, 선언되는 모든 Object들은 이 Root Set 밑에 추가됩니다.

GC가 발동되면 Root Set부터 시작하여 Reference Tree를 순회합니다.

이 중 검색되지 않은 Object는 참조자가 없는 것으로 가정하고 제거합니다.

 

그리고 제거되지 않은 Object들은 UPROPERTY레퍼런스를 유지하거나,

포인터를 다른 언리얼 엔진 컨테이너 클래스에 저장합니다.

 

다만 Actor와 Component는 예외인데, 

Actor는 자신이 속한 Level처럼 Root Set로 다시 링크되는 Object에,

Component는 Actor 자체에 Reference가 있기 때문입니다.

Actor는 Destroy로, Component는 DestroyComponent로 삭제하거나 소유 Actor가 삭제될 때 같이 삭제됩니다.

 

그리고 이러한 GC는 프로젝트 세팅을 통해 몇가지 수정을 가할 수 있습니다.

 

참고자료: docs.unrealengine.com/ko/Programming/UnrealArchitecture/Objects/Optimizations/#%EA%B0%80%EB%B9%84%EC%A7%80%EC%BB%AC%EB%A0%89%EC%85%98

 

언리얼 오브젝트 처리

UObject 시스템의 기능에 대한 개요입니다.

docs.unrealengine.com

 

UPROPERTY는 C#의 매크로와 같이 멤버변수 앞에 선언하는 문법입니다.

이는 UE4에서 제공하는 각종 기능들의 대상이 되기 위해서는 반드시 선언되어야 합니다.

 

기본적인 역할은 URS(Unreal Reflection System)에 해당 Property가 있음을 알리는 것으로,

빌드 시 UHT(Unreal Header Tool)이 이 매크로를 감지하고 Reflection Type에 추가합니다.

 

URS에 추가된 UPROPERTY는 GC에 의해 관리가 되고,

Reflection을 통해 변수 이름이나 타입 등을 런타임 상에서 확인할 수 있습니다.

 

추가로 UPROPERTY에 지정자를 추가하여 다른 기능을 적용할 수 있습니다.

Blueprint에서 접근, 수정이 가능한다던가.

카테고리를 지정한다던가.

Replicate를 설정한다던가.

RefNotify를 지정한다던가.

 

참고자료: https://minusi.tistory.com/entry/%EC%96%B8%EB%A6%AC%EC%96%BC-UPROPERTY-Unreal-UPROPERTY

 

언리얼 UPROPERTY( Unreal UPROPERTY )

언리얼 엔진 위에서 언리얼 엔진과 상호작용하려는 코드를 작성하기 위해서는 언리얼에서 제공하는 각종 매크로의 도움을 받을 수 밖에 없습니다. 그 중, UPROPERTY는 멤버 변수( 또는 프로퍼티 ) �

minusi.tistory.com

 

malloc/free new/delete
메모리가 heap에 할당된다. 메모리가 Free Store에 할당된다.
결과가 타입 지정 없이 void*로 반환된다. 결과가 명확한 타입이 지정된다.
할당에 실패하면 NULL을 반환한다. 할당에 실패하면 error를 throw 한다.
메모리 할당 할 때 사이즈를 지정해 줘야 한다. 컴파일러가 메모리 크기를 계산해서 잡아준다.
더 큰 메모리로 재할당 하는 과정이 비교적 간단하다. 더 큰 메모리로 재할당 하는 과정이 비교적 귀찮다.
기본적으로 함수이다. 기본적으로 연산자이다.

 

malloc/free는 메모리를 할당하는 함수로, 할당 시 메모리가 heap 영역에 바로 할당이 된다.

또한 type과 관계 없이 반환하는 타입은 반드시 void*이며 실패 시 NULL을 반환한다.

메모리를 할당할 때에는 반드시 객체 크기를 Byte 단위로 지정을 해줘야 한다.

그리고 생성된 메모리 영역은 쓰레기값으로 차있기 때문에 초기화 과정이 따로 요구된다.

 

new/delete는 연산자이기 때문에 사용자가 overloading이 가능하다.

메모리를 할당 할 때 크기를 컴파일러가 계산해주기 때문에 따로 지정 할 필요가 없고,

연산 결과가 명확한 타입으로 반환되며 실패 시 Error를 throw 하기 때문에 에러 처리가 필요하다.

메모리를 할당할 때 free store에 할당이 되며, 할당 시 생성자를 호출하기 때문에 값이 초기화가 되어 있다.

 

new에서 생성자는 구현된 생성자에 따라 방법이 다르다.

아무것도 없다면 default 생성자를 호출한다던가, 

중괄호로 묶여 있다면 Initialize list를 호출한다던가.

 

대략적으로 짚어 보았는데 이렇게 대답을 하면 Free Store가 무엇인지 물어볼 것이다.

Free Store는 C에서의 Heap영역이라 보면 된다.

단 이는 개념적인 부분이고 실제로 메모리 영역이 나뉘어져 있는 것은 아니다.

다만 C++에서는 Heap보다는 Free Store라는 용어를 사용하는 것이 더 바람직하다는 얘기도 있다.

 

자료 출처

https://jacking75.github.io/Cpp_memory_region/

 

C++ - 메모리 영역 - jacking75

메모리 영역에 대해서 5 종류의 메모리 영역 C++ 에서는 다른 특성을 갖는 5 종류의 메모리 영역이 존재한다. (※ 단 c++ 규격에는 스택이나 힙은 명시 하지 않고 Free-Store는 명시 하고 있다) Const Data

jacking75.github.io

https://stackoverflow.com/questions/1350819/c-free-store-vs-heap

 

C++, Free-Store vs Heap

Dynamic allocations with new/delete are said to take place on the free-store,while malloc/free operations use the heap. I'd like to know if there is an actual difference, in practice. Do compilers...

stackoverflow.com

 

Virtual 키워드는 C++에서 Override 할 시 반드시 붙여줘야 하는 키워드다.

그리고 이를 붙여줘야 하는 이유를 묻는다면 입문자들은 "이걸 붙어야 Override가 되요"라고 답할 것이다.

 

여기서 C++을 좀 더 배운 사람이라면 이렇게 답할 것이다.

"C++의 virtual 키워드가 붙은 함수들은 vtable에서 함수의 주소값이 관리가 된다.

이후 하위 클래스에서 override를 하면 vtable의 주소값이 변경이 된다.

이를 통해 하위 클래스의 instance에서 override를 한 함수를 호출하면,

vtable에서 함수를 찾는 과정에서 상위 클래스의 함수가 아닌 하위 클래스의 함수를 받아오게 된다."

라고 답할 것이다.

 

하지만 virtual 키워드가 붙는 경우가 두가지가 더 있다.

하나는 생성자, 다른 하나는 소멸자이다.

그렇다면 생성자(Constructor)와 소멸자(Destructor)에서 virtual 키워드는 어떻게 동작할까?

 

이 두가지 경우, virtual 키워드가 붙어 있으면 vtable에서 상위 클래스의 생성자나 소멸자를 검색한다.

그리고 검색된 결과를 현재의 생성자/소멸자 코드 앞에 붙여준다.

이는 재귀적으로 발생하여, 최상위 클래스의 생성자/소멸자부터 순차적으로 호출이 된다.

 

이렇게 모든 생성자/소멸자들이 호출이 되면, 컴파일러는 다시 한번 코드를 자동 생성한다.

바로 멤버를 자동으로 생성/소멸하는 과정이다.

 

정리를 하자면, 

"Virtual 키워드가 붙은 함수는 물론이고 생성자, 소멸자들은 vtable에서 어떤 것을 사용 할지 관리가 된다.

이 중 함수는 Instance에 따라 하위 클래스의 함수를 호출하고, 

생성자와 소멸자는 상위 클래스의 것을 먼저 호출한 뒤 자신의 것을 호출하며,

마지막으로 멤버 생성/소멸 과정을 거친다.

때문에 Override 할 때 virtual 키워드를 사용해야 한다."

 

정도가 될 것 같다.

 

참고자료: https://stackoverflow.com/questions/7750280/how-does-virtual-destructor-work-in-c

 

How Does Virtual Destructor work in C++

I will type an example : class A { public: virtual ~A(){} }; class B: public A { public: ~B() { } }; int main(void) { A * a = new B; delete a; return 0; } Now in Above Example , destructors ...

stackoverflow.com

'메모장 > 기술면접' 카테고리의 다른 글

UE4 UPROPERTY란 무엇인가?  (0) 2020.09.01
C++ malloc/free와 new/delete의 차이점  (0) 2020.08.28
Unity Boxing과 UnBoxing  (0) 2020.08.11
UE4 Actor의 Role과 Remote Role  (0) 2020.08.10
UE4 Replicate 방식간 차이  (0) 2020.08.10

Q: Unity Boxing과 UnBoxing에 대해 설명해 보아라

 

A: Boxing은 Stack 메모리의 Data를 Heap 메모리에 할당을 하는 방식이다.

Object a = value일 때 Heap 영역에 value 값이 할당되고, a는 그 값의 주소를 참조한다.

 

반대로 이렇게 Heap 영역에 할당된 Value를 Stack 메모리에 할당을 해야 하는 경우도 있다.

위 Object a에 대해 int b = (int)a 와 같이 값을 할당하는 것이 UnBoxing이다.

 

Boxing은 Stack의 값을 Heap에 할당하는 방식이고, UnBoxing은 Heap에 할당된 값을 Stack에 할당하는 방식이다.

 

단 이 방법의 단점은 Boxing한 메모리와 UnBoxing 한 메모리. 두 개의 메모리가 발생하기에 가비지가 발생한다는 점.

그리고 Value를 Boxing은 일반 할당보다 최대 20배, UnBoxing은 Casting 과정보다 최대 4배의 시간이 더 걸릴 수 있다.

이러한 단점에도 간간히 사용되는 이유는 그 편리성 때문이다.

주로 ArrayList, Hash Table이 대표적인 예이다.

Q: Actor의 Role과 Remote Role에 대해 설명하라

 

A: Role은 Actor에 대한 Authority Owner Actor의 Replication 여부, Remote Role은 Replication Mode를 나타낸다.

특정 Actor의 Authority를 알아내기 위해 Role이 ROLE_Authority인지 검사한다.

이 값을 가진 Instance가 이 Actor를 담당한다.

그리고 Server와 Client는 Role과 Remote Role의 값이 반대이다.

이 외에 Client의 Replication Mode를 지정하는 Role이 두개가 존재한다.

 

'메모장 > 기술면접' 카테고리의 다른 글

C++ Override 시 Virtual Keyword를 써야 하는 이유  (0) 2020.08.28
Unity Boxing과 UnBoxing  (0) 2020.08.11
UE4 Replicate 방식간 차이  (0) 2020.08.10
내적의 의미  (0) 2020.08.10
기술면접 질문 정리  (0) 2020.08.10

Q: UE4에 Replicate 방식은 두가지가 있다. 둘에 대해 설명을 해보라

 

A: Property Replicate와 RPC 방식이 있다.

Property Replicate는 UPROPERTY 매크로에 그 변수 값이 바뀔 때 호출되는 RepNotify를 이용해 값을 동기화 한다.

RPC는 함수를 이용해서 값을 바꿔주는 방식이다.

Property Replicate는 값이 바뀔 때만 호출이 되는 반면, RPC 함수는 값의 안정성을 보장해준다.

'메모장 > 기술면접' 카테고리의 다른 글

C++ Override 시 Virtual Keyword를 써야 하는 이유  (0) 2020.08.28
Unity Boxing과 UnBoxing  (0) 2020.08.11
UE4 Actor의 Role과 Remote Role  (0) 2020.08.10
내적의 의미  (0) 2020.08.10
기술면접 질문 정리  (0) 2020.08.10

Q: 내적이란 무엇인가?

A: 내적은 두 벡터의 성분곱의 합으로 한 벡터를 다른 벡터로 사영 했을 때 그 벡터 성분들의 곱으로 표현이 가능하다. 때문에 두 벡터 사잇각을 구할 수 있고, 주로 조명 연산에 자주 이용된다.

 

Q: 내적의 연산 결과가 스칼라 값으로 나오는 이유는 무엇인가?

A: 내적 연산인 성분곱의 합이 스칼라 곱셈이기 때문이다. 

 

Q: 내적의 의미는 무엇인가?

A: 한 벡터를 다른 벡터로 사영 했을 때 그 벡터 성분들의 곱이다.

 

Q: 내적을 사용하는 예시를 몇가지 들어달라

A: 주로 조명 효과를 낼 때 내적을 사용하고, Coordination을 바꾸는 Transform 과정도 내적을 통해 이루어진다.

'메모장 > 기술면접' 카테고리의 다른 글

C++ Override 시 Virtual Keyword를 써야 하는 이유  (0) 2020.08.28
Unity Boxing과 UnBoxing  (0) 2020.08.11
UE4 Actor의 Role과 Remote Role  (0) 2020.08.10
UE4 Replicate 방식간 차이  (0) 2020.08.10
기술면접 질문 정리  (0) 2020.08.10

+ Recent posts