스터디를 진행하며 실시한 모의 면접을 정리한 내용입니다.
겹치는 내용을 고려하지 않고 면접을 실시하기 때문에 일자 별로 겹치는 내용이 많을 수 있습니다.

1. 포인터와 참조자의 차이를 설명하라.

더보기

포인터의 경우 nullptr을 가리킬 수 있지만 참조자는 반드시 존재하는 대상을 가리켜야 합니다. 하지만, 포인터는 가리키고 있는 대상을 자유롭게 바꿀 수 있는 반면 참조자는 가리키고 있는 대상을 변경할 수 없습니다. 이러한 차이로 인해 참조자는 포인터에 비해 안전하게 사용할 수 있지만, 포인터만큼 유연하게 사용할 수는 없습니다.

2. C++의 캐스팅은 무엇이 있는가?

더보기

컴파일 타임에 이루어지는 static_cast, 런타임에 작동하는 dynamic_cast, 포인터의 형변환이 가능한 reinterpret_cast, 포인터 변수의 상수성을 제거해주는 const_cast가 있습니다.

3. 해시테이블이란?

더보기

해시 값을 키로 사용하는 자료구조입니다.

4. 해시테이블의 장단점은?

더보기

해싱된 키 값이 배열의 인덱스로 사용되기 때문에 데이터를 탐색하고 접근하는 것이 매우 빠르다는 장점이 있습니다. 다만, 원소의 수가 매우 적을 경우 메모리가 낭비될 수 있다는 단점이 있으며 동일한 해시 값을 가지는 키가 여럿 존재할 경우 성능이 떨어질 수 있다는 단점이 있습니다.

5. 운영체제란?

더보기

사용자가 하드웨어 상호작용, 메모리 관리 등 저수준의 영역을 대신 관리하여 유저가 신경쓰지 않도록 도와주는 프로그램입니다. PC가 부팅될 때 가장 먼저 실행되어 유저가 편하고 안전하게 PC를 사용할 수 있도록 다양한 인터페이스를 제공해줍니다.

6. 메모리 풀링이란?

더보기

여러 개의 오브젝트가 생성될 필요가 있을 때, 필요할 때마다 메모리를 할당하는 것이 아니라 미리 할당해두고 필요한 만큼 사용하는 기법입니다. 런타임에 발생하는 동적 할당을 줄일 수 있으며, 오브젝트를 메모리에 순차적으로 위치시켜 캐시 적중률을 높일 수 있습니다. 이로 인해 성능의 향상을 기대할 수 있지만 불필요하게 많은 메모리를 할당한 경우 내부 단편화가 발생할 수 있습니다.

7. placement new란?

더보기

new 연산자의 경우, 메모리를 할당하고 생성자를 호출하여 값을 초기화한 뒤 할당 받은 메모리의 주소를 타입 캐스팅하여 반환하는 과정으로 진행됩니다. 이 과정 중에서 메모리 영역에 생성자를 호출하여 값을 초기화하는 역할을 하는 것이 placement new입니다. 이미 할당되어 있는 영역에 생성자를 호출하여 값을 초기화할 수 있으며, new 연산자 외부에서도 필요에 따라 사용할 수 있습니다. 주로 메모리 풀링에 사용됩니다. 

8. 캐시 적중률이란?

더보기

CPU가 캐시에서 데이터를 찾을 확률을 의미합니다. 캐시 적중률이 낮을 경우 CPU가 메인 메모리에 접근하는 횟수가 많아지기 때문에 성능의 저하가 발생할 수 있습니다.

9. 고정 소수점과 부동소수점에 대해 설명하라.

더보기

고정 소수점은 2진수로 변환된 실수를 그대로 메모리에 저장하는 방식입니다. 부동 소수점 방식에 비해 정밀도가 높지만 동일한 메모리 크기에서 표현할 수 있는 실수의 범위가 매우 좁다는 단점이 있습니다.

 

부동 소수점 방식은 2진수로 변환된 실수의 정수부가 1이 되도록 소숫점을 앞으로 옮긴 값을 가수부에 저장하고, 소숫점을 옮긴 정도를 지수부에 저장하는 방식입니다. 고정 소수점에 비해 정밀도가 다소 낮지만, 메모리 크기 대비 표현할 수 있는 실수 범위가 고정 소수점에 비해 매우 넓다는 장점이 있습니다.

10. 메모리 구조에 대해 설명하라.

더보기

메모리는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 구성되어 있습니다. 코드 영역은 기계어로 번역된 바이너리 코드가 저장되며, 데이터 영역엔 전역 변수, static 변수가 저장됩니다. 힙 영역은 필요에 따라 메모리를 동적으로 할당하여 사용할 수 있는 영역이며 스택 영역은 호출 된 함수의 로컬 데이터를 저장하는 영역입니다. 

11. 변환 색인 버퍼란?

더보기

변환 색인 버퍼란 페이징 테이블의 데이터를 캐싱하는 하드웨어입니다. 페이징 기법으로 가상 메모리를 구현한 환경에선 CPU가 물리 주소에 접근하기 위해 페이징 테이블을 한 번 거쳐야 합니다. 페이징 테이블은 메인 메모리에 위치하기 때문에 CPU는 메인 메모리에 2번 접근해야 하는데, 이로 인해 병목 현상이 발생하게 됩니다. 변환 색인 버퍼는 CPU가 메인 메모리에 직접 접근하는 횟수를 최소화하여 병목현상을 완화하는 역할을 합니다.

12. quicksort란?

더보기

하나의 피봇을 설정한 뒤, 피봇보다 작은 값은 피봇의 왼쪽으로 옮기고 피봇보다 큰 값은 피봇의 오른쪽으로 이동시키는 작업을 피봇에 의해 분할되는 좌우에 재귀적으로 반복하는 방식으로 구현하는 정렬 알고리즘입니다. 평균적으로는 NlogN의 시간 복잡도를 보이지만 피봇에 따라 정렬 속도가 크게 차이나기 때문에 적절한 피봇을 정할 수 없는 상태라면 다른 정렬 알고리즘을 사용하는 것이 유리할 수 있습니다. 

13. 클래스와 객체란?

더보기

객체는 구현하고자 하는 대상이며, 클래스는 객체의 속성을 코드로 작성하여 구체화한 것입니다. 

14. 명령어파이프라인이란?

더보기

명령어 파이프라인이란 CPU의 작업 성능을 극대화하기 위해 명령어를 여러 단계로 분할하여 여러 명령어를 병렬적으로 처리하는 기법입니다.

15. 닷넷 프레임워크란?

더보기

마이크로 소프트에서 제작한 프레임워크로 운영체제에 의존적이지 않은 개발, 실행 환경을 제공해줍니다. 닷넷 프레임워크를 사용할 수 있는 다양한 언어들이 동일하게 작동할 수 있도록 작성된 코드를 IL이라는 중간 언어로 컴파일 한 뒤 런타임에 운영체제에서 이해할 수 있는 기계어로 번역하는 방식으로 작동합니다.

+ Recent posts