C++

C++ 14주차

kimbh 2023. 12. 7. 16:31

실습 1 13주차 되새김질 하기(static)

해당 소스에서 실행화면을 보면 14줄에 x값이 나와야 하는 부분에서 y의 변수 값인 10이 먼저 나오게된다.
함수를 한 바퀴 돌았는데도 불구하고 y의 값이 10으로 초기화 되는게 아니라 값이 11로 되어있다. 그래서 static변수값은  컴파일이 끝나야 static 값이 초기화가 된다.
위에 사진을 보면 정적 바인딩인 얼리 바인딩을 사용한 것을 알 수 있고 정적 바인딩은 컴파일 시 변수의 값과 위치가 바로 결정된다. 또 바인딩은 2가지 방법이 존재하는걸 알 수 있고 다른 하나는 동적 바인딩 late라고 부른다.

실습 2

#include <iostream>
using std::cout;
class Point {
	int x;
	int y;
	static int count; //선언
public:
	Point() { cout << ++count; }
	~Point() { cout << --count; }
};
//int Point::count = 0; //정의
int main()
{
	Point p1, p2, p3;
	return 0;
}

스태틱 변수를 선언하게 되면 정의도 같이 해줘야 한다. 정의를 안하게 되면 오류가 생김.

실습 3 템플릿

제네릭이란 type을 실행할 때 결정하는걸 의미한다. 예로 int x = 10;으로 int형을 바로 나타내는데 제네릭(템플릿)을 하게되면 <int> x=10; 실행할 때 int형을 사용하겠다는 의미이다.

python, c#, java, swift, typescript 와 같은 프로그래밍 언어에서 사용한다 이 외에도 다른 프로그래밍 언어들이 많음.

#include <iostream>
using std::cout;
using std::endl;
template <class T> T Max(T i, T j)
{
	return i > j ? i : j;
}
int main()
{
	cout << "Max값은=" << Max(1, 2) << endl;
	cout << "Max값은=" << Max(7.5, 3.6) << endl;
	cout << "Max값은=" << Max('A', 'B');
	return 0;
}

 

class 대신에 typename을 사용하기도 함.

#include <iostream>
using std::cout;
using std::endl;
template <typename T1, class T2> void fun(T1 x, T2 y)
{ // 두 개의 매개변수 자료형이 T1과 T2로 다르다.
	cout << x << " " << y << endl;
}
int main()
{
	fun("Han", 30); // T1은 문자열(const char *),T2는 정수형(int)
	fun(25, 50.5); // T1은 정수형(int), T2는 double형
	fun(25.5, 20.7);
	fun('a', 'b');
	return 0;
}

실습 4

template을 이용한 제네릭 클래스

template으로 만들기 전에 비슷한 class가 3개로 있는데 template로 바꾸기.

#include <iostream>
using std::cout;
using std::endl;
class CCC1
{
	int x;
	int y;
public:
	CCC1(int xx, int yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};
class CCC2
{
	double x;
	double y;
public:
	CCC2(double xx, double yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};
class CCC3
{
	char x;
	const char* y;
public:
	CCC3(char xx, const char* yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};
int main()
{
	CCC1 c1(10, 20);
	CCC2 c2(3.5, 5.5);
	CCC3 c3('I', "Love You!");
	c1.Print();
	c2.Print();
	c3.Print();
	return 0;
}

바꾸기 중반

#include <iostream>
using std::cout;
using std::endl;
template <typename T1, typename T2,> 
class CCC1
{
	T1 x;
	T2 y;
public:
	CCC1(T1 xx, T2 yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};
int main()
{
	CCC1 c1(10, 20);
	CCC1 c2(3.5, 5.5);
	CCC1 c3('I', "Love You!");
	c1.Print();
	c2.Print();
	c3.Print();
	return 0;
}

바꾸고 난 후

#include <iostream>
using std::cout;
using std::endl;
using std::string;
template <typename T1, typename T2> 
class CCC1
{
	T1 x;
	T2 y;
public:
	CCC1(T1 xx, T2 yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};
int main()
{
	CCC1<int, int> c1(10, 20);
	CCC1<double, double> c2(3.5, 5.5);
	CCC1<char, char const* > c3('I', "Love You!");
	c1.Print();
	c2.Print();
	c3.Print();
	return 0;
}

자료형을 class다음에 <>를 이용해서 나중에 자료형을 넣는다.

 

실습 5 STL(Standard Template Library)

Stl은 스탠다드 템플릿 라이브러리 줄임말이고, c++의 표준라이브러리의 일부분을 말한다. 다른 자료형들도 사용할 수 있다.

 

STL의 순 기능을 알려주는 사진이다. 한 줄 만으로도 다양하게 출력할 수 있도록 도와주는 것이라고 보면 된다. 표준 라이브러리에서 가져옴

실습 6 Vector 컨테이너

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector <int> x; //int x[10]와 차이
	// 여러 개 int형을 가지고 노는 배열 공간을 만들고 싶어요
	x.push_back(5);
	x.push_back(1);
	x.push_back(2);
	x.push_back(12);
	for (int i = 0; i < x.size(); i++)
		cout << x[i] << endl;
	return 0;
}

 

실습 7 예외처리

예외처리 하는 키워드는 위 3가지를 사용함. 참고.

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo) {
	cout << "결과" << ja / mo << endl;
}
int main()
{
	double x, y;
	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}

예외 처리가 안되어 있음.

 

예외처리 하는방법 1단계

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo) {
	try {
		cout << "결과" << ja / mo << endl; // 1단계 
	}
}
int main()
{
	double x, y;
	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}

예외가 발생할 수 있는 소스에 try로 묶는다.

2단계

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo) {
	try { // 1단계
		if (mo==0) throw mo; // 2단계
		
		cout << "결과" << ja / mo << endl; 
	}
}
int main()
{
	double x, y;
	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}

2단계에서 mo값이 0이 되면 mo 예외 발생하게 되면 예외 발생인 변수를 던진다 해서 throw 키워드를 사용

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo) {
	try { // 1단계
		if (mo == 0) throw mo; // 2단계
		cout << "결과" << ja / mo << endl;
	}
	catch(double){//3단계 Div 에서 선언한 자료형을 사용해야함
		cout << "분모 0 오류 : 0으로 나눌 수 없음.";
	}
	catch (int) {
		cout << "오류 : 영으로 나눌 수 없음";
	}
}
int main()
{
	double x, y;
	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}

catch는 여러개 사용할 수 있지만 catch(자료형) 자료형 부분에서 위에 함수 선언한 부분에서 똑같은 자료형으로 사용해야한다. 안그럼 오류생김. 

 

'C++' 카테고리의 다른 글

C++ 15주차  (0) 2023.12.14
C++ 프로그래밍 13주차  (0) 2023.11.30
C++프로그래밍 12주차  (0) 2023.11.23
C++ 프로그래밍 11주차  (0) 2023.11.16
C++ 10주차  (1) 2023.11.09