1. 객체지향 3대 특성
캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)
2. 접근 지정자
private, protected, public
3. 생성자와 소멸자
클래스에는 기본 생성자, 복사 생성자, 대입 연산자, 소멸자가 포함된다.
class Data {
private:
int x;
int y;
int z;
public:
Data(int a, int b, int c) : x(a), y(b), z(c) {
// 초기화 리스트를 이용한 생성자
}
};
4. 이동 생성자와 복사 생성자 비교
복사 생성자는 기존 객체를 사용해 새 객체를 초기화한다. 이동 생성자는 임시 객체의 자원을 효율적으로 전달한다.
class Example(Example& other) {
// 복사 생성자 예시
}
5. 얕은 복사와 깊은 복사의 차이
얕은 복사는 메모리 주소만 복사하고, 깊은 복사는 실제 데이터를 복사한다.
6. 빈 클래스의 멤버와 크기
빈 클래스는 기본 생성자, 소멸자, 복사 생성자, 대입 연산자가 자동 생성된다. 크기는 1바이트다.
7. 메모리 영역
전역 영역, 힙 영역, 스택 영역, 상수 영역, 코드 영역
8. C++와 C의 차이점
C++는 객체지향, 예외 처리, 템플릿, 네임스페이스 등을 지원한다.
9. struct와 class의 차이
기본 접근 지정자가 struct는 public, class는 private다.
10. struct 메모리 정렬
구조체 멤버는 자연 정렬 경계에 맞춰 정렬되며, 패딩이 추가될 수 있다.
11. new/delete와 malloc/free의 차이
- new/delete는 연산자이고, malloc/free는 함수다.
- new는 메모리 할당과 생성자 호출을, delete는 소멸자 호출과 메모리 해제를 수행한다.
- new는 타입 정보를 포함한 포인터를 반환하고, malloc은 void*를 반환한다.
- new/delete는 헤더 파일 없이 사용 가능하지만, malloc/free는 <cstdlib>이 필요하다.
12. 메모리 누수 상황
동적 할당한 메모리를 해제하지 않거나, 예외 발생 시 해제 코드가 실행되지 않을 때 발생한다.
13. sizeof와 strlen 비교
sizeof는 타입이나 변수의 크기를 바이트 단위로 반환하고, strlen은 문자열의 길이를 반환한다.
14. 포인터와 참조의 차이
정의 및 속성 차이
- 포인터는 주소를 저장하는 변수이고, 참조는 별칭이다.
- const 포인터는 가능하지만 const 참조는 없다.
- 포인터는 다중 포인터가 가능하지만 참조는 불가능하다.
- 포인터는 null이 될 수 있지만, 참조는 반드시 초기화해야 한다.
- 포인터는 대상을 변경할 수 있지만, 참조는 초기화 후 변경 불가능하다.
- sizeof(참조)는 대상 객체의 크기이고, sizeof(포인터)는 포인터 자체 크기다.
매개변수 전달 차이
// 포인터 전달
void change(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 참조 전달
void update(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
15. 와일드 포인터 발생과 방지
와일드 포인터는 유효하지 않은 메모리를 가리키는 포인터다.
발생 원인
- 초기화되지 않은 포인터 사용
- 소멸된 객체를 가리키는 포인터
- 해제 후 null로 설정하지 않은 포인터
방지 방법
- 참조 사용
- 포인터 정의 시 초기화
- 해제 후 null 설정
16. 다형성: 동적 다형성과 정적 다형성
동적 다형성은 가상 함수로 구현하고, 정적 다형성은 함수 오버로딩과 템플릿으로 구현한다.
17. 가상 함수와 순수 가상 함수의 차이
가상 함수는 기본 구현을 가지며, 순수 가상 함수는 구현이 없어 추상 클래스를 만든다.
18. 소멸자와 생성자의 가상화
기반 클래스 소멸자는 가상으로 선언해야 하며, 생성자는 가상이 될 수 없다.
19. 정적 다형성 구현 방식
함수 오버라이딩, 함수 오버로딩, 템플릿
20. static 키워드
지역 변수, 전역 변수, 클래스 멤버 변수, 클래스 멤버 함수에 사용된다.
21. const 키워드
변수, 포인터, 클래스 객체, 클래스 멤버 함수에 사용된다.
22. extern 키워드
다른 파일에 정의된 전역 변수를 참조할 때 사용한다.
23. volatile 키워드
컴파일러 최적화를 방지하여 변수 값이 예기치 않게 변경될 수 있음을 알린다.
24. 형 변환 연산자
static_cast, dynamic_cast, const_cast, reinterpret_cast
25. 우측값 참조
임시 객체를 참조할 수 있는 새로운 참조 타입이다.
26. std::move 함수
좌측값을 우측값으로 변환하여 이동 연산을 활성화한다.
27. 스마트 포인터
auto_ptr, unique_ptr, shared_ptr, weak_ptr
28. shared_ptr 순환 참조 해결
weak_ptr을 사용하여 순환 참조를 방지한다.
29. vector와 list 비교
vector는 연속 메모리 공간을 사용하여 임의 접근이 빠르고, list는 이중 연결 리스트로 삽입/삭제가 빠르다.
30. vector 반복자 무효화
크기 변경이나 중간 삽입/삭제 시 반복자가 무효화될 수 있다.
31. map과 unordered_map 비교
map은 정렬된 키-값 쌍을 유지하고, unordered_map은 해시 테이블 기반이다.
32. set과 unordered_set 비교
set은 정렬된 고유 요소를 유지하고, unordered_set은 해시 테이블 기반이다.
33. STL 컨테이너 공간 할당기
컨테이너의 메모리 할당 및 해제를 관리하는 객체다.