C# 질문
21 | 인터페이스와 추상클래스의 차이는 무엇인가요? | 인터페이스는 행동에 대한 추상화가 필요할때 사용됩니다. 예상이 되지 않는 행동일때 많이 사용되며 A has B관계로 고양이 =/=걷다 이지만 , 고양이는 걷는 행동을 할 수 있습니다. 추상클래스는 구체적인 추상화가 필요할때 사용됩니다. 필드,메서드 를 부모,자식 사이에서 공통적으로 사용할때 많이 사용됩니다. A is B관계로 , 고양이 = 동물 , 강아지 = 동물 |
22 | 가비지 컬렉터란 무엇인가요? | GC란 Heap 영역에서 참조가 끊겨 사용하지 않는 데이터들을 수집하여 처리해주는 기능입니다. |
23 | 가비지 컬렉터의 장점과 단점에 대해 설명해주세요. | GC의 장점은 프로그래머가 신경을 덜 써도 되기에 실수 발생률을 줄여줍니다. 메모리의 할당 해지는 런타임시 매우 중요합니다. 즉, 프로그래머가 놓친 부분을 GC가 자동으로 다 처리해주는 것이 장점입니다. 단점으로는 GC는 처리비용이 높기에 결국 너무 의존해서는 안됩니다. GC는 프로그래머가 원하는 호출시점을 알 수 없기에 런타임 되고 있는 프로그램이 어느순간 렉을 먹거나 하는 경우입니다. |
24 | 가비지 컬렉터의 세대 개념에 대해 설명해주세요. | GC의 세대 개념은 Java는 .NET에서 사용되는 개념입니다. GC는 일반적으로 <세가지 세대>로 메모리를 나눕니다 0세대는 객체가 생성되면 할당됩니다. 1세대는 GC가 동작한뒤 사용되고 있는 0세대 객체들이 1세대로 승격합니다. 똑같은 동작을 반복하게 되고 1세대에서 살아남은 객체들은 2세대로 승격하게 됩니다. 즉, 2세대는 가장 큰 메모리 공간을 차지하게되며 계속 쌓이게 되면 오버헤드 문제점을 일으킬수도 있습니다. 크기가 큰 객체는 LOH(라지 오브젝트 heap)에 할당되에 일반적인 세대 기반 수집과는 다른방식으로 처리됩니다. |
25 | 박싱, 언박싱을 사용할 때 주의해야 할 점은 무엇일까요? | 박싱,언박싱은 결국 형변환의 일종이기에 박싱을 한 필드(변수)가 언박싱 될때 다른 자료형으로 변환시 잘못된 데이터가 들어가는 경우를 주의해야 합니다. null값이 들어가게 될수도 있다. 이러한 단점을 방지하기 위해 제네릭을 사용 할 수 있습니다. |
26 | 오브젝트 풀을 사용하면 메모리 관리에 도움이 되는 이유가 무엇일까요? | 오브젝트를 Inisiate/Destroy를 반복하게 될경우 오브젝트의 생성/파괴시 처리비용이 높으며 , 파괴는 즉 GC의 수집량을 늘리는 상황이 됩니다. 즉 오브젝트 풀링을 사용하여 런타임시에 사용할 오브젝트를 미리 할당해놓고 사용하게되면 필요없는 생성/파괴가 일어나지 않기에 메모리 관리에 도움이 됩니다./ |
27 | 제네릭이란 무엇인가요? | 제네릭이란 일반화로 , 클래스를 자료형에 상관없이 사용할때, 즉,다양한 데이터 타입으로 재사용 할수 있는 기술이며 자주 사용되는 Class를 변수처럼 사용하기 위한 용도로 보면됩니다. |
28 | 람다식(Lambda Expression)이 무엇인지 설명해주세요. | 람다식은 이름없는 함수로도 불리며, 원하는 호출시점에서 편하게 생성하여 사용 할 수 있는 기능이다. 단점으로는 이름이 없기에 다른 곳에서 호출하지 못하여 재사용성이 떨어지는 단점이 있다. |
29 | LINQ란 무엇인가요? | LINQ를 설명하기전에 쿼리에 대해 알아야합니다. 쿼리는 DB에 정보를 요청하는 행위 ,즉 데이터를 필터링,정렬,조회 등등할때 사용되는 단어입니다. LINQ는 .NET 프레임워크에 내장된 기능이며 사용하면 좀더 SQL, 컬렉션, XML, 엔티티 프레임워크 등의 데이터에 접근하여 쉽게 관리 할 수 있습니다. 하지만 LINQ의 단점으로는 간단한 데이터 조회시에는 괜찮지만 데이터가 복잡해지고 양이 많아지게 되면 퍼포먼스나 코드 가독성 면으로 떨어질수 있습니다. |
30 | 리플렉션(Reflection)이 뭔지, 사용을 해봤다면 어떤 이유에서 사용했는지 설명해주세요. | 리플렉션은 .NET에서 런타임에 메타데이터를 사용하여 클래스,메서드, 프로퍼티 등에 접근하고 조작할 수 있는 기능을 말합니다. 보통 코드를 빌드 과정에서 컴파일시에 해당 프로그램에 사용되는 자료형이 선언이 되는데, 해당 동작은 그 과정을 위반하고 런타임 중에 동적으로 생성하는것이다. 즉, 이러한 동작이 처리비용이 높고 , 컴파일 타임의 안정성을 저해하기 때문에 사용에 매우 신중을 가해야 된다고 생각합니다. |
유니티 질문
1 | Unity 생명주기(Unity Life Cycle)에 대해서 설명해주세요. | Monobehaviour를 상속한 Class의 함수 호출 시점을 나타낸 것이다. 즉, 이 생명주기 함수들로 Class의 초기화,생성,업데이트,파괴를 할 수 있는것입니다. |
2 | MonoBehaviour 클래스의 주요 메서드와 그 기능에 대해 설명해주세요. | 주요 메서드로 Awake와 Start,Update가 있습니다. 물론 이 밖에도 주요 메서드들은 더 있지만 이 3가지를 주로 사용하였기에 설명해보겠습니다. |
2-1 | MonoBehaviour 클래스에서 Start와 Awake의 차이점은 무엇이며, 이를 적절히 사용하는 방법에 대해 설명해주세요 |
Awkae와 Start의 주요 차이점은 호출 시점입니다. Awake는 오브젝트가 활성화되자마자 호출됩니다. Start는 오브젝트가 활성화 된 이후 첫 번쨰 프레임 업데이터 전에 호출됩니다. 즉, Awake보다 뒷 시점에 호출이 됩니다. Awake는 스크립트간의 참조, 즉 초기화를 하기위해 주로 사용합니다. Start는 Awake에서 초기화가 되고 난 후의 동작을 할때 주로 사용 하였습니다. |
3 | Update, FixedUpdate, LateUpdate의 차이점에 대해 설명해주세요. | Update는 매 프레임마다 호출되는 메서드입니다. FixedUpdate는 물리연산에 처리되는 메서드로 프레임률에 상관없이 일정한 간격으로 호출 됩니다. LateUpdate는 프레임 종료직전에 한번 호출하게 되는 메서드입니다. |
4 | Time.deltaTime이란 무엇이며, 사용하는 이유에 대해 설명해주세요. | deltaTime이란 프레임과 프레임 사이의 시간을 측정한것입니다. 이 델타타임이 필요한 이유는 기기의 성능에 따라 게임 플레이가 다른것을 보여주면 안되기 때문입니다. 간단히 말하면 핑이 튄다, 핑이 높다라는 표현이며 이 델타타임을 이용하여 기기성능에 상관없이 유저들에게 똑같은 게임 플레이를 제공 할 수 있습니다. |
5 | 코루틴의 동작원리와 사용해본 예시를 함께 설명해주세요. | 코루틴은 비동기라고 생각하지만 아닙니다. 메인 쓰레드에서 동작하며 비동기적으로 일시적으로 중단/재개 할수있는 기능입니다. 코루틴을 시작하게되면 메인 로직 동작중에 코루틴 시점이 오면 코루틴 함수가 동작하고 종료되면 다시 원복하여 메인 로직을 동작하게 하는 원리입니다. 사용해본 예시로 , Update 처럼 매 프레임을 체크할 필요는 없 |
6 | Invoke와 코루틴의 차이에 대해 설명해주세요. | Invoke는 인자값을 사용 할 수 없지만 코루틴은 인자값을 사용 할수 있습니다. 즉 , 간단한 시간 지연 함수 호출시에는 Invoke가 좋지만 , 로직 및 구조가 복잡해지고 확장성을 챙겨야 되는경우에는 코루틴이 적합하다고 생각합니다. |
7 | 코루틴과 멀티쓰레딩은 어떤 차이가 있는지 설명해주세요. | 코루틴은 메인스레드에서 동작하며 비동기적으로 동작하는거고 멀티쓰레딩은 스레드를 여러개 생성하여 비동기로 동작합니다. 즉, 여러 로직(렌더링,서버)를 병렬로 작업하여 효율성을 증가합니다. |
8 | 유니티 최적화 기법은 어떤 것들이 있나요? | 여러장의 스프라이트를 하나의 파일로 관리하는 스프라이트 아틀라스 및 거리에 따른 렌더링 최적화 기법인 LOD 기법 , 카메라의 영역에 있지 않으면 렌더링하지 않는 오클루전 컬링 기법 등을 알고 있습니다. |
8-1 | 최적화를 해본 적이 있나요? 없다면 어떤 최적화가 있는지 설명해주세요. | 2D 슈팅게임을 만들며 , 플레이어 캐릭터 및 적,투사체의 Sprite리소스를 Sprite 아틀라스로 만들어 사용했던 적이 있습니다. 해당 기능을 사용하여 기존에 Sprite를 사용했던것보다 SpriteAtala를 사용하여 드로우콜을 최적화한 경험이 있습니다. |
8-2 | 최적화에서 가장 중요한 부분은 무엇인가요? | 해당 최적화에서 중요한 부분은 DrawCall를 최소한으로 호출하는것입니다. 렌더링이 아주 큰 처리비용을 가지고 있기에 최소한의 DrawCall을 사용해야됩니다. |
8-3 | 최적화를 위해서 적용해본 텍스쳐 포맷이 있나요? | 텍스쳐 포맷은 따로 사용해본적은 없습니다. 하지만 필요로 해야되는 기능이기에 꼭 익혀서 자신의 것으로 만들어놓겠습니다. |
9 | 드로우콜에 대해서 설명하고, 최적화하는 방식에 대해 알고 있는 것이 있으면 설명하세요. | 드로우 콜은 CPU가 현재 프레임에 무엇을 그릴지 결정하고 GPU에 그리게하는 것입니다. 제가 아는 최적화 방식은 LOD(Level of Detail) 기법이 있습니다. GPU는 하나의 폴리곤을 그리기 위해 가까이 있든 멀리있든 해당 메쉬의 크기에 맞춰 그리게 됩니다. 하지만 이렇게되면 쿼드오버드로우 현상이 발생하게 되고 멀리 조그만한 점을 그리기 위해 4개의 픽셀을 사용하게되는 비효율적인 상황이 나옵니다. 즉 멀리있는 폴리곤은 그리지 않는것이 LOD 기법의 특징입니다. |
10 | Find 함수 사용을 자제해야 하는 이유에 대해 설명해주세요. | FInd 함수는씬에 존재하는 모든 오브젝트를 탐색하기에 시간 복잡도 및 처리 비용이 매우 높기 때문입니다. 대처법으로는 하이어라키에 자식 오브젝트로 부모오브젝트가 필요한것을 배치하거나 컴포넌트를 사용하는 방법이 있습니다. |