1. 포인터에 대해서 설명 해 보세요.
- 포인터는 어떤 값의 주소 값을 저장하는 변수입니다.
- 포인터와 연관되어 사용되는 연산자는 주소 연산자(&), 참조 연산자(*)가 있습니다.
주소연산자(&) : 해당 변수의 주소값을 반환합니다.
참조 연산자(*) : 포인터에 저장된 주소에 저장된 값을 반환합니다.
2. 오버로딩과 오버라이딩에 대해서 설명 해 보세요.
- 오버로딩은 컴파일의 다형성의 대표적인 예시 중 하나입니다. 함수 이름은 같지만 매개변수나 타입을 다르게 하여 다른 형태의 함수를 만드는것이 오버로딩 입니다.
- 오버라이딩은 런타임의 다형성의 대표적인 예시 중 하나입니다. 상속을 사용할때 부모 클래스에서 virtual로 선언된 함수를 자식 클래스에서 재정의 하는 것이 오버라이딩 입니다.
3. virtual 함수가 무엇인가요 ?
- 상속을 받아서 자식이 부모의 어떤 함수를 오버라이딩 하였을때, 재정의한 함수가 아닌 부모의 함수가 호출된다. 정적바인딩으로 인해서 호출 될 함수의 번지수가 이미 정해졌기 때문에 일어나는 현상이다. 정적바인딩이 아닌 동적바인딩으로 할당을 하여야 하는데, 이때 virtual함수로 일반 함수들을 호출 해놓는다면 그 포인터의 타입이 아닌 그 포인터가 가리키는 객체의 타입에 따라서 멤버함수를 선택하게 됩니다. 또, 가상함수 테이블은 가상함수가 있는 클래스마다 한개 생성됨으로 가상함수가 호출 되어있는 클래스를 많이 만들어도 1개로 유지됩니다.
정적바인딩과 동적바인딩 : 바인딩이란 호출될 때 함수의 주소값을 연결해 주는 것을 말합니다. 정적바인딩은 컴파일 시점에 결정되어 프로그램 실행과정에선 변경이 안되는것을 말하고, 동적바인딩은 런타임 이후에 실행과정에서 변경되는 바인딩 입니다. 가상함수 호출시 오버라이딩 된 가상함수를 가상 테이블에서 동적으로 찾아서 호출할 때 사용됩니다.
4. malloc과 new의 공통점과 차이점을 설명해 보세요.
- 공통점
- 둘다 동적할당을 위해 사용하며, 메모리 해제를 위해서는 malloc은 free, new는 delete를 사용합니다.
- 차이점
- malloc은 생성할때 메모리 할당만 하지만, new는 메모리 할당과 동시에 초기화도 진행합니다.
- malloc은 생성할 때 크기를 지정해야 하지만, new는 크기를 알아서 지정해 줍니다.
- malloc은 생성할 때 크기를 지정하여 원하는 타입으로 캐스팅해 줘야 하지만, new는 원하는 타입을 지정해서 할당하기 때문에 따로 캐스팅이 필요 없습니다.
5. 스마트포인터를 간략하게 설명하고 어떤 종류가 있는지 설명해 보세요.
- 할당된 동적메모리나 객체 다 사용하고 삭제해 주지 않으면 메모리 leak이나 다른 예기치 못한 오류가 발생할 수도 있습니다. 그런 위험을 제거 하기 위해 메모리 관리 자동화를 위해 만들어진 것이 스마트 포인터 입니다. c++11부터 추가 되었습니다.
1. unique_ptr : 스마트 포인터는 포인터 변수가 가리키는 객체가 오직 그 포인터 변수만 가리킬 수 있도록 보장해주는 포인터 입니다. move함수를 통해 소유권 이전이 가능합니다.
2. shared_ptr :
3. weak_ptr:
스마트 포인터 단점
1. 순환 참조 문제
- 순환 참조 문제는 std::shared_ptr를 사용할 때 두 개 이상의 객체가 서로 참조할 경우 순환참조가 발생합니다.
struct Node {
std::shared_ptr<Node> next;
~Node() { std::cout << "Node destroyed\n"; }
};
auto a = std::make_shared<Node>();
auto b = std::make_shared<Node>();
a->next = b;
b->next = a; // 순환 참조 발생
위의 예시에서는 참조 횟수가 0으로 줄어들지 않아서 메모리가 해제되지 않습니다. 해결 하려면 weak_ptr를 사용하여 참조를 약화시켜야 합니다.
2. 성능 오버헤드
- 스마트 포인터는 동적 메모리 할당, 참조 횟수 증기/감소와 같은 추가적인 연산으로 일반 포인터에 비해 성능 오버헤드가 발생할 수 있습니다. 이러한 영향은 실시간 성능이 중요한 게임 엔진에서는 치명적일 수 있습니다.
3. 스택 메모리에 대한 부적합성
- 스마트 포인터는 힙 메모리 관리에 특화되어 있어서, 스택에 있는 객체나 정적 메모리에 있는 객체에 스마트 포인터를 사용할 경우, 불필요하거나 위험한 상황이 발생할 수 있습니다. 이런 경우에는 일반 포인터나 참조를 사용하는 것이 적절합니다.
6.연산자 오버라이딩을 설명해보세요.
7. 생성자와 소멸자에 대해 설명해 보세요.
- 생성자는 객체가 생성될때 호출되는 함수이고, 소멸자는 객체가 메모리에서 해체될때 호출되는 함수 입니다.
8. lvalue, rvalue가 무엇인가요 ?
- lvalue는 프로그램이 접근 할 수 있는 주소가 있는것, rvalue는 접근 할 수 있는 주소가 없는것
9. const, constexpr 차이가 무엇인가요 ?
- 둘다 상수로 만들어 준다는 공통점이 있지만, constexpr은 const랑 다르게 컴파일 타임에 상수값이 결정 되어야 합니다.
10. C++ 다형성에 대해 설명 해 보세요.
- 다형성은 함수(인터페이스)는 같지만 다양한 형태로 동작할 수 있는 성질을 의미합니다. C++에서는 대표적으로 컴파일 타임(정적 바인딩)에서의 다형성과 런타임(동적바인딩)에서의 다형성으로 나뉩니다.
컴파일 타임의 다형성은 대표적으로 함수 오버로딩이 있습니다. 함수 이름 즉 모양은 같지만 자료형이 다르거나 매개변수가 달라지며 형태가 바뀌는 것이 있습니다.
런타임의 다형성은 대표적으로 함수 오버라이딩이 있습니다. 부모 함수에서 virtual로 선언되어 자식 함수에서 가상 테이블로 재정의가 가능하여 이름은 같지만 형태가 다른 것이 있습니다.
즉, 같은 이름의 함수 호출을 하지만 내용이 달라 다른 행동을 수행할 수 있는 능력이 바로 다형성 입니다.
11. C++ 빌드과정을 설명해 보세요.
12. RAII에 대해 설명해 보세요.
- C++에서 자원을 관리 해주는 디자인 패턴 중 하나이며, Resource Aquisition is Initialization의 약자로 직역해보면 '자원획득은 초기화'입니다. 자원 획득 후 Delete 해주지 않으면 memory leak으로 자원 누수가 발생하면 메모리에 큰 영향을 미치기 때문에 만들어진것이 RAII패턴 입니다. RAII 패턴을 이용한것 중 대표적인 것은 lock_guard와 스마트 포인터가 있습니다.
13. C++, C#의 공통점 차이점을 설명해 보세요.
- 공통점
둘다 객체 지향 언어라 객체 지향 언어 특징을 가지고 있다.(캡슐화, 데이터은닉, 상속, 다형성)
- 차이점
1. 다중상속 : c++에만 있고 c#에서는 구현부가 없는 부모 클래스를 도입하였는데 그것이 인터페이스입니다.
2. 포인터 : 둘다 포인터 사용이 가능하지만 c#에서는 포인터 사용 코드는 안전하지 않다고 표시됩니다. 그래서 포인터 대신 래퍼런스 사용이 권장됩니다.
3. 정밀도 손실 : c#에서는 암시적 변환으로 인한 정밀도 손실을 허용하지 않아서, 명시적 변환이 필요합니다.
4. 메모리 차이** : c++는 자원 할당 후 해제를 해줘야 하지만, c#은 가비지 컬렉터 도입으로 메모리를 자동으로 해제를 합니다.
14. 절차지향, 객체지향 언어에 대해 설명해 보세요.
- 절차지향은 말 그대로 순서를 지향한다는 것 입니다. 코드를 짠 순서대로 실행이 되기 때문에 코드를 순차적으로 짜야하는 단점이 있지만 객체지향에 비해서 속도가 빠릅니다.
- 객체지향은 레고 처럼 기능별로 만들어 둔것을 조합하여 만듭니다. 그래서 절차지향보다 코딩이 간편하며 재활용성이 높으며 디버깅이 쉽습니다. 단점은 설계에 많은 시간이 들며, 절차지향보다 속도가 느립니다.
15. STL이 무엇인가요 ?
- C++에서 STL은 Standard Template Library로 표준 템플릿 라이브러브러리로, C++ 표준 라이브러리의 일부 입니다. 데이터 구조와 알고리즘을 템플릿 형태로 제공하여 일반적이고 재사용 가능한 코드를 작성할 수 있게 해줍니다.
STL의 주요 구성 요소 3가지
1. 컨테이너
- 컨테이너는 데이터를 저장하고 관리하기 위한 구조를 제공합니다. 컨테이너는 크게 세 가지 범주로 나뉩니다.
1-1. 순차 컨테이너
- 데이터를 순서대로 저장하며, 벡터, 리스트, 테크 등이 여기에 포함됩니다.
1-2. 연관 컨테이너
- 키를 기준으로 정렬된 데이터를 저장하며, 맵과 셋이 여기에 포함됩니다. (트리 구조 기반)
- 검색과 삽입이 빠릅니다. (O(log n))
1-3. 비정렬 컨테이너
- 데이터가 정렬되지 않고 해시 기반으로 저장되며, unordered_set, unordered_map이 여기에 포함됩니다.
- 평균 검색 / 삽입 시간이 매우 빠릅니다. (O(logn))
2. 알고리즘
- 정렬, 탐색, 변환 등과 같은 데이터 처리를 위한 함수를 제공합니다. 알고리즘은 주로 반복자(iterator)과 함께 사용됩니다.
정렬 - sort, 탐색 - find, 연산 - accumulate
3. 반복자 (iterators)
- 반복자는 컨테이너 요소에 접근하기 위한 추상화된 포인터입니다. 컨테이너 요소들을 순회하거나 조작할 때 사용됩니다.
STL의 장점
1. 재사용성과 유연성 : 템플릿 기반으로 다양한 데이터 타입 재사용 가능
2. 효율성 : 최적화된 알고리즘 데이터 구조 제공
3. 코드 간결화 : 복잡한 자료구조 알고리즘을 설계 하지 않고 쉽게 구현 가능
STL의 단점
1. 디버깅이 어려움 : STL 내부 오류 발생 시 디버깅 어려움
3. 퍼포먼스 제약 존재 : 특정 경우에 직접 구현한 알고리즘 / 자료구조보다 느릴 가능성 존재
16. 캐스팅이 무엇인가요 ?
'면접준비' 카테고리의 다른 글
[Network] 네트워크 공부 (0) | 2024.09.26 |
---|---|
[C++] 자료구조, 알고리즘 공부 (2) | 2024.09.07 |
[DB] 데이터베이스 공부 (1) | 2024.09.05 |