C++ Flashcards
C++ 관련 개발자 면접 질문 정리
new / delete는 내부적으로 어떻게 동작하는가?
new와 delete는 동적 메모리 할당과 해제를 위해 사용됩니다. new는 지정된 크기의 메모리를 할당하고 그 포인터를 반환합니다. 할당된 메모리에 객체를 생성하기 위해 해당 클래스의 생성자를 호출하기 위해 사용합니다. delete는 포인터가 가리키는 객체의 소멸자를 호출하여 객체를 파괴합니다. 메모리를 해제하기 위해 사용합니다.
가상 함수는 무엇이고 어떻게 동작하는가?
가상 소멸자는 파생 클래스의 객체가 올바르게 소멸되도록 보장하는 것입니다. 기본 클래스의 포인터를 통해 파생 클래스의 객체를 삭제할 때 파생 클래스의 소멸자가 호출되도록 합니다.
가상 함수 테이블이란 무엇인가?
가상 함수를 포함하는 클래스는 가상 함수 테이블을 가지며, 이는 함수 포인터 배열로 구성됩니다. 각 객체는 가상 함수 테이블을 가리키는 포인터를 갖고 있으며, 이를 통해 실제 호출할 함수가 런타임에 결정됩니다.
런타임 다형성이란 무엇인가?
런타임 다형성은 프로그램 실행 시점에 객체의 타입을 결정하고 해당 타입의 적절한 메서드를 호출하는 기능입니다.
오버로딩과 오버라이딩의 차이점은 무엇인가?
오버로딩은 동일한 이름의 함수를 매개변수의 타입이나 개수에 따라 다르게 정의하는 것입니다. 오버라이딩은 기본 클래스에서 선언된 가상 함수를 파생 클래스에서 재정의하는 것입니다.
정적 바인딩과 동적 바인딩이란 무엇인가?
정적 바인딩은 컴파일 타임에 함수 호출이 결정되는 것이고 비가상 함수 호출 시 사용됩니다. 동적 바인딩은 런타임에 함수 호출이 결정되는 것으로 가상 함수 호출 시 사용됩니다.
가상 소멸자는 왜 필요한가?
가상 소멸자는 파생 클래스의 객체가 올바르게 소멸되도록 보장합니다. 기본 클래스의 포인터를 통해 파생 클래스의 객체를 삭제할 때 파생 클래스의 소멸자가 호출되도록 하기 위해서 필요합니다.
템플릿이 무엇이고 어떻게 동작하는가?
템플릿은 함수나 클래스를 정의할 때 데이터 타입을 지정하지 않고, 실행 시에 타입을 지정할 수 있도록 하는 기능입니다. 이를 통해 코드 재사용성을 높이고, 타입에 독립적인 프로그램을 작성을 이유로 사용합니다.
템플릿을 왜 헤더 파일에 작성해야 하는가?
템플릿은 컴파일 타임에 인스턴스화되기 때문에, 정의와 구현이 모두 동일한 번역 단위에 있어야 합니다. 이를 위해 템플릿 정의를 헤더 파일에 포함시켜야 다른 소스 파일에서도 템플릿을 사용할 수 있습니다.
메모리를 간접 참조할 수 있는 방법에는 무엇이 있고 그것의 차이점은 무엇인가?
메모리를 간접 참조할 수 있는 방법에는 주로 포인터와 레퍼런스가 있습니다.
포인터란 무엇이고 왜 사용하는가?
메모리 주소를 직접 조작할 수 있고 동적 메모리 할당, 배열, 함수 포인터 등 다양한 용도로 사용됩니다. 그리고 널 포인터 값을 가질 수 있습니다.
레퍼런스란 무엇이고 왜 사용하는가?
다른 변수에 대한 별칭으로 초기화 시 반드시 유효한 변수를 참조해야 합니다. 그리고 널 값을 가질 수 없으며, 포인터보다 사용이 간단하고 안전합니다.
Call By Value / Call By Reference의 차이점은 무엇인가?
Call By Value는 함수에 인자로 전달된 값을 복사하여 사용합니다. 그리고 함수 내에서 매개변수의 값을 변경해도 원본 값에는 영향을 미치지 않습니다. Call By Reference는 함수에 인자로 전달된 변수의 참조를 사용합니다. 함수 내에서 매개변수의 값을 변경하면 원본 값도 변경됩니다.
C++의 4가지 cast에 대해서 설명하라.
C++은 여러 종류의 캐스트 연산자를 제공하여 명시적인 형 변환을 수행할 수 있으며, static_cast, dynamic_cast, const_cast, reinterpret_cast가 있습니다.
static_cast는?
컴파일 타임에 타입을 변환하고 기본 자료형 간의 변환, 포인터 간의 변환, 상속 관계에서의 업캐스팅 및 다운캐스팅 등에 사용됩니다. 상속 관계에서의 다운캐스팅과 같이 안전성이 보장되지 않는 변환에서는 잘못된 결과를 초래할 수 있습니다.