스터디를 진행하며 실시한 모의 면접을 정리한 내용입니다.
겹치는 내용을 고려하지 않고 면접을 실시하기 때문에 일자 별로 겹치는 내용이 많을 수 있습니다.
1. noexcept 키워드에 대해 설명하라.
함수가 어떠한 예외도 방출하지 않음을 명시하는 키워드입니다. 예외가 발생하지 않음을 확신할 수 있다면, 컴파일러는 그에 맞는 최적화를 진행할 수 있으므로 추가적인 성능 향상을 기대할 수 있습니다.
2. 컨텍스트 스위칭이란?
CPU를 점유중인 프로세스, 스레드가 다른 프로세스, 스레드로 교체되는 과정을 의미합니다. 잦은 컨텍스트 스위칭은 시스템에 부하를 줄 수 있으므로 이를 최소화하는 방향으로 프로그래밍하는 것이 중요합니다.
3. 동시성과 병렬성이란?
동시성이란 물리적으로는 동시에 실행되지 않지만, 동시에 실행되는 것처럼 보이는 것입니다. 하나의 단일코어에서 여러 작업을 처리하는 것이 동시성의 대표적인 예시입니다. 반면, 병렬성은 물리적으로 동시에 실행되는 것을 의미합니다. 다중 코어에서 여러 작업을 처리하는 것이 대표적인 예시입니다.
4. 템플릿 특수화에 대해 설명하라.
템플릿은 특정 함수, 클래스가 다양한 자료형에 대응할 수 있도록 도와주는 문법입니다. 템플릿을 사용하염 모든 자료형에 대해 동일한 구조와 기능을 지닌 함수, 클래스 등을 만들 수 있습니다. 템플릿 특수화는 템플릿으로 함수, 클래스 등을 선언한 상태에서 특정 자료형에 대해서는 다른 구조를 취하고 싶을 때 사용합니다. std::vector가 템플릿 특수화를 사용하는 대표적인 예시입니다. std::vector를 boolean타입으로 선언하게 되면 다른 자료형과는 다르게 unsigned int 자료형을 비트단위로 쪼개어 값을 저장하고 사용하게 됩니다.
5. 함수형 프로그래밍이란?
값을 변경하지 않는 함수를 조합하여 프로그래밍하는 방법론을 의미합니다. 함수 위주의 사용으로 인해 코드의 재사용성이 높습니. 또한, 변수에 쓰기작업을 하지 않기 때문에 멀티 스레드 환경에서 안전하다는 장점도 있습니다. 하지만, 설계가 복잡하고 어렵다는 단점이 있습니다.
6. const 키워드에 대해 설명하고, 위치에 따른 의미를 설명하라.
const란 대상을 상수화하여 값을 변경할 수 없도록 만드는 키워드입니다. 값형 변수에 붙으면 대상을 변경할 수 없는 상태로 만듭니다. 포인터 변수의 경우엔 앞에 붙을 경우 포인터가 가리키는 대상을 변경할 수 없게 만들며, 포인터 변수의 뒤에 붙으면 가리키는 대상을 상수화합니다.
멤버 함수의 경우에도 const를 사용할 수 있습니다. 멤버 함수의 뒤에 const를 붙이게 될 경우 함수 내에서 사용되는 this포인터가 가리키는 대상을 상수화하기 때문에 멤버 변수를 수정할 수 없게 됩니다.
7. malloc과 new 의 차이를 설명하라.
malloc는 동적 할당을 할 때 사용하는 함수입니다. 할당 받을 메모리 크기를 인자로 대입하면 동일한 크기의 메모리를 할당하여 가장 앞의 주소를 void*타입으로 반환해줍니다. void* 으로 메모리를 생성하기 때문에 대상의 생성자를 호출하지 않습니다.
new는 동적 할당을 할 때 사용하는 연산자입니다. new는 메모리 할당, 생성자 호출, 타입캐스팅의 순서로 이루어지기 때문에 malloc과 달리 반환형이 void*이 아니며, 생성자를 호출해준다는 차이가 있습니다. 또한, 할당 받을 메모리의 크기가 malloc처럼 자유롭지 않고 자료형의 크기에 기반한다는 차이가 있습니다.
8. struct에 char, int가 순서대로 선언되어 있을 때, 해당 구조체의 크기는?
8바이트의 공잔을 차이합니다. CPU는 데이터를 사용할 때 4바이트 단위로 사용하는 것이 가장 효율적이기 때문에 char타입과 int타입의 크기를 합친 5바이트의 크기로 메모리를 할당하지 않고, char타입에 4바이트를 할당하고, 그 뒤에 int 타입의 메모리를 할당하게 됩니다.
9. static 멤버변수에 대해 설명하라.
static 멤버변수는 사용 범위가 클래스 내부로 제한되어 있는 static 변수입니다. static 변수인 만큼 데이터 영역에 위치하고 있으며 인스턴스가 아무리 생성되어도 메모리 상에 1개만 존재하게 됩니다.
10. volatile 키워드에 대해 설명하라.
컴파일러의 최적화를 제한하는 키워드입니다. 컴파일러의 최적화로 인해 작업 결과가 의도와 다를 수 있는 경우에 사용하게 됩니다.
11. Map과 Unordered_map의 차이에 대해 설명하라.
map과 unordered_map 모두 키와 데이터를 쌍으로 저장하여 사용하기 위한 자료구조입니다. map은 이진 균형 트리 기반의 자료구조이며, 데이터가 삽입, 삭제될 때마다 정렬을 실행합니다. 반면, unordered_map은 해시 테이블 기반의 지료구조 이며 데이터를 정렬하지 않습니다.
12. Port 넘버란?
IP와 MAC주소를 통해 PC에 도달하였을 때, 해당 PC에서 여러 프로세스가 실행중이라면 최종 목적지를 식별할 수 없게 됩니다. 이 때, 최종 목적지 프로세스를 식별하기 위해 사용되는 것이 포트 번호입니다. 각 프로세스에 고유의 번호를 부여하여 이를 기반으로 목적지를 식별하게 됩니다. 포트 번호는 실행중인 프로세스 간에 겹치지 않는 것이 중요합니다. 그렇기 때문에 웹 사이트 등에서 이미 사용하고 있는 포트 번호를 파악한 뒤 겹치지 않는 방향으로 설정해야 합니다.
13. 컬링과 클리핑의 차이는? 또한 컬링의 종류를 아는대로 말하라.
컬링이란 대상을 아예 렌더링에서 제외하는 것이며, 클리핑은 렌더링 된 대상의 일부를 잘라내는 것을 의미합니다.
대표적인 컬링 기법은 백페이스 컬링, 뷰 프러스텀 컬링, 오클루전 컬링, 디스턴스 컬링이 있습니다.
백페이스 컬링은 카메라의 시야를 기준으로 반대면을 렌더링에서 제외하는 기법입니다.
뷰 프러스텀 컬링은 카메라의 시야 절두체를 기반으로 외부에 있는 물체를 렌더링에서 제외하는 기법입니다.
오클루전 컬링은 벽 등의 물체에 가려 보이지 않는 대상을 렌더링에서 제외하는 기법입니다.
디스턴스 컬링은 카메라와의 거리가 충분히 멀리있는 대상을 렌더링에서 제외하는 기법입니다.
14. CPU의 구조에 대해 간단하게 설명하라.
CPU는 크게 ALU, CU, 레지스터로 구성되어 있습니다. CU는 명령어를 해독하여 어떤 부품이 어떤 작업을 실행해야 하는지, 어떤 연산을 실행해야 하는지 등을 결정짓는 역할을 합니다. ALU는 CU로부터 명령받은 산술, 논리 연산을 진행하게 됩니다. 레지스터는 ALU에서 실행된 연산의 결과값이나 연산에 사용될 데이터를 저장하는 역할을 합니다.
15. 람다함수란?
람다함수란 이름이 없는 함수를 의미합니다. 다른 함수와 같이 미리 선언과 정의를 해두고 이를 재사용하는 것이 아니라 필요한 상황에 즉석으로 생성하여 사용하게 됩니다. 이러한 차이로 인해 람다함수는 정적 함수와 다르게 스택영역에 위치하게 됩니다.
람다 함수를 잘 활용하면 메모리를 아낄 수 있고, 논리를 쉽게 이해할 수 있다는 장점이 있지만 호출된 함수를 추적하는 것이 어려워 디버깅이 어려워지며 무분별하게 사용하면 코드의 가독성을 저하할 수 있다는 단점이 있습니다.
16. 벡터의 resize와 reserve의 차이에 대해 설명하라.
resize는 입력받은 인자의 값만큼 벡터의 size를 증가시키는 역할을 합니다. 반면, reserve는 벡터의 capacity를 입력받은 인자의 값만큼 증가시키는 역할을 합니다.
17. 동기와 비동기란?
동기란, 기존의 작업이 종료되어야만 다음 작업을 실행하는 것을 의미합니다. 반면, 비동기는 기존의 작업이 종료되지 않더라도 다음 작업을 실행하는 것을 의미합니다.
18. L-Value 와 R-Value에 대해 설명하라.
L-Value란 메모리 상에 존재하여 주소를 참조할 수 있는 값을 의미합니다. 반면, R-Value는 호출식이 끝나면 사라지는 임시의 값으로 주소를 참조할 수 없는 값을 의미합니다.
19. std::atomic이란?
멀티스레드 환경에서 데이터를 보호하기 위한 기법 중 하나입니다. 변수의 값을 변경하는 경우, 간단한 산술 연산일지라도 값을 읽은 뒤 연산을 수행하고 값을 저장하는 과정이 순차적으로 이루어져야 합니다. 하지만, 중간에 다른 스레드가 개입하여 변수의 값을 변경하게 되면 예측하지 못한 결과가 발생할 수 있습니다. 이를 막기 위해, 반드시 함께 실행되어야 하는 여러 연산을 하나로 묶어 다른 스레드가 중간에 개입할 수 없도록 만들어주는 객체가 std::atomic입니다.
20. IP 와 MAC주소의 차이는?
IP는 연결된 회선의 주소이기 때문에 접속하는 인터넷에 따라 주소값이 계속 변경되지만, MAC주소는 랜카드에 기록되어 있어 변경되지 않는다는 차이가 있습니다.
21. 함수의 호출 과정을 설명하라.
함수를 호출하기 전에 현재 스택 프레임의 주소 값을 프레임 포인터 레지스에 저장한 뒤, 함수의 주소를 참조하여 함수를 실행하고, 함수가 종료되면 프레임 포인터 레지스터의 값을 참조하여 기존의 스택 프레임으로 돌아오는 과정으로 진행됩니다.
22. 캐시 지역성이란?
메인 메모리에 있는 데이터를 캐시 메모리로 복사할 때, 참조한 메모리 주소를 기반으로 근처에 있는 값을 한 번에 가져오게 됩니다. 이 때, 다음 연산에 사용될 변수가 현재 사용된 변수와 메인 메모리에서 가까운 곳에 위치했다면, 캐시 메모리에도 있을 확률이 높아집니다. 이러한 경우 캐시의 공간 지역성이 좋다고 표현합니다. 동일한 데이터를 여러 번 참조하는 경우에도 기존에 참조한 대상이 캐시 메모리에 있을 확률이 높아집니다. 이러한 것을 캐시의 시간 지역성이 좋다고 표현합니다.
23. 인터페이스란?
인터페이스란, 순수 가상함수를 사용해 특정 메서드의 정의를 강제하는 추상 클래스를 활용해 외부에서 다양한 파생 클래스를 통일된 방식으로 사용할 수 있도록 하는 것입니다.
24. 운영체제란?
운영체제란, 컴퓨터가 부될 때 가장 먼저 실행되는 소프트웨어입니다. 유저가 하드웨어, 메모리 관리 등의 저수준 영역을 신경쓸 필요 없이 대신 해주는 역할을 합니다. 이로 인해, 유저는 컴퓨터를 안전하고 편리하게 사용할 수 있게 됩니다.
25. 인터럽트란?
CPU 작업 중 예외가 발생하거나 다른 작업을 우선적으로 처리해야 하는 경우 현재 작업을 잠시 중단하고 우선적으로 다른 작업을 처리하는 것을 인터럽트라고 합니다.
26. SIMD 연산이란?
SIMD연산이란, 하나의 명령어로 다중 데이터를 처리하는 CPU의 고속 연산 기법입니다. 벡터, 행렬 연산 등에 사용하게 되면 성능 향상을 기대할 수 있습니다.
27. join과 detach에 해 설명하라.
join이란, 스레드가 작업을 완료할 때까지 메인 스레드의 실행을 중지하는 함수입니다. 반면, detach는 스레드의 작업 완료 상태와 관계없이 메인 스레드는 실행을 유지하게 됩니다. 특정 작업이 모두 완료되어야만 정상적으로 프로그램을 실행할 수 있을 때는 join을 사용하며, 메인 스레드의 흐름과 관계없이 작업을 처리해야 하는 경우엔 detach를 사용하게 됩니다.
28. 다형성이란?
하나의 객체, 메서드 등이 다양한 형태로 사용될 수 있는 것을 의미합니다. 상속관계에선 타입캐스팅을 통해 자식 클래스가 부모 클래스로 사용되는 것이나, 함수 오버로딩을 통해 동일한 이름의 함수가 다양하게 사용되는 것이 대표적인 예시입니다.
29. RAII 패턴이란?
자원의 획득과 해제를 객체의 생애주기와 결합하는 디자인 패턴입니다. 자원의 획득은 객체의 생성자에서 실행되도록 하며, 자원의 해제는 객체의 소멸자에서 실행되도록 설계합니다. 이러한 설계를 통해, 객체가 생성되어 있는 동안 항상 자원이 존재함을 보장할 수 있고 객체가 소멸하는 순간 자원이 해제됨을 보장할 수 있어 메모리 누수를 방지할 수 있으며 안전하게 자원을 사용할 수 있게 됩니다.
30. std::forward에 대해 설명하라.
인자가 L-Value라면 L-Value의 형태로 리턴하고 R-Value라면 R-Value의 형태로 반환해주는 함수입니다. 템플릿 함수에선 인자가 L-Value인지 R-Value인지 정확히 파악할 수 없어 무브 시맨틱스가 제대로 작동하지 않을 가능성이 있습니다. std::forward를 사용하면 인자의 실제 타입에 맞게 캐스팅되기 때문에 템플릿 환경에서도 무브 시맨틱스가 제대로 작동하도록 할 수 있습니다.
31. 무브 시맨틱이란?
무브 시맨틱이란, 깊은 복사로 인한 오버헤드를 방지하기 위해 복사가 아닌 이동 연산을 활용하는 기법입니다. 데이터를 얕은 복사한 뒤, 복사되는 대상의 데이터를 지워버리는 방식으로 동작하기 때문에 이동 연산 이후에 사용되지 않을 것이 확실한 객체에 대해서만 사용해야 합니다.
32. explicit 키워드에 대해 설명하라.
암시적 형변환을 막는 키워드입니다. 대입 연산에서 발생하는 암시적 형변환으로 인해 프로그래머의 의도와 다른 결과가 발생할 수 있는 경우, explicit 키워드를 활용해 명시적 형변환을 강제할 수 있습니다.
33. 뮤텍스와 세마포어의 차이에 대해 설명하라.
뮤텍스는 임계영역에 1개의 스레드만을 허용하지만, 세마포어는 여러개의 스레드를 허용할 수 있습니다. 뮤텍스의 경우 작업을 진행중인 스레드만이 뮤텍스 객체를 조작할 수 있지만, 세마포어는 외부의 스레드가 세마포어를 조작할 수 있습니다.
34. std::vector에 대해 설명하라.
std::vector는 C++의 STL에서 제공해주는 배열 기반의 자료구조입니다. 원소가 메모리에 연속적으로 위치하기 때문에 캐시적중률이 높고 임의 접근이 가능하다는 장점이 있지만, 적절한 reserve를 하지 않으면 잦은 동적 할당으로 인한 오버헤드가 발생하거나 메모리 내부 단편화가 발생할 수 있습니다.
'모의 면접' 카테고리의 다른 글
게임 클라이언트 개발자 모의 면접 (2024/08/03) (0) | 2024.08.03 |
---|---|
게임 클라이언트 개발자 모의 면접 (2024/07/31) (0) | 2024.07.31 |
게임 클라이언트 개발자 모의 면접 (2024/07/25) (0) | 2024.07.24 |
게임 클라이언트 개발자 모의 면접 (2024/07/17) (0) | 2024.07.17 |
게임 클라이언트 개발자 모의 면접 (2024/07/15) (0) | 2024.07.15 |