1. C언어와 C++의 비교
객체지향 프로그래밍이란?
객체를 만들고 그 객체들 간 상호작용을 통해 로직을 구성하는 프로그래밍 설계 방법론입니다.
모듈화란?
분할된 시스템을 의미합니다. 프로그래밍에 적용한다면 프로그램의 기능 단위로 분할하는 것입니다.
객체 지향 프로그램이의 장점, 단점은?
코드 재사용이 용이합니다.
객체를 가져와 사용할 수 있으며, 상속을 통해 확장도 가능합니다.
유지보수가 수월합니다.
객체로 나눠져있으므로 객체 단위로 나누어 유지보수가 가능하기 때문입니다.
대형 프로젝트에 적합합니다.
객체단위로 모듈화시켜 개발할 수 있기 때문입니다.
절차지향 프로그래밍에 비해 느립니다.
컴퓨터가 연산하는 방식인 절차지향을 따르는게 아닌 객체 단위로 로직이 구성되기 때문입니다.
절차지향 프로그래밍이란?
프로그램의 절차에 중점을 둔 프로그래밍 설계 방법론입니다.
절차지향 프로그래밍의 장점은?
속도가 빠르다는 장점이 있습니다.
컴퓨터가 연산하는 방식에 맞춰 코딩하는 방법이기 때문입니다.
new 연산자에 대해 설명하시오
c++에서 메모리를 동적할당 하는 연산자입니다.
malloc에 대해 설명하시오
메모리를 동적할당하는 라이브러리 함수입니다.
new와 malloc의 차이에 대해 말해보시오
타입에서 차이가 있습니다.
malloc은 라이브러리 함수이고, new는 연산자입니다.
사용 방식의 차이입니다.
malloc은 할당할 메모리 크기를 지정하고 void*로 반환합니다.
new는 알아서 메모리 크기를 잡고 생성한 타입의 포인터를 리턴합니다. 또한 생성자를 자동으로 호출합니다.
재할당 가능여부에서 차이가 있습니다.
malloc은 realloc으로 크기를 바꿔 재할당이 가능하지만, new는 대응하는 기능이 없어 새로 할당해야합니다.
namespace에 대해 설명하시오
정의된 객체에 대해 어느 소속인지 영역을 지정해주는 명령어입니다.
왜 namespace를 사용하나요?
객체의 이름이 같더라도 namespace가 다르면 다른 객체로 인식하게 됩니다. 따라서 이름에 대한 모호성이 사라지고 영역만 다르다면 동일한 이름의 객체를 사용할 수 있게됩니다.
scope연산자로 소속을 명시한 후 해당 객체를 사용할 수 있습니다.
const 키워드에 대해 설명하시오
객체를 상수화 시키는 키워드입니다. 읽기전용 객체를 만들 때 사용할 수 있습니다.
변수, 멤버함수, 객체를 상수화시킬 수 있습니다.
const 변수에 대해 설명하시오
const 키워드에 의해 상수화된 변수입니다.
자료형 앞쪽에 위치하여 데이터 변수를 상수화 시킬수도,
포인터 연산자 앞에 위치하여 포인터 변수를 상수화 시킬 수 있습니니다.
const 멤버함수에 대해 설명하시오
멤버변수의 값을 바꿀 수 없는 읽기전용 함수 입니다.
이 함수는 const 외 다른 함수를 호출 할 수 없습니다.
다른 함수를 호출하게 된다면 멤버변수의 값을 간접적으로 변경할 수 있으므로 미리 차단한 것입니다.
또한 const 키워드로 함수 오버로딩이 가능합니다.
일반 객체는 일반 함수를 호출, const 객체는 const 함수를 호출하는 오버로딩입니다.
mutable 키워드가 붙은 멤버변수라면 예외적으로 이 함수에서 값 변경이 가능합니다.
mutable은 상수화를 제거할 수 있는 기능을 가지고 있기 때문입니다.
const 객체에 대해 설명하시오
읽기 전용으로 선언된 객체입니다.
초기화된 값 이외에 다른 값으로 변경이 불가능한 객체입니다.
const 멤버함수와 일반함수를 오버로딩해서 사용할 때 const 멤버함수를 호출하는 객체입니다.
friend 키워드에 대해 설명하시오
다른 클래스 멤버에 대한 접근 권한을 자유롭게 해주는 키워드입니다.
특정한 멤버가 예외적으로 다른 클래스나 함수에 접근할 수 있도록 하기 위해 사용합니다.
정보은닉에 반하는 키워드이므로 매우 제한적으로 사용해야하는 주의점이 있습니다.
static 변수
지역변수와 전역변수의 특징을 동시에 가지는 변수입니다.
지역적인 특색을 가지고 있어 다른 외부함수에 접근할 수없습니다.
전역적인 특색을 가지고 있어
데이터 영역에 저장되며 초기화를 하지 않으면 0초기화되며 프로그램이 종료될 때 메모리가 소멸됩니다.
정적변수만의 특색으로 해당 변수가 있는 함수가 처음 실행될 때만 선언됩니다.
static 멤버변수
객체 별로 존재하는게 아닌 프로그램 전체 영역에서 하나만 존재하는 함수입니다.
따라서 클래스의 모든 객체들이 공유하는 변수입니ㅏㄷ.
또한 객체에 속한 것이 아니므로 인스턴스를 생성하지 않고도 클래스 이름만으로 해당 변수에 접근할 수 있습니다.
static 멤버함수
객체 별로 존재하는게 아닌 프로그램 전체 영역에서 하나만 존재하는 함수입니다.
따라서 클래스의 모든 객체들이 공유하는 함수입니다.
또한 객체에 속한 것이 아니므로 인스턴스를 생성하지 않고도 클래스 이름만으로 해당 함수에 접근할 수 있습니다.
static 함수, static 멤버변수에만 접근이 가능합니다.
인스턴스를 생성하지 않고 접근하므로 일반 함수 혹은 변수에 접근한다면 없는 메모리에 접근하는 행위가 됩니다.
지역변수에 대해 설명하시오
함수 내부에서 정의된 변수입니다.
접근 가능 범위는 자신이 속한 함수 내부입니다.
생성 및 소멸은 호출된 시점부터 자신이 속한 함수가 종료되는 시점까지 입니다.
메모리 영역 중 Stack 영역에 할당됩니다.
전역변수에 대해 설명하시오
함수 외부에 선언되는 변수입니다.
접근 가능 범위는 선언된 이후 파일 내 모든 함수에서 접근이 가능합니다.
생성 및 소멸은 프로그램이 시작될 때 생성되고, 종료될 때 소멸합니다.
메모리 영역 중 Data 영역에 할당됩니다. 그리고 초기화하지 않으면 자동으로 0 초기화 되는 특징이 있습니다.
extern 키워드에 대해 설명하시오
외부 파일에서 참조하는 전역 변수의 존재유무를 알려주는 키워드입니다.
전역변수를 오로지 해당 파일에서만 찾는 컴파일러의 특징 때문에 외부 파일에서 전역변수를 사용하려면 이 키워드를 이용하여 존재유무를 알려줘야할 필요가 있습니다.
실제 연동은 링킹 단계에서 이루어집니다.
형변환이란 무엇입니까
자료형을 다른 자료형으로 변환하는 작업을 의미합니다.
형변환을 하는 목적은 무엇입니까
사용자의 편의를 위해 자료형을 변환하는 것입니다.
C++에서는 다형성을 위해서도 형변환이 이루어집니다.
상속관계인 클래스의 기초 포인터 혹은 레퍼런스를 파생 자료형으로 변환하는 예시가 있습니다.
묵시적 형변환이란 무엇입니까
형변환 연산자 없이 컴파일러가 자동으로 처리하는 형변환입니다.
암시적 형변환이란 무엇입니까
사용자가 형변환 연산자로 직접 명시하는 형변환입니다.
c style 형변환 대신 c++ style 형변환을 사용하는 이유는 무엇입니까?
C style 형변환이 가지는 단점 때문입니다.
첫째는 단점은 C style형변환은 안전성에 문제가 있다는 점입니다.
상속 관계에서 형변환 하는 경우 제한이 없기 때문에 다운 캐스팅에 의한 오류가 발생할 수 있습니다.
기본 자료형의 포인터형끼리 변환하는 경우 제한이 없기 때문에 오류가 발생할 수 있습니다.
두번째는 단점은 가독성이 떨어진다는 단점입니다.
괄호 안에 타입을 넣는 방식으로 변환하므로 괄호가 많아진다면 읽기 불편수 있습니다.
게다가 함수 연산자와 구별이 어려워질 수 있수도 있습니다.
dynamic_cast에 대해 설명하시오
다형성을 가진 클래스를 안전하게 형변환할 때 사용합니다.
기본적으로 업 캐스팅만 허용하며, 하나 이상의 가상함수를 가진 다형성 클래스에서만 다운 캐스팅을 허용합니다.
또한 형변환에 오류가 있을 시 포인터라면 null, 참조자라면 bad_cast를 반환합니다.
캐스팅되는 시점은 런타임 중 일어납니다.
static_cast에 대해 설명하시오
기본 자료형을 형변환하는 경우 C style보다 안전합니다.
C style로 기본 자료형의 주소 형변환 시 나타나는 문제점이 static_cast에는 없기 때문입니다.
다형성을 가진 클래스를 형변환 할 때 사용 가능하지만 이 경우는 안전성이 떨어집니다.
그러나 업, 다운 캐스팅을 구분하지 않고 캐스팅하기 때문입니다.
캐스팅되는 시점은 컴파일 중 일어납니다.
const_cast에 대해 설명하시오
객체의 상수성을 없애는 캐스팅입니다.
reinterpret_cast 에 대해 설명하시오
특정 자료형 포인터를 무조건 다른 자료형 포인터로 변환하는 캐스팅입니다.
c style 형변환 vs static_cast
C style이 가진 단점을 static_cast가 보완했다고 할 수 있습니다.
기본 자료형의 포인터를 형변환 할 때 c style에서는 포인터가 가리키는 자료형을 상관하지 않고 변환합니다.
따라서 이 포인터에 있는 값에 접근할 때 오류가 발생할 수 있는 문제가 있습니다.
자료형 변수가 const 선언이 된 경우에도 포인터 형으로 형변환 하여 포인터 연산자로 접근하는 경우 const를 무시하는 문제도 존재합니다.
static_cast는 이러한 경우를 허용하지 않습니다.
C style 형변환이 괄호를 사용하기 때문에 함수 연산자와 헷갈릴 수 있는 문제도 있습니다.
static_cast에서는 이러한 가독성 문제가 발생하지 않습니다.
static_cast vs dynamic_cast
형변환을 검사하는 시점에서 차이가 있습니다.
static_cast는 컴파일 시점에서 형변환에 대한 검사를 진행하지만, dynamic_cast는 런타임 시점에서 진행됩니다.
기본 자료형에 대한 형변환 가능 여부로도 갈라집니다.
static_cast는 기본 자료형에 대한 안전한 형변환을 수행할 수 있으나, dynamic_cast는 형변환 자체가 불가능합니다.
다형성을 가진 클래스를 캐스팅할 때 안전성에 차이도 존재합니다.
static_cast는 업, 다운 캐스팅을 모두 허용하므로 불안전합니다.
dynamic_cast는 기본적으로 업 캐스팅만 허용, 예외적인 경우에만 다운 캐스팅을 허용하고 실패시 null이나 bad_cast를 반환하므로 안전합니다.
up casting이 무엇인지 말하시오
다형성을 가진 클래스에서 객체를 가리키는 포인터가 자식에서 부모 방향으로 캐스팅 되는 형태이다.
down casting이 무엇인지 말하시오
다형성을 가진 클래스에서 객체를 가리키는 포인터가 부모에서 자식 방향으로 캐스팅 되는 형태이다.
cross_casting(교차 캐스팅)이 무엇인지 말하시오
다중 상속된 한 객체를 가리키는 부모 포인터를 또 다른 부모 포인터 타입으로 변환하는 캐스팅이다.