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