1. 일반화와 템플릿에 대해 잘못 설명한 것은?
1) 템플릿은 C++에서 일반화를 위한 도구이다.
2) 템플릿을 이용하여 함수와 클래스를 일반화할 수 있다.
3) 템플릿을 선언하기 위해 사용하는 키워드는 template이나 generic이다.
4) 제네릭 타입을 선언하기 위해 사용하는 키워드는 class이다.
답 : 3번
풀이 : 템플릿을 선언하기 위해 사용하는 키워드는 template뿐이다.
2. 템플릿에 대해 잘못 말한 것은?
1) 템플릿을 사용하면 소픝웨어 생산성과 유연성이 높아진다.
2) 컴파일러에 따라 템플릿을 지원하지 않을 수 있기 때문에 포팅에 취약하다.
3) 템플릿을 사용하면 컴파일 오류 메시지가 풍부하여 디버깅에 많은 도움을 준다.
4) 제네릭 프로그래밍이라는 새로운 프로그래밍 패러다임을 가져왔다.
답 : 3번
3. 다음에서 템플릿 선언을 잘못한 것은?
1) template </class T/>
2) template (class T)
3) template </typename T/>
4) template <typename T1, typename T2>
답 : 2번
풀이 : 바르게 고치면 template </class T/>
4. 구체화의 과정은 누구에 의해 이루어지는가?
1) 개발자 2) 컴파일러 3) 로더 4) 운영체제
답 : 2번
5. 다음 두 함수를 일반화한 제네릭 함수를 작성하라.
bool equal(int a, int b) {
if(a == b) return true;
else return false;
}
bool equal(char a, char b) {
if(a == b) return true;
else return false;
}
답 :
template <class T>
bool equal(T a, T b) {
if(a == b) return true;
else return false;
}
6. 다음 두 함수들을 일반화한 제네릭 함수를 작성하라.
void insert(int a, int b[], int index) {
b[index] = a;
}
void insert(char a, char *b, int index) {
*(b+index) = a;
}
답 :
template <class T>
void insert(T a, T *b, int index) {
*(b+index) = a;
}
7. 다음 제네릭 함수 선언에서 잘못된 부분을 바르게 고쳐라.
template <typename T> int max(T x, T y) {
if(x > y) return x;
else return y;
}
답 :
template <typename T> T max(T x, T y) {
if(x > y) return x;
else return y;
}
8. 다음 제네릭 클래스의 선언에서 잘못된 부분을 바르게 고쳐라.
template <class TYPE>
TYPE equals(TYPE x, int y) {
if(x == y) return true;
else return false;
}
답 :
template <class TYPE>
bool equals(TYPE x, int y) {
if(x == y) return true;
else return false;
}
9. 다음 제네릭 함수가 있다.
template <class T> T avg(T *p, int n) {
int k;
T sum=0;
for(k=0; k<n; k++) sum += p[k];
return sum/n;
}
아래의 호출을 컴파일하여 생성되는 쿠체화된 버전의 avg() 함수의 소스 코드는 무엇인가?
(1) int a[] = {1, 2, 3, 4, 5};
cout << avg(a, 5);
답 :
int avg(int *p, int n) {
int k;
int sum=0;
for(k=0; k<n; k++) sum += p[k];
return sum/n;
}
(2) double d[] = {3.5, 6.7, 7.8};
cout << avg(d,3);
답 :
double avg(double *p, int n) {
int k;
double sum=0;
for(k=0; k<n; k++) sum += p[k];
return sum/n;
}
10. 다음 두 개의 함수가 있을 때, 질문에 답하여라.
template <class T> void show(T a) {
cout << a;
}
void show(int a) {
cout << "special " << a;
}
(1) 이 두 함수가 공존할 수 있는가?
답 : 예
(2) 만일 (1)의 답이 '예'라면, show(3.14);를 호출한 결과는?
답 : 3.14
(3) 만일 (1)의 답이 '예'라면, show(100);을 호출한 결과는?
답 : special 100
11. 템플릿에 대한 설명 중 맞는 것은?
1) 이 기능은 C++에만 있다.
2) 컴파일러는 템플릿 함수나 클래스를 컴파일하여 일반화된 바이너리 코드를 생성한 후, 필요한 구체화를 시행한다.
3) 템플릿 함수와 동일한 이름의 함수가 중복되어 있을 때, 중복 함수가 우선적으로 바인딩된다.
4) 템플릿 함수를 선언할 때 디폴트 매개 변수를 선언할 수 없다.
답 : 3번
12. 템플릿 클래스 Container를 작성하고자 한다.
template <class T> class Container {
______ // T 타입의 포인터 p를 선언하라.
______ // 배열의 크기를 나타내는 변수 size를 선언하라.
public:
Container(int n); // 멤버 변수 p에 n개의 동적 배열을 할당받는 생성자
~Container();
void set(int index, T value) { p[index] = value; } // index 위치에 value 저장
T get(int index); // index 위치의 값 리턴
};
(1) 빈칸을 적절하게 채워라.
(2) 생성자를 작성하라.
(3) 소멸자를 작성하라.
(4) get()을 작성하라.
(5) char 타입의 문자만 저장 가능한 Container 객체 c를 생성하는 선언문을 작성하라. (c의 크기는 26).
(6) 문제 (5)에서 생성한 객체 c에 set() 함수를 이용하여 알파벳 'a'~'z'를 삽입하고, get() 함수를 이용하여 반대순으로 화면에 출력하는 main() 함수를 작성하라.
답 :
#include <iostream>
using namespace std;
template <class T> class Container {
// (1)번 문제
T* p; // T 타입의 포인터 p를 선언하라.
int size; // 배열의 크기를 나타내는 변수 size를 선언하라.
public:
//(2)번 문제
Container(int n) { // 멤버 변수 p에 n개의 동적 배열을 할당받는 생성자
p = new T[n];
size = n;
}
//(3)번 문제
~Container() {
delete [] p;
}
void set(int index, T value) { p[index] = value; }
//(4)번 문제
T get(int index) {
return p[index];
}
};
int main() {
//(5)번 문제
Container<char> c(26);
//(6)번 문제
for (int i = 0; i < 26; i++) {
c.set(i, 'a' + i);
}
for (int i = 0; i < 26; i++) {
cout << c.get(i) << ' ';
}
}
13. C++의 표준 STL 라이브러리가 작성된 이름 공간은 무엇인가?
1) std
2) template
3) stl
4) algorithm
답 : 1번
14. 다음 STL의 각 기능을 사용하기 위해 필요한 헤더 파일은 무엇인가?
1) vector 클래스
답 : #include </vector/>, vector 파일
2) list 클래스
답 : #include </list/>, list 파일
3) merge 함수
답 : #include </algorithm/>, algorithm 파일
4) search 함수
답 : #include </algorithm/>, algorithm 파일
15. STL의 vector 클래스를 활용하는 코드이다. 다음 빈칸을 채워라.
______ // double 타입의 벡터 v 생성
v.push_back(3.1);
v.push_back(4.1);
// for 문을 이용하여 벡터 v의 모든 값을 출력하라.
______________________________
______________________________
답 :
vector<double> v; // double 타입의 벡터 v 생성
v.push_back(3.1);
v.push_back(4.1);
// for 문을 이용하여 벡터 v의 모든 값을 출력하라.
for(int i=0; i<v.size(); i++)
cout << v[i] << ' ';
16. vector</char/> 타입의 객체 v가 함수 print()의 매개 변수로 넘어왔을 때, 반복문을 이용하여 모든 원소를 화면에 출력하고자 한다. 빈칸에 적절한 코드를 삽입하라.
void print(vector<char> &v) {
__________________________
for(it=v.begin(); it!=v.end(); it++) {
char c = *it;
cout << c;
}
}
답 :
void print(vector<char> &v) {
vector<char>::iterator it;
for(it=v.begin(); it!=v.end(); it++) {
char c = *it;
cout << c;
}
}
17. map 컨테이너를 사용하기 위해 필요한 헤더 파일은 무엇인가?
답 : map 파일, #include </map/>
18. 다음 프로그램을 작성하기 위해 map과 vector 중 어떤 것이 더 적합한지 설명하라.
1) 하루 동안, 온도 센서의 값을 시간별로 읽어 저장하고 시간으로 온도를 검색하는 응용
답 : map
2) 지역별로 해 뜨는 시각을 저장하고, 지역이름으로 해 뜨는 시각을 검색하는 응용
답 : map