스터디를 진행하며 실시한 모의 면접을 정리한 내용입니다.
겹치는 내용을 고려하지 않고 면접을 실시하기 때문에 일자 별로 겹치는 내용이 많을 수 있습니다.
1. (C#) reflection이란?
런타임에 객체의 정보를 파악하기 위해 사용되는 기술입니다. 리플렉션을 활용하면 런타임에 객체, 필드, 메서드 등의 정보를 얻을 수 있습니다.
2. (C#) 델리게이트란?
델리게이트란 메서드를 더욱 유연하게 사용할 수 있도록 도와주는 문법입니다. 델리게이트에 함수를 바인딩하여 사용하면 call back을 편하고 안전하게 구현할 수 있으며, 동시에 호출되어야 하는 여러 메서드를 하나로 묶어 관리할 수 있게 됩니다.
3. (유니티) update, fixedupdate, lateupdate에 대해 설명하라.
Update와 LateUpdate는 매 프레임마다 호출되는 함수입니다. 오브젝트가 매 프레임마다 수행해야 하는 작업이 있다면, Update혹은 LateUpdate 내부에 코드를 작성하여 처리할 수 있습니다. Update와 lateUpdate 모두 매 프레임마다 호출되지만, LateUpdate 함수는 모든 오브젝트의 Update 함수가 호출된 이후에 호출됩니다. 모든 객체에 대해 Update 가 이루어진 이후에 추가적으로 처리해야 할 작업이 있다면, LateUpdate에서 처리할 수 있습니다.
FixedUpdate는 프레임마다 호출되는 함수가 아니라 일정 주기마다 호출되는 함수입니다. Update와 LateUpdate는 호출 간격이 들쑥날쑥한 반면, FixedUpdate는 정해진 주기마다 호출되기 때문에 항상 일정한 호출 간격을 보장받습니다. 이러한 특징으로 인해 물리 연산을 주로 FixedUpdate에서 처리합니다.
4. (유니티) prefab 이란?
씬에서 사용될 게임 오브젝트를 미리 정의하여 파일의 형태로 보관하는 것을 프리팹이라고 합니다. 해당 게임 오브젝트가 보유할 컴포넌트, 트랜스폼 정보 등을 정의하여 파일의 형태로 저장한 뒤, 실제 씬에 오브젝트가 생성될 때, 해당 파일의 값을 참조하여 오브젝트를 생성하게 됩니다. 원본이 변하지 않고 항상 동일한 상태를 유지하기 때문에 생성되는 오브젝트들의 통일성을 보장할 수 있습니다.
5. (C#) 박싱과 언박싱에 대해 설명하라. 이를 대체할 수 있는 문법이 있는가?
boxing은 데이터를 object타입 혹은 참조 형식으로 변환하는 것을 의미하며, unboxing은 변환된 것을 원래의 상태로 되돌리는 것을 의미합니다. 하나의 클래스가 다양한 자료형에 대응하기 위해선, 모든 자료형이 공통으로 상속받고 있는 object 클래스를 이용해야 합니다. 이를 위해, 데이터를 object 클래스의 참조형으로 변환하여 통일성있게 저장하고, 실제로 사용할 땐 다시 원본의 상태로 되돌려 값을 사용하게 됩니다. 하지만, boxing과 unboxing은 그 횟수가 많아질수록 성능에 큰 부담을 주게 됩니다. 이를 완화하기 위해 generic이라는 문법을 사용할 수 있습니다. boxing, unboxing은 런타임에 실행되는 반면, generic은 대부분의 연산이 컴파일 타임에 처리되기 때문에 성능 부분에서 큰 향상을 기대할 수 있습니다.
6. (C#) LINQ에 대해 설명하라.
C#언어에 포함되어 있는 쿼리 기능입니다. LINQ는 다량의 데이터를 편하고 안전하게 사용할 수 있도록 도와줍니다. LINQ는 C#에서 제공하는 컬렉션에만 사용가능한 것이 아니라, 프로세스 외부의 데이터베이스나 XML 등에도 편리하게 사용할 수 있습니다.
7. (C#) ref와 out 키워드에 대해 설명하라.
ref와 out은 모두 참조 전달에 사용되는 키워드입니다. ref의 경우 특정 변수를 참조하도록 하는 키워드입니다. ref로 선언된 변수는 선언과 동시에 가리키는 대상이 정해져야 하며, 가리키는 대상은 반드시 초기화가 되어있어야 합니다.
out 키워드는 참조 전달 중에서도 함수 내부에서 값을 저장해주는 역할을 위해 사용되는 키워드입니다. out의 경우 가리키는 대상이 초기화가 되어 있지 않아도 되지만, 함수 내부에서는 반드시 값을 저장해주어야 합니다.
ref를 이용해 out을 모두 대체할 수는 있지만, 구분하여 사용함으로써 변수가 어떻게 사용되는 지를 더욱 명확히 할 수 있습니다.
8. (C#) interface에 대해 설명하라.
여러 클래스 간에 공통의 인터페이스를 정의하기 위해 사용되는 문법입니다. 추상 클래스와 유사하지만, 모든 함수가 abstract로 선언되어야 하며 멤버 변수 및 부모 클래스를 가질 수 없다는 차이점이 있습니다. 이러한 차이는 인터페이스가 다중 상속을 통해 사용된다는 특징으로 인해 발생합니다.
다중 상속은 다이아몬드 문제 등 여러 문제를 야기할 수 있기 때문에 C#에선 다중상속을 막아놓았지만, 인터페이스는 다중 상속을 통해 구현되는 기능이기 때문에 interface로 선언된 클래스에만 다중 상속이 허락되어 있습니다. 상술했던 추상 클래스와 인터페이스의 차이점은 다중상속으로 인한 문제점을 방지하기 위해 언어 차원에서 제약을 걸어둔 것이라고 할 수 있습니다.
9. (C#) colider와 rigidbody에 대해 설명하라.
Colider는 충돌을 탐지하기 위해 사용되는 컴포넌트입니다. 각 오브젝트 간의 충돌 검사를 위해선 Colider 컴포넌트가 필수적으로 필요합니다.
RigidBody는 대상에 다양한 물리를 적용하기 위해 사용되는 컴포넌트입니다. 중력, 마찰력 등의 물리법칙을 간편하게 오브젝트에 적용할 수 있게 됩니다.
만약, 주먹에 맞은 대상이 후방으로 밀려나는 효과를 구현하고 싶다면, Colider를 사용해 주먹과 대상의 충돌을 검사한 뒤, RigidBody를 통해 일정 힘을 가함으로써 대상을 밀려나도록 할 수 있습니다.
10. (유니티) 레이캐스팅이란 무엇인가? 사용한다면 어디에 사용할 수 있는지 예시가 있는가?
레이캐스팅이란, 특정 지점에서 광선을 발사하여 경로에 존재하는 오브젝트를 검출하는 충돌 검사 기법입니다. 3D 공간에 있는 물체를 클릭하는 기능을 구현하고 싶을 때, 2D 공간에 투영되어 있는 마우스 좌표를 3D 월드 좌표로 변환한 뒤 레이캐스팅을 사용하여 경로에 있는 물체를 탐지하여 상호작용이 발생하도록 구현할 수 있습니다. 뿐만 아니라, 총을 발사하는 것을 레이캐스팅을 사용해 구현할 수도 있으며 전방의 벽을 탐지하기 위해서도 사용할 수 있습니다.
11. (유니티) 모노비헤이비어란?
객체와 유니티 엔진을 결합하기 위해 상속해야 하는 클래스입니다. 모노비헤이비어 클래스를 상속받음으로써 클래스와 에디터를 연동할 수 있으며, 객체의 생명주기가 유니티 엔진에 의해 관리되도록 할 수 있습니다. 또한, 클래스 내에서 유니티 엔진의 프레임워크를 사용할 수 있게 되면서 편리하고 유연한 개발이 가능해집니다.
12. (C#) 코루틴이란 무엇인가?
함수를 중지하거나 재개하는 기능을 제공해주는 문법입니다. 코루틴에 의해 중지된 함수를 재개하는 것은 일반적인 함수 호출에 비해 빠르기 때문에, 코루틴 함수 내부에 반복문으로 기능을 정의한 후 이를 중지하고 재개하는 방식으로 활용한다면 성능의 향상을 기대할 수 있게 됩니다. 또한, 입력, 응답 등을 기다리는 대기 시간이 발생할 때 코루틴 함수를 재개하여 다른 작업을 처리하도록 한다면 작업 사이의 비는 시간을 최소화하여 성능을 극대화할 수 있게 됩니다.
13. (C#) const와 readonly 키워드에 대해 설명하라.
두 키워드 모두 값의 수정을 막는 키워드입니다. const의 경우 대상을 아예 상수화하기 때문에 컴파일 단계에서 값이 정해져야 합니다. 그렇기 때문에 const로 선언된 변수는 선언과 동시에 초기화가 이루어져야 합니다. 런타임에 생성자가 호출된 이후 값이 정해지는 커스텀 클래스의 경우 const 키워드를 사용할 수 없으며, 멤버 변수로 선언된 const 변수는 모든 인스턴스가 같은 값을 공유하게 된다는 특징이 있습니다.
반면, readonly 키워드의 경우 힙영역에 동적으로 메모리를 할당하여 값을 저장하며, 생성자에 한해 런타임에 값이 변경되는 것이 허락됩니다. 이러한 특징으로 인해, 모든 자료형에 대해 readonly 키워드를 사용할 수 있으며 인스턴스 별로 다른 값을 보유할 수 있게 됩니다. 하지만, 런타임에 힙영역을 참조하는 이유로 const 변수에 비해 낮은 성능을 보유하게 된다는 단점이 있습니다.
14. (C#) event란 무엇인가?
델리게이트에 제약이 추가된 특수한 형태입니다. 발행 구독 패턴을 사용해 특정 상황에 실행되어야 하는 여러 함수들을 관리할 때 유용하게 사용할 수 있습니다.
event는 일반적인 델리게이트와 달리 대입 연산이 불가능하고 증감연산만 가능하며, event를 소유한 객체 외부에서 바인딩된 함수를 호출할 수 없다는 특징이 있습니다.
15. (유니티) mono와 il2cpp에 대해 설명하라.
유니티에서 제공하는 스크립팅 백엔드입니다. 모노의 경우 런타임에 코드를 기계어로 변환하기 때문에 컴파일 타임이 il2cpp에 비해 빠르지만, 런타임 퍼포먼스가 il2cpp에 비해 저조하다는 단점이 있습니다.
반면, il2cpp는 빌드 과정에서 기계어 번역을 마치기 때문에 컴파일 타임이 느리다는 단점이 있지만, 모노에 비해 런타임 퍼포먼스가 우수하다는 장점이 있습니다.
프로젝트에 있어 효율성, 개발 속도 등에서 이점을 챙기고자 한다면 모노를 사용하는 것이 유리하며 고성능 퍼포먼스를 노리고자 한다면 il2cpp를 사용하는 것이 좋습니다.
16. (C#) 기본 자료형(int, float)등에 대해 null을 사용할 수 있는가?
일반적으로는 null을 대입할 수 없지만, Nullable 객체를 활용하면 null을 대입할 수 있게 됩니다.
'모의 면접' 카테고리의 다른 글
게임 클라이언트 개발자 모의 면접 (2024/08/17) (0) | 2024.08.17 |
---|---|
게임 클라이언트 개발자 모의 면접 (2024/08/03) (0) | 2024.08.03 |
게임 클라이언트 개발자 모의 면접 (2024/07/31) (0) | 2024.07.31 |
게임 클라이언트 개발자 모의 면접 (2024/07/25) (0) | 2024.07.24 |
게임 클라이언트 개발자 모의 면접 (2024/07/22) (2) | 2024.07.22 |