C++ 프로그래밍 (1학년 2학기)

231207 C++프로그래밍 14주차

Z2AE 2023. 12. 7. 16:28

1. 

2. 

3. 

#include <iostream>
using std::cout;
void sub();
int main()
{
	cout << "start\n";
	sub();
	sub();
	sub();
	return 0;
}
void sub()
{
	int x = 10;
	//동적 바인딩, run-time시
	static int y = 10;
	//정적 바인딩, y의 초기값은 컴파일시 10으로
	//정해지며 실행시에 이 선언문은 실행하지 않음
	cout << x << y << '\n';
	x++;
	y++;
}

4. 바인딩

  • 변수와 함수에 대한 메모리 할당이나 함수 호출이 발생했을 때 실제로 처리해야 하는 명령어들이 결정되는 시점
  • 정적(static) 바인딩, early
    • 컴파일시 변수의 위치와 함수가 실행할 명령이 결정되는 경우
    • static 변수, overloading
  • 동적(dynamic) 바인딩, late
    • 실제 실행할 때(run time) 결정되는 경우
    • 지역 변수, overriding
  • !?x는 실행할 때 결정되는 경우이며 동적(dynamic)바인딩
  • y는 컴파일할 때 결정되는 경우 정적(static)바인딩
  • !?객체들이 공유할 목적으로 사용하는 멤버변수
  • 앞에 스테틱 붙은 변수는 멤버변수

5. 정의부분 없애고 왜 에러나는지 시험문제였음

  • 스태틱멤버변수에는 선언만하면 됨 바깥쪽에서 정의라는 것 해줘야 함

 

6. 템플릿 구현 형식

7. 제네릭 : 자료형을 나중에 결정하는 것

 

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

8. 템플릿 클래스로 만들기 전에 비슷한 클래스가 3개 존재한다.

#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 <class T1, class 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;
template <class T1, class 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, const char *> c3('I', "Love You!");
	c1.Print();
	c2.Print();
	c3.Print();
	return 0;
}

9. STL(Standard Template Library)

  • C++ 표준라이브러리의 일부분
  • 자료구조 클래스와 알고리즘 등을 미리 만들어 놓은 라이브러리
  • 반복자(iterator)를 가지고 동작하는 C++ 표준 라이브러리의 일부분
  • 자주 사용되는 50여 개의 알고리즘과 다양한 자료구조들을 가지고 있음

10. STL의 주요 구성 요소

  • 컨테이너(container)
    • 객체들을 저장하는 객체나 클래스
      vector, list, deque, string, map 등
  • 반복자(iterator)
    • 컨테이너에 저장된 요소를 순회하고 접근하는 객체나 클래스
  • 알고리즘(algorithm)
    • 데이터를 다루기 위한 함수
      find, sort, search 등
  • 함수 객체(function object), 함수자(functor)
    • 함수처럼 동작하는 객체로 operator() 연산자를 중첩한 클래스의 객체

11. 

#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;

	vector <double> x1; //int x[10]와 차이
	// 여러 개 int형을 가지고 노는 배열 공간을 만들고 싶어요
	x1.push_back(5.2);
	x1.push_back(1.4);
	x1.push_back(2.2);
	x1.push_back(12.9);
	for (int i = 0; i < x1.size(); i++)
		cout << x1[i] << endl;
	return 0;
}

12. 

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str = "안녕!";

	cout << str << endl;
	str.push_back('H');
	str.push_back('i');
	
	cout << str << endl; //안녕!Hi
	for (int i = 0; i < str.size(); i++)
		cout << str[i];
	return 0;
}

13. 예외처리 형식

try
{ // 예외가 발생할 수 있는 코드
	throw 예외값;
}
catch(자료형){ // 예외 처리 블럭
}
catch(자료형){ // 예외 처리 블럭
}
  • 하나 이상의 catch문장이 try문과 관련될 수 있다.
  • 어떤 catch 문장이 사용될 것인지는 예외값의 형에 따라 결정된다.
  • catch에 명시된 자료형이 예외의 자료형과 일치한다면, 해당 catch 문장이 실행되며 다른 catch 문장들은 무시한다. 

14. 

원본 소스

#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단계는 예외가 발생할 수 있는 모든 소스를 try로 묶는 것

2단계는 예외가 발생할 수 있는 경우를 적고 예외를 던짐(throw) -> 다음으로 넘어가지 않음

3단계에는 던진 예외를 잡아서(catch) 오류 메세지를 띄운다.

  • catch의 옆에 쓰는 자료형은 던진 자료형과 일치해야 한다. 일치하지 않는 경우, 오류문이 실행되지 않는다.
#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단계
		cout << "오류 : 0으로는 나눌 수 없습니다";
	}
}
int main()
{
	double x, y;
	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}