1차 c++ 이론 테스트
1. 20 << 4 결과값 작성하기
▶️ 풀이 : 10진수로 바꾼 후 오른쪽에 0을 4개 붙이기
10100 (20)
101000000 (320)
답 : 320
2. 357 & 280과 357 | 280 결과값 작성하기
▶️ 풀이 : 두 값을 2진수로 바꾼 후 논리 연산하면 됩니다.
256 128 64 32 16 8 4 2 1
1 0 1 1 0 0 1 0 1 357
1 0 0 0 1 1 0 0 0 280
1 0 0 0 0 0 0 0 0 & 256
1 0 1 1 1 1 1 0 1 |381
답 : 256, 381
3. int Number1 = 10, int Number = 20 변수 2개가 있을 때 이 두 변수의 값을 바꾸는 코드를 작성하시오.
답 :
int tmp = Number1;
Number1 = Number2;
Number2 = tmp;
4. 다음 중 메모리에 연속된 메모리 공간을 할당하고 사용할 수 있게 해주는 문법을 고르시오.
- if
- Pointer
- 배열
- enum
5. 다음 중 메모리 주소를 저장하는 문법을 고르시오.
- Pointer
- switch
- struct
- class
6. void* 타입에 대한 특징을 고르시오.
- void 타입 변수의 주소만 저장이 가능하다.
- 역참조가 가능하다.
- 어떤 타입의 메모리 주소라도 저장이 가능하다.
- 하나의 주소를 저장하고 있다면 다른 주소를 저장할 수 없다.
7. const int* ptr; 의 특징을 고르시오.
- 참조하는 주소의 값을 변경할 수 없다.
- 참조하는 주소를 변경할 수 없다.
- float 타입 변수의 주소를 저장할 수 있다.
- 참조하는 주소의 값을 얻어올 수 없다.
8. int* const ptr; 의 특징을 고르시오.
- 참조하는 주소의 값을 변경할 수 없다.
- 참조하는 주소를 변경할 수 없다.
- float 타입 변수의 주소를 저장할 수 있다.
- 참조하는 주소의 값을 얻어올 수 없다.
9. x64로 개발할 경우 포인터 변수의 크기를 고르시오.
- 1byte
- 2byte
- 4byte
- 8byte
=> x86로 개발시 4byte
10. 다음 중 메모리 영역이 아닌것을 고르시오.
- Heap
- Stack
- Code
- Array
11. 다음 중 지역변수의 특징을 고르시오.
- 변수가 선언되면 프로그램이 종료될때까지 메모리가 유지된다.
- 지역변수는 모든 곳에서 접근하여 사용이 가능하다.
- 지역변수가 더이상 필요 없을 경우 언제든지 메모리에서 제거할 수 있다.
- 지역변수는 특정 코드블록에 소속되어 해당 코드블록 내부에서만 사용이 가능하다.
12. 다음 중 동적할당의 특징을 고르시오.
- 프로그램이 시작될 때 메모리에 공간이 할당된다.
- 프로그램이 종료될 때 메모리에서 제거된다.
- 원하는 시점에 메모리에 공간을 할당할 수 있다.
- 동적할당은 배열 생성이 불가능하다.
13. 구조체의 특징이 아닌것을 고르시오.
- 다른 타입의 변수들을 하나로 모아 사용할 수 있는 기능을 제공한다.
- 인덱스를 이용하여 구조체를 구성하는 각 요소에 접근할 수 있다.
- 구조체도 포인터 타입 변수를 선언할 수 있다.
- 구조체도 배열 변수를 선언할 수 있다.
=> 인덱스를 이용하여 구조체를 구성하는 각 요소에 접근할 수 있게 '만들 수는' 있지만 기본적으로 제공하진 않습니다.
14. 함수에 대한 설명 중 맞는 것을 고르시오.
- 함수는 반환타입 함수명(인자) {} 의 형태로 구성된다.
- 함수는 같은 이름의 함수를 사용할 수 없다.
- 함수는 메모리 주소가 없다.
- 함수의 인자는 포인터 타입을 사용할 수 없다.
15. 다음 중 재귀함수에 대한 설명으로 잘못된 것을 고르시오.
- 재귀 함수는 자기자신을 호출하는 함수이다
- 재귀 함수는 함수포인터를 이용해서 호출이 불가능하다.
- 재귀 함수는 계속해서 호출될 경우 스택이 쌓일 수 있다.
- 재귀 함수는 잘못 작성할 경우 무한루프에 빠질 수 있다.
16. 다음 중 레퍼런스의 특징을 고르시오.
- 대상을 참조하여 값을 변경할 수 있다.
- 참조 대상을 다른 대상으로 변경할 수 있다.
- 함수의 인자로 사용할 수 없다.
- 모든 타입의 레퍼런스 타입 변수가 생성 가능하다.
17. 다음 중 클래스 생성자에 대한 설명으로 잘못된 것을 고르시오.
- 생성자는 오버로딩이 가능하다.
- 생성자는 디폴트 인자를 사용할 수 있다.
- 생성자는 클래스를 이용하여 객체를 생성할 때 호출된다.
- 클래스에 생성자가 없을 경우 에러가 발생한다.
18. 다음 중 클래스 소멸자에 대한 설명으로 잘못된 것을 고르시오.
- 소멸자는 오버로딩이 가능하다.
- 소멸자는 인자를 사용할 수 없다.
- 소멸자는 객체를 제거할 때 호출된다.
- 클래스에 소멸자가 없을 경우 기본 소멸자로 처리된다.
19. 다음 중 클래스 복사생성자에 대한 설명으로 잘못된 것을 고르시오.
- 얕은 복사는 단순 데이터만을 복사한다.
- 깊은 복사는 데이터 뿐만 아니라 동적할당된 객체의 메모리를 새로 생성하여 데이터를 복사할 수 있다.
- 복사생성자의 인자는 const 해당클래스& 타입을 사용한다.
- 복사생성자는 상속 관계에서 사용할 수 없다.
20. 다음 중 가상함수에 대해 잘못 설명한 것을 고르시오.
- 가상함수는 가상함수테이블에 가상함수의 주소가 저장된다.
- 가상함수는 반드시 자식클래스에 재정의 해야 한다.
- 가상함수는 순수가상함수를 만들 수 있다.
- 자식클래스의 가상함수에서 부모클래스의 가상함수를 호출할 수 있다.
21. 다음 코드에서 최적화 이슈가 발생할 수 있는 부분을 작성하고 개선된 코드를 작성하시오.
class CTest
{
public:
int mA;
public:
CTest Create()
{
CTest test;
return test;
}
};
답 :
호출하는 부분에서 객체 복사가 일어난다
또한 리턴부분에서 임시객체 생성 됩니다.
개선된 코드
class CTest
{
public:
int mA;
public:
// 다른 방법으로는 포인터로 리턴해주거나, 인자로 포인터를 받아서 넘겨주는 방법도 있음
CTest& Create()
{
CTest test;
return test&;
}
};
22. CChild 클래스를 sizeof 할 경우 결과로 몇바이트가 나오는지를 작성하고 그 이유를 작성하시오. (64비트 컴퓨터)
class CParent
{
public:
int mA;
public:
virtual void Output()
{
}
};
class CChild : public CParent
{
};
답 : 16바이트. 자식 함수 8byte + int변수 4바이트 + 공백 4
23. 다음 코드에서 잘못된 부분을 찾아 이유를 작성하시오.
class CArray
{
public:
int mA[1000];
};
void OutputArray(CArray array)
{
for(int i = 0; i < 1000; ++i)
{
std::cout << array.mA[i] << std::endl;
}
}
답 :
잘못된 부분 : array가 값복사가 되어서 느려짐. 함수의 인자를 참조 형식으로 받아 쓰거나 포인터를 사용.
또는 const 레퍼런스 형태로 사용 (값을 바꿀 필요 없을 경우 사용)
해결방안 : 인자를 레퍼런스로 변경하여 사용합니다.
24. 가상함수에서 사용할 수 있는 abstract, override, final 키워드에 대해 설명하시오.
답 :
final
함수 : 해당 가상함수를 자식클래스에 재정의 불가합니다.
클래스 : 해당 클래스를 상속 불가합니다
override : 이 가상함수가 부모의 가상함수를 재정의한 함수임을 명시한다. 부모에 이 함수와 같은 형태의 함수가 없을 경우 에러가 발생합니다.
abstract
가상함수: 순수가상함수가 됩니다
클래스 : 추상클래스가 됩니다.
25. dynamic_cast 에 대해 설명하시오.
답 :
다운캐스팅시 잘못된 타입으로의 형변환을 할 경우 nullptr반환.
정상적인 형변환일 경우 해당 메모리 주소가 반환됩니다.
26. C++에서 사용하는 4가지 메모리 영역을 작성하고 각각의 메모리 영역에 대해 설명하시오.
답 :
스택 : 지역변수를 저장하는 메모리 영역
데이터 : 전역변수, 정적변수를 저장하는 메모리 영역
코드 : 코드를 기계어로 저장하는 영역
힙 : 동적할당된 변수를 저장하는 메모리 영역
27. 가상함수 뒤에 const 를 붙였을 경우 동작 방식에 대해 설명하시오.
답:
해당 함수에서는 멤버변수의 값을 변경할 수 없습니다. const 객체가 호출 가능한 함수가 됩니다.
=>
- 가상함수 뒤에 const가 붙은 경우 : 멤버 변수의 값을 변경할 수 없습니다.
- const 객체의 경우 : const 붙은 함수만 호출이 가능합니다.
28. 동적할당을 사용할 때 발생할 수 있는 문제점과 해결방법을 작성하시오.
답 :
1. 주소를 잃어버리면 메모리 릭이 발생됩니다. 변수에 주소를 저장하여 사용하여 해결합니다.
2. 메모리 단편화현상이 일어날 수 있습니다. 페이징, 세그먼테이션, 메모리 풀링을 사용하여 해결합니다.
29. 클래스 static 멤버변수와 static 멤버함수에 대해 설명하시오.
답 :
static 멤버변수 : 이 클래스 타입을 이용하는 모든 객체가 공유하는 메모리 1개가 만들어집니다.
static 멤버함수 : this가 없어서 일반 멤버변수 접근이 불가능 합니다. static 멤버변수만 접근 가능합니다.
30. CSingleton 클래스를 싱글톤으로 만드는 코드를 작성하시오.
// header
class CSingleton
{
private:
static CSingleton* mInst;
public :
static CSingleton* GetInst ()
{
if (nullptr == mInst)
mInst = new CSingleton;
return mInst;
}
static void DestroyInst ()
{
if (mInst)
{
delete mInst;
mInst = nullptr;
}
}
};
// cpp
CSingleton* CSingleton::mInst = nullptr;