1. 문제

 

8. 디버깅에 필요한 정보를 저장하는 Trace 클래스를 만들어보자. 저자의 경험에 의하면, 멀티태스크 프로그램을 개발하거나 특별한 환경에서 작업할 때, Visual Studio의 디버거와 같은 소스 레벨 디버거를 사용하지 못하는 경우가 더러 있었고, 이때 실행 도중 정보를 저장하기 위해 Trace 클래스를 만들어 사용하였다. Trace 클래스를 활용하는 다음 프로그램과 결과를 참고하여 Trace 클래스를 작성하고 전체 프로그램을 완성하라. 디버깅 정보는 100개로 제한한다.

 

 

 

2. 결과

 

 

 

3. 코드

 

#include <iostream>
#include <string>
using namespace std;

class Trace {
	static string *tag;
	static string *info;
	static int num;
public :
	static void put(string ptag, string pinfo) {
		tag[num] = ptag;
		info[num] = pinfo;
		num++;
	}
	static void print(string ptag="모든") {
		if( ptag == "모든" )
			cout << "----- " << ptag << " Trace 정보를 출력합니다. -----" << endl;
		else
			cout << "----- " << ptag << "태그의 Trace 정보를 출력합니다. -----" << endl;

		for(int i=0; i< num;i++) {
			if( ptag == "모든" )  cout << tag[i] <<":" << info[i] << endl;
			else if( tag[i] == ptag )  cout << tag[i] <<":" << info[i] << endl;
		}
	}
};
int Trace::num = 0;
string *Trace::tag = new string[100];
string *Trace::info = new string[100];

void f() {
	int a, b, c;
	cout << "두 개의 정수를 입력하세요>>";
	cin >> a >> b;
	Trace::put("f()", "정수를 입력 받았음");
	c = a + b;
	Trace::put("f()", "합 계산");
	cout << "합은 " << c << endl;
}

int main() {
	Trace::put("main()", "프로그램 시작합니다");
	f();
	Trace::put("main()", "종료");

	Trace::print("f()");
	Trace::print();
}

 

 

4. 설명

 

 static으로 string*형 변수 tag, info와 int형 num을 선언합니다.

 

- static 변수를 초기화하기 위해서는 클래스 밖에서 "::"를 사용하여서 초기화하여야 합니다. 이러한 이유는 static 변수는 언제든 사용할 수 있어야 하지만 클래스 생성자 안에서 초기화를 한다면 클래스의 객체가 생성되기 전까지는 초기화가 실행되지 않기 때문입니다.

 

-> 디버깅 정보는 100개로 제한하므로 크기가 100인 배열로 초기화 합니다.

-> 마찬가지로 static 변수를 사용하기 위해서는 static 메소드 이어야 합니다.

 

 

 

- print()함수는 매개변수 태그를 하나 입력받아 그의 해당하는 태그를 출력합니다. 여기서 매개변수의 "모든"이라는 디폴트 값을 주어서 매개변수 없을 경우 모든 태그와 정보를 출력하도록 하였습니다.

 

 

+ Recent posts