스터디를 진행하며 실시한 모의 면접을 정리한 내용입니다.
겹치는 내용을 고려하지 않고 면접을 실시하기 때문에 일자 별로 겹치는 내용이 많을 수 있습니다.
1. (C++) void*에 대해 설명하라.
C++에서 자료형이란, 메모리 영역에 저장된 바이너리 데이터를 어떻게 해석하는 지를 규정하는 것입니다. 그렇기 떄문에 일반적인 데이터는 자료형이 반드시 정해져 있어야 하지만, 해당 데이터를 직접적으로 사용하지 않고 저장된 바이너리 데이터 혹은 저장된 주소값을 참조하는 것만 필요한 경우엔 void*를 활용할 수 있습니다.
예를 들어 쉐이더에 상수버퍼 데이터를 전달하는 경우, 상수버퍼의 자료형은 GPU 내에서 결정되기 때문에 CPU에선 자료형과 무관한 바이너리 데이터만 전달하면 됩니다. 이러한 특징으로 인해 GPU에 전달할 데이터를 void* 타입으로 캐스팅하여 관리한다면 편하고 일관성있는 데이터 관리 구조를 구축할 수 있게 됩니다.
2. 동시성과 병렬성이란 무엇인가?
여러 작업이 물리적으로 동시에 처리되는 것을 병렬성이라고 합니다. 멀티코어 CPU의 경우 각 코어당 하나의 작업을 처리할 수 있기 때문에 물리적으로 여러 작업이 동시에 실행될 수 있습니다.
반면, 싱글코어의 경우 동시에 하나의 작업만 수행할 수 있기 때문에 여러 작업이 물리적으로 동시에 실행될 수는 없습니다. 이러한 한계를 극복하고 여러 프로세스가 동시에 실행되는 듯한 경험을 사용자에게 제공하기 위해 운영체제는 CPU 스케줄링 기법을 활용하여 여러 프로세스를 초고속으로 번갈아 실행하게 됩니다. 이처럼 실제로는 동시에 실행되고 있지 않지만 동시에 실행되는 것처럼 보이는 것을 동시성이라고 합니다.
3. (C++) 빌드과정에 대해 설명하라.
가장 먼저 전처리기 과정이 수행됩니다. 전처리기 단계에선 프로그램 실행에 불필요한 주석, 공백 등을 제거하고 매크로에 의해 정의된 변수, 함수 등을 모두 실제 값으로 치환하는 과정을 거칩니다.
또한, include된 헤더파일의 내용을 모두 cpp파일의 상단에 삽입하여 파일을 통합하는 과정을 거칩니다.
이 과정이 끝난 뒤에는 컴파일 단계를 수행하게 됩니다. 컴파일 단계에선 C++로 작성된 코드를 저수준의 어셈블리어로 변환하는 과정을 거칩니다. 코드를 변환하는 과정에서 문법상의 오류를 검출하는 과정을 동시에 거치게 됩니다. 프로그램이 정상적으로 실행될 수 없을 정도의 오류를 발견한다면 그 즉시 빌드를 중단하게 됩니다.
컴파일 단계가 끝난 뒤엔 어셈블리 단계를 거치게 됩니다. 이 단계에선 어셈블리어로 변환된 코드를 기계어로 변환하는 과정을 거치게 됩니다. 코드를 기계어로 변환한 뒤엔 object 파일을 생성하게 됩니다.
어셈블리 단계를 마친 뒤엔 링킹 과정을 거치게 됩니다. 이 단계에선 여러 개의 오브젝트 파일과 정적 라이브러리를 결합하여 실행할 수 있는 하나의 exe 파일을 생성하게 됩니다.
이 4개의 과정이 모두 끝나면 빌드가 종료되며 실행할 수 있는 프로그램이 생성됩니다.
4. 동기와 비동기에 대해 설명하라.
동기란 이전의 작업이 종료되어야 다음 작업이 수행될 수 있는 것을 의미합니다. 반면, 비동기는 이전 작업의 종료 여부와 관계 없이 다음 작업이 수행될 수 있는 경우를 의미합니다.
예를 들어, 단일 스레드 환경에선 이전의 작업이 완료되어야 다음 작업이 수행될 수 있기 때문에 동기적이라고 할 수 있지만 멀티 스레드 환경에서 메인 스레드의 작업과 독립적으로 수행되고 있는 작업이 있다면 이를 비동기적이라고 할 수 있습니다.
5. (C++) \n과 std::endl의 차이에 대해 설명하라.
\n은 단순히 입력 버퍼에 \n이라는 줄바꿈 문자를 추가하는 것입니다. 문자가 출력될 때, \n을 기점으로 줄바꿈을 수행하여 출력하게 됩니다.
std::endl은 기존의 메세지를 모두 출력하고 줄바꿈을 수행한 뒤 입력 버퍼를 비우는 작업도 함께 실행하게 됩니다.
6. (C++) 리터럴 문자열을 char [] 에 저장할 때와 char* 에 저장할 때 차이는?
char [] 과 같은 배열 형태로 리터럴 문자열을 저장하게 되면, 스택영역에 존재하는 배열 내부에 바이트 단위로 문자열을 나누어 저장하게 됩니다.
반면, char*로 저장하게 되면 리터럴 문자열은 데이터 영역에 저장되고 char*는 리터럴 문자열이 저장된 메모리 주소값을 저장하게 됩니다.
데이터 영역에 저장된 문자열을 여러 곳에서 재활용될 수 있는 문자열이기 때문에 함부로 수정하게 되면 위험한 상황이 발생할 수 있습니다. C++은 이러한 위험성을 방지하기 위해 char* 타입으로 리터럴 문자열을 저장하는 것을 허용하지 않고 있으며 반드시 const char* 타입으로 저장하도록 강제하고 있습니다.
7. (C#) 코루틴이란?
일반적인 함수는 return 문을 수행해야 지역을 탈출하지만, 코루틴 함수는 중간에 함수 실행을 중단한 뒤 나중에 재개하여 사용할 수 있습니다. 입력 대기 시간 등에 코루틴 함수를 활용하여 다른 작업을 수행하도록 설계한다면 프로세스의 성능을 높일 수 있습니다.
8. (C++) 배열과 포인터의 차이에 대해 설명하라.
포인터란, 특정 메모리 영역의 주소를 저장하는 변수입니다. 저장된 주소값을 통해 메모리 영역에 간접적으로 접근할 수 있게 됩니다. 이를 활용하면 불필요한 데이터의 복사를 방지할 수 있으며, 변수가 선언된 지역 외부에서도 접근할 수 있게 됩니다.
배열은 일렬로 나열된 데이터의 가장 앞 부분을 가리키는 일종의 포인터 변수입니다. 하지만, 가리키는 주소값이 변경될 경우 배열의 원소를 더이상 참조할 수 없기 때문에 가리키는 대상을 변경할 수 없다는 제약이 존재합니다.
9. (C++) SSO란?
SSO란 std::string의 동적할당으로 인한 오버헤드를 조금이라도 줄이기 위해, 길이가 짧은 문자열은 힙영역이 아닌 스택영역에 저장하도록 하는 최적화 기법입니다.
10. (C++) union이란?
하나의 데이터를 다양항 방식으로 활용하기 위해 사용하는 문법입니다. union을 활용하면 동일한 4바이트의 데이터라고 하더라도 4개의 char 타입의 원소로 이루어진 배열로 사용할 수도 있고, int 타입 변수로도 사용할 수도 있게 됩니다.
11. (C++) Lvalue와 Rvalue에 대해 설명하라.
L-Value란 이름이 존재하며, 지역을 벗어나거나 메모리를 해제하기 전까지 소멸되지 않는 값입니다. 반면, R-Value는 이름이 존재하지 않으며 표현식이 끝난 이후 사라지는 임시의 값입니다.
12. (C#) Nullable이란?
null을 사용할 수 없는 int, char 등의 자료형에 null을 사용할 수 있도록 도와주는 객체입니다.
13. (C++) operator new 란?
C++의 동적할당 함수인 new의 경우 메모리를 할당하고 생성자를 호출한 뒤 메모리 주소를 타입캐스팅하여 반환하는 3개의 과정으로 실행됩니다. operator new는 이 중에서 메모리를 할당하는 역할을 담당하는 함수입니다. C언어의 malloc처럼 크기에 맞는 메모리를 할당하여 이를 반환해줍니다. operator new는 의도적으로 재정의하는 것도 가능하다는 특징이 있습니다.
14. 람다 함수란?
람다 함수란, 이름이 없는 함수를 의미합니다. 일반적인 함수는 미리 선언, 정의를 해놓은 뒤 이를 재활용하는 방식으로 사용됩니다. 반면, 람다 함수는 필요할 때 즉석에서 정의하여 사용할 수 있으며, 함수의 사용이 끝나면 메모리에서 소멸하게 됩니다.
15. 메시란?
오브젝트가 화면에 그려지는 위치를 결정짓기 위한 데이터 덩어리입니다. 여러 개의 버텍스로 구성되어 있으며 각 버텍스는 위치, 법선, 색상 등의 정보를 포함할 수 있습니다.
16. is-A 와 has-A에 대해 설명하라.
두 가지 모두 객체간의 관계를 표현하는 방식입니다. is-A란 대입 연산이 가능한 경우를 의미합니다. 상속 관계에 있는 두 객체에서 하위 객체는 상위 객체에 대입 연산이 가능하기 때문에 is-A 관계라고 할 수 있습니다.
반면, has-A 관계는 한 객체가 다른 객체를 소유하고 있는 경우를 의미합니다. 컴포넌트 관계처럼 한 객체가 다른 객체를 멤버 변수로 소유하여 그 기능을 활용할 수 있는 경우 has-A 관계라고 합니다.
'모의 면접' 카테고리의 다른 글
게임 클라이언트 개발자 모의 면접 (2024/08/14) (0) | 2024.08.14 |
---|---|
게임 클라이언트 개발자 모의 면접 (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 |