1> C++에서의 구조체, 클래스 차이

=> 기본 접근 명시자가 구조체는 public 클래스는 private.


2> C#에서의 구조체, 클래스 차이

=> 구조체는 스택영역에서, 클래스는 힙 영역에서 생성됨.

구조체는 값 타입, 클래스는 참조 타입


3> 가상 함수 테이블 , 포인터의 동작 방식 설명

=> 가상 함수 테이블 포인터는 클래스형 객체가 정의된 메모리 공간의 맨 위쪽에 명시됨.

이 가상 함수 테이블 포인터를 시작 포인터로 하는 가상 함수 테이블 디스크립터에는

본인 클래스 내에 "가상으로" 명시된 함수들의 시작 포인터들이 기록되어 있다.


부모 클래스에 정의되어있는 함수가 오버라이딩 되었을 경우 오버라이딩 된 함수의 시작 포인터가

가상 함수 테이블에 저장이 되고, 오버라이딩이 되어있지 않은 부모 클래스의 가상 함수는 원본 함수의 시작 주소가

가상 함수 테이블에 명시된다.


가상함수 테이블을 사용하지 않는다면, 다양성을 보장 받지 못하고,

자식 클래스에서는 부모 클래스에서 오버라이딩한 함수 외 부모클래스에서 오버라이딩 당한 함수의 오버로드 함수들은

자식 클래스에서 접근하지 못한다.


(오버로딩 오버라이딩 꼬리질문 또 들어올 수 있음)


4> RTTI란?

=> Real Time Type Information으로 프로그램 실행 중 변수의 타입 정보를 얻을 수 있는 기술.

typeid()를 통해 변수의 타입을 얻을 수 있음.

dynamic_cast 와 연동하여 다운 캐스팅 가능.


5> RAII란?

=> Resource Acquisition is Initialization으로 자동으로 할당을 해제해주는 C++ 기술.

unique_ptr, share_ptr, weak_ptr, lock_guard 등등이 RAII 기술을 사용.


(꼬리 질문) unique_ptr, share_ptr, weak_ptr 차이점?

unique_ptr은 이중 포인팅 불가, 즉 레퍼런스를 이용하여 복제 불가, RAII로 자동 할당 해제

share_ptr은 레퍼런스를 이용하여 복제가능, 만일 A가 B를 참조하고 B가 A를 참조할 때, A share_ptr이 소멸 되었다면,

B는 A가 제거되었는지 영문을 모르므로 A를 참조, 또는 B 본인을 제거하려다가 예외가 발생이 됨.

weak_ptr은 위 share_ptr문제를 해결하기 위해 share_ptr을 래핑하여 A share_ptr이 소멸 되었을 시, weak_ptr이 A가

NULL이며 이전에 제거가 되었음을 알려줌. 이를 통해 B가 제거 될 시 예외를 회피할 수 있게 됨.


이 외에 C++ 관련 CS 면접 예상 문제 추천 좀

참고로 본인 게임 개발 쪽 종사자임.