C++ Flashcards

C++ 관련 개발자 면접 질문 정리

1
Q

new / delete는 내부적으로 어떻게 동작하는가?

A

new와 delete는 동적 메모리 할당과 해제를 위해 사용됩니다. new는 지정된 크기의 메모리를 할당하고 그 포인터를 반환합니다. 할당된 메모리에 객체를 생성하기 위해 해당 클래스의 생성자를 호출하기 위해 사용합니다. delete는 포인터가 가리키는 객체의 소멸자를 호출하여 객체를 파괴합니다. 메모리를 해제하기 위해 사용합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

가상 함수는 무엇이고 어떻게 동작하는가?

A

가상 소멸자는 파생 클래스의 객체가 올바르게 소멸되도록 보장하는 것입니다. 기본 클래스의 포인터를 통해 파생 클래스의 객체를 삭제할 때 파생 클래스의 소멸자가 호출되도록 합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

가상 함수 테이블이란 무엇인가?

A

가상 함수를 포함하는 클래스는 가상 함수 테이블을 가지며, 이는 함수 포인터 배열로 구성됩니다. 각 객체는 가상 함수 테이블을 가리키는 포인터를 갖고 있으며, 이를 통해 실제 호출할 함수가 런타임에 결정됩니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

런타임 다형성이란 무엇인가?

A

런타임 다형성은 프로그램 실행 시점에 객체의 타입을 결정하고 해당 타입의 적절한 메서드를 호출하는 기능입니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

오버로딩과 오버라이딩의 차이점은 무엇인가?

A

오버로딩은 동일한 이름의 함수를 매개변수의 타입이나 개수에 따라 다르게 정의하는 것입니다. 오버라이딩은 기본 클래스에서 선언된 가상 함수를 파생 클래스에서 재정의하는 것입니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

정적 바인딩과 동적 바인딩이란 무엇인가?

A

정적 바인딩은 컴파일 타임에 함수 호출이 결정되는 것이고 비가상 함수 호출 시 사용됩니다. 동적 바인딩은 런타임에 함수 호출이 결정되는 것으로 가상 함수 호출 시 사용됩니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

가상 소멸자는 왜 필요한가?

A

가상 소멸자는 파생 클래스의 객체가 올바르게 소멸되도록 보장합니다. 기본 클래스의 포인터를 통해 파생 클래스의 객체를 삭제할 때 파생 클래스의 소멸자가 호출되도록 하기 위해서 필요합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

템플릿이 무엇이고 어떻게 동작하는가?

A

템플릿은 함수나 클래스를 정의할 때 데이터 타입을 지정하지 않고, 실행 시에 타입을 지정할 수 있도록 하는 기능입니다. 이를 통해 코드 재사용성을 높이고, 타입에 독립적인 프로그램을 작성을 이유로 사용합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

템플릿을 왜 헤더 파일에 작성해야 하는가?

A

템플릿은 컴파일 타임에 인스턴스화되기 때문에, 정의와 구현이 모두 동일한 번역 단위에 있어야 합니다. 이를 위해 템플릿 정의를 헤더 파일에 포함시켜야 다른 소스 파일에서도 템플릿을 사용할 수 있습니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

메모리를 간접 참조할 수 있는 방법에는 무엇이 있고 그것의 차이점은 무엇인가?

A

메모리를 간접 참조할 수 있는 방법에는 주로 포인터와 레퍼런스가 있습니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

포인터란 무엇이고 왜 사용하는가?

A

메모리 주소를 직접 조작할 수 있고 동적 메모리 할당, 배열, 함수 포인터 등 다양한 용도로 사용됩니다. 그리고 널 포인터 값을 가질 수 있습니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

레퍼런스란 무엇이고 왜 사용하는가?

A

다른 변수에 대한 별칭으로 초기화 시 반드시 유효한 변수를 참조해야 합니다. 그리고 널 값을 가질 수 없으며, 포인터보다 사용이 간단하고 안전합니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Call By Value / Call By Reference의 차이점은 무엇인가?

A

Call By Value는 함수에 인자로 전달된 값을 복사하여 사용합니다. 그리고 함수 내에서 매개변수의 값을 변경해도 원본 값에는 영향을 미치지 않습니다. Call By Reference는 함수에 인자로 전달된 변수의 참조를 사용합니다. 함수 내에서 매개변수의 값을 변경하면 원본 값도 변경됩니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

C++의 4가지 cast에 대해서 설명하라.

A

C++은 여러 종류의 캐스트 연산자를 제공하여 명시적인 형 변환을 수행할 수 있으며, static_cast, dynamic_cast, const_cast, reinterpret_cast가 있습니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

static_cast는?

A

컴파일 타임에 타입을 변환하고 기본 자료형 간의 변환, 포인터 간의 변환, 상속 관계에서의 업캐스팅 및 다운캐스팅 등에 사용됩니다. 상속 관계에서의 다운캐스팅과 같이 안전성이 보장되지 않는 변환에서는 잘못된 결과를 초래할 수 있습니다.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

dynamic_cast는?

A

주로 상속 관계에서의 안전한 다운캐스팅을 위해 사용되며 런타임에 타입을 확인하고, 변환이 성공하면 유효한 포인터를 반환하며, 실패하면 널 포인터를 반환합니다. RTTI(런타임 타입 정보)를 필요로 하며, 기본 클래스에 적어도 하나의 가상 함수가 있어야 합니다.

17
Q

const_cast는?

A

객체의 상수성을 제거하거나 추가할 때 사용되며, 주로 API와의 호환성을 위해 const 객체를 비const로 변환하는 경우에 사용됩니다.

18
Q

reinterpret_cast는?

A

포인터 간의 비트 단위 변환을 수행하고 전혀 다른 타입으로 변환할 때 사용하며, 매우 위험하므로 신중하게 사용해야 합니다. 주로 하드웨어 인터페이스나 네트워크 프로그래밍 등에서 사용됩니다.

19
Q

구조체 패딩이란 무엇인가?

A

구조체의 멤버가 특정 메모리 정렬 기준에 맞추기 위해 삽입되는 여분의 메모리로, 이는 CPU가 특정 메모리 정렬을 요구할 때 효율적인 메모리 접근을 보장하기 위해 사용됩니다.

20
Q

다중 상속의 문제점은 무엇인가?

A

다중 상속은 한 클래스가 둘 이상의 클래스로부터 상속받는 것을 말하며, 다이아몬드 상속 문제, 복잡성 증가 문제, 함수 이름 충돌 문제를 야기할 수 있다.

21
Q

다이아몬드 상속 문제란 무엇인가?

A

두 개의 상위 클래스가 동일한 기본 클래스를 상속받고, 하위 클래스가 이 두 상위 클래스를 상속받을 때 발생합니다. 기본 클래스의 멤버가 중복 상속되어, 어느 경로를 통해 접근해야 할지 모호해지는 문제를 말합니다.

22
Q

복잡성 증가 문제란 무엇인가?

A

다중 상속 구조에서의 문제로 클래스 계층 구조를 복잡하게 만들어 이해하고 유지보수하기 어렵게 하는 문제를 말합니다.

23
Q

함수 이름 충돌 문제란 무엇인가?

A

두 부모 클래스가 동일한 이름의 멤버를 가지고 있을 때, 하위 클래스에서 어떤 멤버를 사용할지 모호성이 발생하는 문제를 말합니다.

24
Q

this 포인터는 무엇이고 언제 초기화 되는가?

A

클래스의 멤버 함수 내에서 해당 함수가 호출된 객체를 가리키는 포인터입니다. 멤버 함수가 호출될 때마다 암묵적으로 전달되며, 해당 객체의 주소를 보유합니다. 객체의 멤버 함수가 호출될 때 자동으로 초기화됩니다.

25
Q

static 키워드에 대해서 설명하라.

A

변수나 함수의 수명과 링크 범위를 지정하여, 전역 변수 및 함수에서는 파일 내부 접근 제한, 클래스 멤버에서는 클래스 차원에서의 공유, 지역 변수에서는 정적 수명 유지를 가능하게 합니다.

26
Q

const 키워드에 대해서 설명하라.

A

변수, 포인터, 함수 매개변수, 멤버 함수 등을 변경 불가능하게 하여 데이터의 불변성을 보장합니다.

27
Q

C++에서 struct와 class는 어떤 차이가 있는가?

A

구조체는 기본 접근 제어 지시자가 public인 반면에 class는 private이며, 전통적으로 struct는 데이터 구조체에 class는 객체지향 프로그래밍에 사용합니다.

28
Q

Iterator란 무엇인가?

A

컨테이너의 요소들을 순회하고 접근하는 데 사용되는 객체로, 포인터와 유사하게 동작하며 다양한 컨테이너에 대해 범용적으로 사용합니다.

29
Q

얕은 복사와 깊은 복사는 무엇인가?

A

얕은 복사는 객체의 포인터 주소만 복사하여 원본과 복사본이 같은 메모리 위치를 참조하게 만듭니다. 깊은 복사는 포인터가 가리키는 실제 메모리 공간까지 새로 할당하여 두 객체가 독립된 메모리 공간을 가지도록 만듭니다.

30
Q

빌드 과정에 대해서 설명하라.

A

소스코드를 전처리하여 매크로와 헤더를 처리하고, 컴파일하여 어셈블리 코드로 변환하며, 어셈블하여 기계어 코드의 목적 파일을 만들고, 마지막으로 링크하여 실행 가능한 프로그램으로 만드는 일련의 단계입니다.

31
Q

unique_ptr / weak_ptr / shared_ptr은 어떤 차이점이 있는가?

A

unique_ptr은 독점 소유로 이동만 가능하며 복사가 불가능하고, shared_ptr은 참조 카운터를 통한 공유 소유를 지원하며 복사 및 이동이 가능하고, weak_ptr은 shared_ptr의 메모리를 약하게 참조하여 순환 참조를 방지하며 직접 접근은 불가능하지만 lock을 통해 접근할 수 있습니다.