프로그래밍 공부
작성일
2023. 6. 6. 20:35
작성자
WDmil
728x90

50문제 중 34문제 정답. 68점

 

오답정리. 16문제.

[ 파란색 = 내가 체크한 답. 빨간색 = 정답. ]


1. Cpp 함수의 선언 중 오류가 나타나는 것은 무엇인가?

  1. void Func(auto param):
  2. void Func(int* param = new int());
  3. void (*func) (int, int);
  4. void* Func(const int* const param);

체크답 : 2

매개변수에 동적할당을 한 적이 없어서 고름.

 

오답. 매개변수로 동적할당을 해도 큰 이상이 없다.

 

답 : 1

매개변수는 auto 선언을 할 수 없다.

매개변수는 함수저장공간에 저장될 때 데이터가 할당되기 때문에. 형식을 동적으로 지정해줄 수 없다.

정적으로 변수를 지정해주어야 한다.

 


4. 참조자에 관한 설명 중 올바르지 않은 것은?

  1. 참조자는 참조하고 있는 객체를 변경하는 것이 가능하다.
  2. 변수에 또 하나의 별명을 지정해주는 기능이다.
  3. 선언과 동시에 초기화를 진행해야 한다.
  4. 변수의 주소를 저장하는 것이 아닌 공간 자체를 참조하는 기능이다.

체크답 : 3

선언과 동시에 초기화를 진행해야 하나, 위 답안에서 답이 없는것 같아 판별하기 힘들었다.

 

오답. 참조자는 선언과 동시에 초기화를 해야한다.

 

답 : 1

참조자는 참조하고 있는 객체를 [ 다른 객체로 ] 변경하는 것이 가능하다.

라고 작성해야 문항이 올바르게 인식된다.

 

객체를 변경하는것 이 A -> B 일때, A -> C로 가리키는 별칭을 바꾸는 것이 안된다는 의미.


10. 깊은 복사와 얕은 복사에 대한 설명으로 올바르지 않은 것은?

  1. 얕은 복사는 맴버들의 값만을 복사하는 개념이다.
  2. 깊은 복사는 맴버들의 값 만이 아닌 공간 자체를 복사하는 개념이다.
  3. 깊은 복사를 작성할 때 모든 공간에 대하여 복사를 하여야 한다.
  4. 얕은 복사는 값만을 복사하면 되기 때문에 복사대입연산만으로도 충분하다.

체크답 : 4

얕은복사 시, 객체관계에서는 ( class 또는 struct ) 시 얕은복사를 실시할 때. 복사대입연산 만으로는 부족할 수 있다고 판단. 경우에 따라서는 오퍼레이터 또는 객체 내부의 함수를 사용하여 복사하여야 할 수 있다고 생각하였다.

 

오답. 오퍼레이팅 하는것으로. 기본복사대입연산으로 보는가?

 

답 : 2

진짜 답 3

깊은 복사는 공간 자체를 복사하는 것 이 아닌 공간을 새로 할당하고. 값을 복사하는 개념이다.


11. this pointer 에 대한 설명으로 옳은 것은?

  1. 설계도의 주소를 가리키는 포인터 이다.
  2. 클래스 작성의 함수 정의부에서만 사용이 가능하다.
  3. 호출된 객체를 기준으로 컴파일러가 this 를 추가한다.
  4. this pointer 에는 delete 를 사용할 수 없다.

체크답 : 1

설계도의 주소가 객체의 주소로 착각함.

 

오답. 설계도가 아닌 객체의 주소를 참조하기 때문에, 설계도의 주소 라고 하는 표현은 오답.

 

답 : 3

주소값은 호출된 객체 기준으로 정해진다.


13. 특수한 개념을 묶어 프로그래밍하는 방법인 일반화를 적용시킨 C++ 의 프로그래밍 기법을 무엇이라 하는 가?

  1. overload
  2. override
  3. template
  4. class

체크 답 : 4

개념을 묶어, 일반화 적용, 프로그래밍 기법. 을 class로 생각함.

 

오답. class는 프로그래밍 기법 이 아닌 객체 그 자체라고 봐야한다.

 

답 : 3

template로 개념을 묶어 일반화 시키고. 코드의 재사용성을 늘리 는 기법이다.


14. 객체지향의 4대 속성 중 하나로 재사용 및 확장에 가장 적합한 속성은 무엇인가?

  1. 상속성
  2. 추상화
  3. 캡슐화
  4. 다형성

체크 답 : 3

객체간을 묶어 독립적인 객체로 만들어서. 재사용성을 용이하게하고. 객체간의 합일로 확장에 유리하다고 생각.

 

오답. 캡슐화는 재사용 및 확장 또한 있으나, 보안성과 코드가독성에 더 큰 영향을 미침.

 

답 : 1

상속성은 하나의 코드를 재사용하고. 확장시킬 때 용이하다. 객체간의 상속으로 부모자식클래스로 구분되는 디자인패턴을 구축하기 용이하다.


15. 객체지향의 4대 속성 중 하나로 Function Overload 와 Override 는 어떤 속성에 해당하는가?

  1. 상속성
  2. 추상화
  3. 캡슐화
  4. 다형성

체크답 : 1

Overload를 객체의 상속개념으로 생각하였다.

 

오답. 상속성은 virtual을 기준으로 잡아야한다.

 

답 : 4

다형성으로 Overload 와 Override로 객체 자체를 인터페이스 화 시켜. 다양한 항목을 직관적으로 생성하고 확장시킬 수 있다.


20. 다음과 같이 C++ 언어를 사용하여 함수를 선언할 때 컴파일 에러가 발생하는 것은?

  1. void _(int a, int b);
  2. static int parent(int a = 1, int b = 2);
  3. double student(int, int);
  4. int friend(int a, int b);

체크답 : 3

매개변수에 이름을 지정해주지 않으면 컴파일 오류가 나타날것으로 예상.

 

오답. 컴파일 자체에서는 오류라고 인식하지 않는다.

 

답 : 4

friend 선언 시, 접근 지정자로써 함수선언이 허용되지 않는다.


22. 순수 가상함수에 대한 설명으로 올바른것은?

  1. 객체지향의 4대 속성 중 상속성에 가장 가까운 기술이다.
  2. 함수 뒤에 =0; , pure , abstract 를 작성하여 선언한다.
  3. 순수 가상함수 를 하나 이상 가지고있는 클래스를 인터페이스 라고 한다.
  4. 파생 클래스에서 재정의하지 않을 시 해당 파생 클래스를 상속받은 파생 클래스에서 정의한다면 문제가 없다.

체크답 : 3

순수 가상함수가 있을 경우, 상속받을 때. 가상함수를 무조건 재선언해주어야 하기 때문에. 인터페이스 라고 생각했음.

 

오답. 순수 가상함수로만 이루어져 있을 때 인터페이스 라고 한다.

 

답 : 2

진짜답 1

함수 뒤에 0 과 pure 와 abstract 라고 표시하면. 가상함수 라고 인식한다.


23.Interface 에 대한 설명으로 올바르지 않은 것은?

  1. __interface 를 작성하여 선언할 수 도 있다.
  2. 순수 가상함수와 가상 소말자만 가지고 있는 클래스를 의미한다.
  3. 다중 상속이 불가능하다.
  4. 인터페이스의 이름은 보통 접두사 I 를 사용한다.

체크답 : 1

__interface 를 작성하여 Interface를 선언해본적이 없어서. 골랐다.

 

오답. 가능

 

답 : 3

다중 상속은 당연히 가능하다.


27. 연관 컨테이너에 대한 설명으로 올바르지 않은 것은?

  1. Key 와 Value 를 쌍으로 가지고 있는 형태이다.
  2. 자료 탐색이 빠른 것이 장점이다.
  3. set, Multi Map, map 등이 있다.
  4. 데이터의 삽입 속도가 빠르다.

체크답 : 1

set은 Key를 value로 쓰기에, Key만 가지고 있다고 생각함.

 

오답?. Key = value로 보아야 하는가, Key만 존재한다고 보아야 하는가? 쌍으로 가지고 있다고 판단 할 수 있는가?

 

답 : 4

연관 컨테이너 는 정렬과 중복탐색이 이루어져야 하기 때문에, 삽입속도가 느리다.


30. Iterator 에 대한 설명으로 올바르지 않은 것은?

  1. 컨테이너의 요소에 접근하기 위해 사용 된다.
  2. Iterator와 같은 경우 컨테이너에 해당되는 개념이다.
  3. 요소를 순회할 때 ++, --, +, *, - 연산자를 사용한다.
  4. 컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다.

체크답 : 2

Iterator는, 컨테이너에 해당되는 개념이 아니라 컨테이너에 접근하는 방법이다.

컨테이너에 해당되는 개념. 이라는 설명을 틀리다고 판단하였다.

 

오답?. 컨테이너에 접근하는 방법을 컨테이너에 해당되는 개념 이라고 판단할 수 있는가?

 

답 : 4?

컨테이너와 저장된 데이터의 타입에 상관없이 알고리즘을 사용할 수 있게 해준다. 라는 항목이 가장 올바르지 않다. 라고 판단했다. 저장된 데이터타입에 무조건 상관이 없는가? iterator에 요소순환 시 객체의 operator 가 존재하지 않다면, 요소순환이 힘들것이라 판단.


32. 다음 중 상속된 형태의 캐스팅 방법으로 가장 적합한 것은 무엇인가?

  1. static_cast
  2. dynamic_cast
  3. reinterpret_cast
  4. const_cast

체크답 : 3

reinterpret_cast 가 뭔지 몰라서 찍음.

 

오답.포인터/참조자 간의 casting으로 메모리 비트패턴을 직접적으로 다른타입으로 강제변환해준다.

 

답 : 2

dynamic_cast는 다운캐스팅과 업 캐스팅을 수행하는걸 이야기한다.


33. 강제적 형번환을 할 수 있는 캐스팅 연산자는 무엇인가?

  1. static_cast
  2. dynamic_cast
  3. reinterpret_cast
  4. const_cast

체크답 : 2

dynamic_cast가 dynamic하니까 강제적으로 형변환 한다고 생각.

 

오답. 맞을리가 없음

 

답 : 3

강제형변환은 3번이다.


37. 연산자 오버로딩에 대한 설명으로 올바르지 않은 것은?

  1. 기본 연산자의 기능 의외에 추가적인 기능을 부여하는 것이다.
  2. new 와 delete는 오버로딩이 불가능하다.
  3. 작성시 operator를 작성하여야 한다.
  4. 작성시 반환값과 매개변수 목록이 포함된다.

체크답 : 1

올바른것으로 봤음.

 

오답. 틀릴리가 없음.

 

답 : 2

오버로딩이 가능하다. 수업시간에도 해봄


46. 32bit 운영체제에서 다음 코드를 실행했을 경우 변수 TextSize의 값은?

char MyString[] = "12삼45육";
int TextSize = sizeof(MyString);

답 : 12

문자열 에 대한 값에. 한글이 들어가 있음으로 각 문자당 2byte로 생각했음.

 

오답

문자 '만' 2byte 였음.

 

답 : 9

숫자 12 = 2byte

문자 삼 = 2byte

숫자 45 = 2byte

문자 육 = 2byte

끝값 '\0'= 1byte

로, 9byte 가 나타남.


47. 다음 프로그램을 실행하면 화면에 출력되는 값은?

#include <iostream>
class NPC
{
public:
	int HP = 100;
	int Power = 10;

	virtual void Attack(NPC& target)
	{
		target.Attacked(Power);
	}
	virtual void Attacked(int damage)
	{
		HP -= damage;
	}
};

class Monster : public NPC
{
public:
	int Skill = 10;
	int Defence = 5;

	virtual void Attack(NPC& target)
	{
		target.Attacked(Power + Skill);
	}
	virtual void Attacked(int damage)
	{
		HP -= (damage - Defence);
	}
};
int main()
{
	NPC npc;
	Monster monster;
	npc.Attack(monster);
	monster.Attack(npc);

	std::cout << npc.HP << monster.HP;
	return 0;
}

체크답 : 9085

연산실수함. 몬스터 HP와 npc HP의 순서를 햇갈림.

 

오답.

 

답 : 8095

 

연산순서 상.

npc.Attack이 이루어지면, target의 Attacked(this->Power) 이기 때문에, monster의 Attacked 가 실행되어.

monster의 HP -= npc.damage - monster.Defence 가 된다.

즉, monster 의 HP가 5만큼 깍임.

monster.HP = 95

 

monster.Attack(npc)가 이루어지면,

Monster.Attack이 이루어지면,  target의 Atacked(this -> Power + this -> Skill) 이기 때문에, 상속받은 Power 10과 Skill 10 이 더해져, 20이 넘어감.

npc의HP -= monster.Power + monster.Skill 이 된다.

npc.HP = 80

 

그럼으로, 8095 가 맞음.


48. 다음 프로그램을 실행하면 화면에 출력되는 값은?

#include <iostream>

int main()
{
	int arr[] = { 0, 2, 4, 8 };
	int* p;
	p = arr;

	std::cout << (*p)++;
	std::cout << *(p++);
	std::cout << p[1];

	return 0;
}

체크탑 : 124

증감연산의 연산순서를 고려하지 않음.

 

오답.

 

답 : 014

 

첫번째 출력

*p = 배열 p 의 첫번째 값. 0

0을 넘긴 후 1을 더해준다.

 

그럼으로 출력값은 0

 

두번째 출력

*(p++)

임으로, *p에 해당하는 값을 도출 후 넘겨준 다음 p에 ++해준다.

첫번째 출력에서 1을 더해주었음으로

 

출력값은 1

 

세번째 출력

p[1] 번째 값을 출력해야한다.

두번째 출력에서 p에 1을 더해주었음 으로, p = 1 두번째 값을 가리킨다.

여기서, p[1]임으로. p에서 1번 더 넘긴 값을 출력해야한다.

 

출력값은 4

 

그래서 014


50. 다음 프로그램을 실행하면 화면에 출력되는 값은?

#include <iostream>

int Func(int& a, int* b)
{
	a += 1;
	b += 1;
	return a + *b;
}

int main()
{
	int x = 1;
	int y[] = { 1, 2, 3, 4, 5 };
	int z = Func(x, y);

	std::cout << x << *y << z;

	return 0;
}

체크답 : 124

 

오답.

 

답 : 214

 

첫번째 출력

x = 1 이다. 그러나, 받아온 값이 원본값 임으로 Func에서 중첩연산을 하였기에 출력시 에는 x +=1 이 되어, 2가 된다.

출력 : 2

 

두번째 출력.

y = 배열로, 첫번째 값은 1 이다. Func에서 y에 +=1을 하더라도, 원본값 이 아닌, 함수내부값으로 받아오기에, 복사되어 가져온다. 그래서. main문 안의 y는 변동이 없다.

출력 1

 

세번째 출력.

z = Func의 반환값으로, a의 +1된 2, y의 +1된 2 가 더해져. 4가 된다.

출력 4

 

그래서 214가 나타난다.

 

728x90