Technical/Interview

[Technical Interview] 게임 클라이언트 면접 복기_2

song.ift 2022. 12. 27. 19:15

과거 면접 때, 답변 복기

(중복되는 것들도 있을 수 있음)

 

 

- 본인을 색으로 표현하자면 어떤 색인가요

뭐라했던지 기억이 안남..

 

- C++에서 캐스팅의 종류와 역할

Static cast - C 스타일 캐스터와 똑같은 의미와 형변환 능력을 가지고 있는, 가장 기본적인 캐스트 연산자이다.

Dynamic cast - 런타임에 (동적으로) 상속 계층 관계를 가로지르거나 다운캐스팅시 사용되는 캐스팅 연산자이다.

Const cast - 상수성(const)을 없애는 데 사용된다.

Reinterpret cast - 어떠한 포인터 타입도 어떠한 포인터 타입으로든 변환이 가능하다. 어떠한 정수 타입도 어떠한 포인터 타입으로 변환이 가능하고, 그 역(포인터 타입->정수 타입)도 가능하다.

 

- 가상소멸자를 사용하는 이유

클래스 내부에서 메모리를 동적할당하는 경우 소멸자에서 메모리 해제를 해주는데,

상속받은 부모의 소멸자가 가상 소멸자가 아닌 경우 객체 생성시 실제 객체의 클래스가 아닌, 생성된 포인터 자료형에 따라 소멸자가 호출된다.

결국 부모 클래스의 소멸자만 호출되고 메모리 누수가 발생한다.

하여 다형성을 지원할 수 있는 기본 클래스의 경우 소멸자를 가상함수로 지정해 놓아야한다.

 

- 객체 포인터가 뭔지

객체의 주소를 담는 포인터 변수다. 이 포인터 변수로 멤버 변수를 알고 값을 참조하거나 멤버 함수를 호출할 수 있다.

단 함수를 호출할 때 객체 타입기준으로 호출된다. 그래서 다형성이 발생되진 않는다.

 

- 다형성을 쓰는데, 객체 포인터만 쓰면 다형성이 완성될까요?

아닙니다.

 

- 오버라이딩이란

부모가 하는 함수를 자식이 재정의하는 문법이다. 상속은 그냥 자식에게 똑같은 걸 물려줬다면 오버라이딩은 함수가 두개가 되는 셈이다.

그래서 모호성이 발생되지 않는다. 그리고 다형성이 발생될려면 일단 객체 포인터가 부모타입에 자식 포인터를 가지고 있어야 기반이 잡힌다.

 

- 버츄얼 키워드에 대해 설명

버츄얼 키워드는 가상함수다. 가상함수를 만드는 키워드다. 가상함수의 장점은 무엇인가 단점은 무엇인가는 보충설명

그리고 버츄얼 키워드만 붙인다고 다형성이 발생되지 않는다. 기반은 오버라이딩이 되있어야 한다는 점이다.

 

- 다형성 발생은??

객체 포인터, 오버라이딩, 버츄얼 키워드는 각각 따져봤을 떄 다형성이 발생되진 않지만, 세 개를 합쳐지니 다형성이 발생된다.

 

- 인라인 함수에 대해 설명

단순 치환이다. 근데 사용하는 이유에 대해서 설명할 것. 그것은 매크로가 불편해서다

매크로 함수를 사용해보니 디버깅도 불편하고 복잡한 코드 읽기도 어려워서 그래서 나온것이 인라인 함수다.

그래서 인라인은 매크로 함수의 장점을 취하고 단점을 보완한 함수이다.

장점은 단순 치환이 있고, 단점은 디버깅이 불가능하다. 속도는 빠르다.

 

- 바인딩에 대해 설명

바인딩은 변수나 함수들을 메모리 번지에 연결시켜주는 것을 말한다. (프로그램 구성요소의 성격을 결정해준다.)

바인딩 시점에 따라서 정적바인딩과 동적바인딩으로 나뉜다.

정적바인딩은 일반 기본 함수를 호출할 때 정적바인딩이라 하고,

동적바인딩은 런타임 시점에 호출시킬 함수를 정해주는 것을 동적바인딩이라 한다. 대표적으로 가상함수가 있다.

 

- 가상함수테이블과 가상함수포인터 설명

버츄얼 키워드가 하나라도 존재하면 가상함수테이블이 만들어진다.

이 가상함수테이블을 참조할 가상함수포인터가 있다.

그래서 가상함수를 호출할 때, 실객체에 있는 가상함수포인터가 어떤 테이블을 참조하고 있느냐에 따라서 함수 호출이 결정된다.

 

- 최근에 무슨 게임 해봤나

 

- 우리 회사 게임 뭐해봤나

 

- ABCD가 있다면 나의 등급은

 

- 담당을 하면 어느 파트를 개발하고 싶은가

 

- OOP의 특성

제일 먼저 튀어나와 하는 것이 추상화다. 그때 내가 잘못말한 건 클래스의 4대 특성임

 

- C#, Unity 다뤄본적 있는지

 

- C++, DX, MFC 등 다양한 언어에서 제일 자신있는 것이 무엇인지

 

- 학생들한테 정렬을 가르치라고하면 어떤 정렬을 가르치겠는가

 

- 스마트 포인터 사용경험

알고있는 바로는 기본적으로 포인터를 메모리 누수가 발생할 수 있는데, 그것을 일반변수처럼 포인터가 자동으로 메모리를 제어해주는 점이 있어 안전하게 코딩할 수 있다들었다. 하지만 메모리를 포인터가 잡고있어서 프로그래머가 원하는 시점에 메모리를 해제할 수 없기 때문에 장단점이 있다 생각한다.

 

- RTTI 문법중에 사용한 것이 있다면 어떤것이 있었는지

dynamic-cast와 static-cast를 상황에 따라 사용했다.

부모클래스의 포인터에서 자식 클래스의 포인터로 다운캐스팅 할때 다이나믹 캐스트를 사용했다.

데이터 입출력을 통해 객체 안 데이터를 초기화할때나 가끔씩 발생하는 이벤트 시에 해당 객체의 데이터를 불러올 때 안전하게 dynamic-cast를 사용했고,

단순한 형변환이나 매 프레임마다 충돌같은 많은 비교연산을 할때는 런타임 비용이 낮은 static-cast를 사용했다.

 

- const-cast를 사용해본 경험이 있었는지

const cast는 상수객체를 비상수화 객체로 변환해주는 캐스트인데 공부를 해서 알고는 있었지

사실 데이터를 처음 정의할 때 상수화로 정의를 하고 머리로 기억하고 있기때문에, 이 데이터를 수정해서 개념을 바꿔놓는 다는 것은 좀 위험할 것 같아서 사용안했다.

 

- 메인메모리 계층구조

힙, 코드, 데이터, 스택 간략하게 설명

 

- 주로 사용한 stl 컨테이너는 무엇인가     

경우에 따라 사용했다.

map - key와 Value로 이루어져 pair객체를 저장한다. Key를 통해 데이터를 value에 저장하는데 중복삽임이 안된다는 점에서 데이터가 보존될 수도 있고,

알아서 정렬해주기때문에 많은 자료들을 정렬해야 할 때 사용했다.

하지만 삽입, 삭제를 할 때마다 매번 정렬하기 때문에 리소스같은 삭제하지 않는 데이터만 사용했다.

vector - 데이터가 가변적이지 않고 삽입삭제가 안일어나고 고정적일때는 vecotor를 사용했다. 또한 검색을 주로 할때는 vector 사용

list - 오브젝트매니저에서  삽입 삭제를 주로 할 때 속도가 빠른 list를 사용했다.

 

- 해싱에 대해 설명

고기를 감자와 양파같은 다른 재료와 함께 다지고 섞어서 완전히 새로운 요리의 형태로 만드는 것처럼,

해시는 데이터를 입력받으면 완전히 다른 모습의 데이터로 바꾸어 놓는 작업이다.

장점으로는 당연히 배열과 같은 개념으로 탐색이 빠르다. 하지만 어떤 걸 내주면 어떤 걸 줘야하는 것처럼

단점은 이진탐색보다 훨씬 빠른 성능을 자랑하지만, 그 성능을 위해 많은  메모리를 요구한다.(테이블생성)

 

- stl에서 제공하는 알고리즘을 사용하다보면 조건자의 형태로 들어가는 문법들이 존재한다. 조건자의 종류가 크게 함수 포인터, 함수 객체, 람다가 있는데 어떤 것을 선호했고 왜 그것을 선호했는지 이유

상황에 따라 다르게 사용

인라인화가 가능한 함수 객체를 주로 사용, 람다는 재사용성이 불가능해서 범용성이 좋지않아 불편, 함수 포인터는 인라인화도 아니고 멤버변수의 기능도 없고 람다의 캡쳐 기능도 없어서 사용을 안했다.

 

- 빅오표기법이란 무엇인지

어떤 알고리즘의 수행시간을 대략적으로 나타내는 방법을 점근표기법이라 하는데, 점근표기법에는 빅오, 빅오메가, 빅세타 표기법이 있다.

이중에서도 빅오표기법은 최악의 경우에 대한 알고리즘 수행시간 표기법을 나타내는거고 프로그래머들이 주로 애용했다.

그 이유는 장점과 단점중에 단점을 신경쓰는 것처럼, 최악의 경우라도 최악의 효율을 알 수 있다는 점에서 주로 애용했다.

 

- 충돌처리 중에 본인이 주로 사용했던 충돌이 있다면 한가지를 선택해서 왜 주로 사용했는지 설명

2D에서는 렉트 충돌, 3D에서는 스태틱 메쉬와의 충돌에서는 AABB사용, 애니메이션이 있는 다이나믹 메쉬끼리의 충돌에서는 회전을 하기 떄문에 OBB사용

AABB와 OBB는 연산이 적지 않기 때문에 매 번 충돌 체크를 하지 않게 했고, 충돌체보다 큰 구충돌체를 만들어 1차검사 그리고 2차검사를 통해 충돌 검사 진행

 

- 마지막 말

면접 분위기에 따라 다양하게 준비해서 대응했고, 그래도 솔직하게 말했다

 

=============================================================

 

느낀 점 :

질문을 했을 때 면접관이 원하는 단어나 키워드가 있다. 너무 투머치하면 안된다.

답만 딱 얘기하고 추가적인 설명은 필요시, 원하는 경우에 말씀드리면 된다.

답은 두괄식으로 한다. 두괄식은 내가 하고자하는 말을 먼저하고 보충하는 형태다.

미괄식은 앞에서 형용사나 앞에서 여러 미사여구로 꾸민담에 마지막에 결론을 얘기한다.

 

면접이란 것도 결국은 사람 대 사람인걸 숙지하자.