개발개발/c++ 이론연습

1차 c++ 이론 테스트

유잉유잉유잉 2024. 12. 18. 13:08
728x90

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. 다음 중 메모리에 연속된 메모리 공간을 할당하고 사용할 수 있게 해주는 문법을 고르시오.

  1. if

  2. Pointer

  3. 배열

  4. enum
 
 

 

5. 다음 중 메모리 주소를 저장하는 문법을 고르시오.

 
  1. Pointer

  2. switch

  3. struct

  4. class

 

6. void* 타입에 대한 특징을 고르시오.

 
  1. void 타입 변수의 주소만 저장이 가능하다.
  2. 역참조가 가능하다.
  3. 어떤 타입의 메모리 주소라도 저장이 가능하다.
  4. 하나의 주소를 저장하고 있다면 다른 주소를 저장할 수 없다.

 

7. const int* ptr; 의 특징을 고르시오.

 
  1. 참조하는 주소의 값을 변경할 수 없다.
  2. 참조하는 주소를 변경할 수 없다.
  3. float 타입 변수의 주소를 저장할 수 있다.
  4. 참조하는 주소의 값을 얻어올 수 없다.

 

8. int* const ptr; 의 특징을 고르시오.

  1. 참조하는 주소의 값을 변경할 수 없다.
  2. 참조하는 주소를 변경할 수 없다.
  3. float 타입 변수의 주소를 저장할 수 있다.
  4. 참조하는 주소의 값을 얻어올 수 없다.

 

9. x64로 개발할 경우 포인터 변수의 크기를 고르시오.

  1. 1byte
  2. 2byte
  3. 4byte
  4. 8byte

=> x86로 개발시 4byte 

 

10. 다음 중 메모리 영역이 아닌것을 고르시오.

  1. Heap
  2. Stack
  3. Code
  4. Array

 

 

11. 다음 중 지역변수의 특징을 고르시오.

  1. 변수가 선언되면 프로그램이 종료될때까지 메모리가 유지된다.
  2. 지역변수는 모든 곳에서 접근하여 사용이 가능하다.
  3. 지역변수가 더이상 필요 없을 경우 언제든지 메모리에서 제거할 수 있다.
  4. 지역변수는 특정 코드블록에 소속되어 해당 코드블록 내부에서만 사용이 가능하다.

 

 

12. 다음 중 동적할당의 특징을 고르시오.

  1. 프로그램이 시작될 때 메모리에 공간이 할당된다.
  2. 프로그램이 종료될 때 메모리에서 제거된다.
  3. 원하는 시점에 메모리에 공간을 할당할 수 있다.
  4. 동적할당은 배열 생성이 불가능하다.

 

13. 구조체의 특징이 아닌것을 고르시오.

  1. 다른 타입의 변수들을 하나로 모아 사용할 수 있는 기능을 제공한다.
  2. 인덱스를 이용하여 구조체를 구성하는 각 요소에 접근할 수 있다.
  3. 구조체도 포인터 타입 변수를 선언할 수 있다.
  4. 구조체도 배열 변수를 선언할 수 있다.

=> 인덱스를 이용하여 구조체를 구성하는 각 요소에 접근할 수 있게 '만들 수는' 있지만 기본적으로 제공하진 않습니다.

 

14. 함수에 대한 설명 중 맞는 것을 고르시오.

  1. 함수는 반환타입 함수명(인자) {} 의 형태로 구성된다.
  2. 함수는 같은 이름의 함수를 사용할 수 없다.
  3. 함수는 메모리 주소가 없다.
  4. 함수의 인자는 포인터 타입을 사용할 수 없다.

 

15. 다음 중 재귀함수에 대한 설명으로 잘못된 것을 고르시오.

  1. 재귀 함수는 자기자신을 호출하는 함수이다
  2. 재귀 함수는 함수포인터를 이용해서 호출이 불가능하다.
  3. 재귀 함수는 계속해서 호출될 경우 스택이 쌓일 수 있다.
  4. 재귀 함수는 잘못 작성할 경우 무한루프에 빠질 수 있다.

 

16. 다음 중 레퍼런스의 특징을 고르시오.

  1. 대상을 참조하여 값을 변경할 수 있다.
  2. 참조 대상을 다른 대상으로 변경할 수 있다.
  3. 함수의 인자로 사용할 수 없다.
  4. 모든 타입의 레퍼런스 타입 변수가 생성 가능하다.

 

17. 다음 중 클래스 생성자에 대한 설명으로 잘못된 것을 고르시오.

  1. 생성자는 오버로딩이 가능하다.
  2. 생성자는 디폴트 인자를 사용할 수 있다.
  3. 생성자는 클래스를 이용하여 객체를 생성할 때 호출된다.
  4. 클래스에 생성자가 없을 경우 에러가 발생한다.

 

18. 다음 중 클래스 소멸자에 대한 설명으로 잘못된 것을 고르시오.

  1. 소멸자는 오버로딩이 가능하다.
  2. 소멸자는 인자를 사용할 수 없다.
  3. 소멸자는 객체를 제거할 때 호출된다.
  4. 클래스에 소멸자가 없을 경우 기본 소멸자로 처리된다.

 

19. 다음 중 클래스 복사생성자에 대한 설명으로 잘못된 것을 고르시오.

  1. 얕은 복사는 단순 데이터만을 복사한다.
  2. 깊은 복사는 데이터 뿐만 아니라 동적할당된 객체의 메모리를 새로 생성하여 데이터를 복사할 수 있다.
  3. 복사생성자의 인자는 const 해당클래스& 타입을 사용한다.
  4. 복사생성자는 상속 관계에서 사용할 수 없다.

 

20. 다음 중 가상함수에 대해 잘못 설명한 것을 고르시오.

  1. 가상함수는 가상함수테이블에 가상함수의 주소가 저장된다.
  2. 가상함수는 반드시 자식클래스에 재정의 해야 한다.
  3. 가상함수는 순수가상함수를 만들 수 있다.
  4. 자식클래스의 가상함수에서 부모클래스의 가상함수를 호출할 수 있다.

 

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;

 

 

 

728x90