B2024001225 윤지선

2학기 14주차 과제 본문

2024년 2학기/C++ 프로그래밍

2학기 14주차 과제

윤지선 2024. 12. 2. 16:28

오늘 하는 내용은 시험에서 단답형으로 많이 출제

 

템플릿(template)

STL(Standard Template Library) 예외처리

 

 

 

<>의 사용법
연산자를 제외한 <>의 용도

# 자료형을 나중에 결정한다.

 

#include <iostream>
using std::cout;
using std::endl;

int Max(int i, int j)
{
	return i > j ? i : j;
}
double Max(double i, double j)
{
	return i > j ? i : j;
}
char Max(char i, char 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;
}

원래 코드

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

template를 사용한 코드

# 눈에 보이는 소스는 줄어들었지만 실제 실행파일 사이즈는 똑같음.

 

템플릿 구현 형식

#include <iostream>
using std::cout;
using std::endl;
template <typename 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 T> 말고  <typename T>를 쓸 수도 있음. 위 코드의 경우는 typename를 상용하는게 나음.

 

함수를 템플릿으로 사용할 때는 typename을 사용함.

 

#include <iostream>
using std::cout;
using std::endl;

template <typename T1, typename T2, class T3> void fun(T1 x, T2 y, T3 z)
{     // 두 개의 매개변수 자료형이 T1과 T2로 다르다.
	cout << x << "  " << y << " " <<z << endl;
}
int main()
{
	fun("Han", 30, 30.5); // T1은 문자열(const char *),T2는 정수형(int)
	fun(25, 50.5, "a");  // T1은 정수형(int), T2는 double형 
	fun(2, 3, 1.2);
	return 0;
}

# 자료형을 다르게 할 때는 T다음 숫자로 구분함. 

# 눈에 잘 띄기 위해서 대문자로 사용

# class 말고 typename로 사용 가능

 

1. 비슷한 클래스가 있으면 다 지우고 하나만 남긴다.

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


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

 

2. class 앞에 template를 쓴다

#include <iostream>
using std::cout;
using std::endl;

template <class T1, T2> class CCC
{
	T1 x;
	T2 y;
public:
	CCC(T1 xx, T2 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;
}

 

3. CCC라는 클래스에 객체를 만들 때는 결정되지 않은 T1, T2가 있는데 자료형을 앞에 써줘야함.

#include <iostream>
using std::cout;
using std::endl;

template <class T1, class T2> class CCC
{
	T1 x;
	T2 y;
public:
	CCC(T1 xx, T2 yy) { x = xx; y = yy; }
	void Print() { cout << x << ',' << y << endl; }
};


int main()
{
	CCC <int,int>c1(10, 20);
	CCC <double, double> c2(3.5, 5.5);
	CCC <char,const char*> c3('I', "Love You!");

	c1.Print();
	c2.Print();
	c3.Print();
	return 0;
}

# 클래스를 template로 사용할 때는 typename보다 class를 사용

 

위 코드 설명

 


자료구조와 STL의 비교표

이 표는 각 STL 컨테이너의 기본 특성과 시간 복잡도를 보여줍니다. 각 컨테이너는 특정 용도에 맞게 설계되었으며, 그에 따른 성능 특성을 가지고 있습니다.주요 특징:

  • vector는 동적 배열로 구현되어 빠른 접근이 가능하지만 중간 삽입/삭제가 느립니다.
  • list는 이중 연결 리스트로 구현되어 빠른 삽입/삭제가 가능하지만 접근이 느립니다.
  • set과 map은 균형 트리(주로 레드-블랙 트리)로 구현되어 로그 시간 복잡도의 연산을 제공합니다.
  • unordered_map은 해시 테이블로 구현되어 평균적으로 상수 시간 복잡도의 연산을 제공합니다.
  • stack과 queue는 특정 순서로 요소를 저장하고 접근하는 데 사용됩니다.

이 정보를 바탕으로 개발자는 특정 사용 사례에 가장 적합한 컨테이너를 선택할 수 있습니다


 

표준이 들어가면 어디서나 똑같이 동작함

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

vector은 배열 크기가 유동적.

 

예외처리 설명

 

예외처리 관련 키워드

 

<예외처리 방법>

1. 에러가 발생할 수 있는 코드를 try로 묶어준다 

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo)
{
	try{
	cout << "결과:" << ja / mo << endl;
	}
}
int main()
{
	double x, y;

	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}

 

2단계

try{
	if (mo==0) throw mo; //2단계
	cout << "결과:" << ja / mo << endl;
}

 

 

3. catch블록을 try블록 밖에 쓰기

	try{
		if (mo==0) throw mo; //2단계
		cout << "결과:" << ja / mo << endl;
	}
	catch () { 
		cout << "오류 : 0으로 나눌 수 없음"; //catch블록을 try블록 밖에다가 작성
	}
}

 

 

4. 던지는 에러의 자료형을 괄호 안에 작성 

	catch (double) { 
		cout << "오류 : 0으로 나눌 수 없음"; //catch블록을 try블록 밖에다가 작성
	}

 

 

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo)
{
	try{
		if (mo==0) throw mo; //2단계
		cout << "결과:" << ja / mo << endl;
	}
	catch (double) { 
		cout << "오류 : 0으로 나눌 수 없음"; //catch블록을 try블록 밖에다가 작성
	}
}
int main()
{
	double x, y;

	cout << "분자를 입력하세요=";
	cin >> x;
	cout << "분모를 입력하세요=";
	cin >> y;
	Div(x, y);
	return 0;
}

최종

실행결과
프로그래밍 언어별 예외처리하는 키워드

 

 

#include <iostream>
using namespace std;
int main() {
    cout << "디폴트\n";
    cout.width(10);
    cout << -50 << endl;
    cout << "[ * fill ]\n";
    cout.fill('A');
    cout.width(7);
    cout << -50 << endl;
    cout.width(10);
    cout << 100.25 << endl;
    cout.width(10);
    cout << "HanSH" << endl;
    cout.fill(' ');
    cout.precision(5);  //소수점을 제외한 전체 자리수 
    cout << 12.34567 << endl;
    cout << fixed;  //소수점 이하의 자리수만 다루게 함 
    cout.precision(3);
    cout << 12.34567 << endl;
    return 0;
}

# 소수점 이하 자리수를 찍거나 비어있는 칸을 문자로 채우고 싶을 때는 cout.fill 사용.

 

# setw()나 setfill() 을 사용할 때는 반드시 #include <iomanip> 를 넣어줘야 함.

 

 

1. ofstream

#include <iostream>
using namespace std;
int main()
{
	ofstream
	cout << "Smile";
	return 0;
}

 

2. hout(사용하고싶은 이름) / #include <fstream> 작성 //hout는 객체 이름이기 때문에 내 마음대로 작성 가능.

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
	ofstream hout("aa.txt");
	hout << "banana";
	cout << "Smile";
	return 0;
}

 

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
	int x;
	ofstream sout("aa.txt"); //hout는 객체 이름. 내 마음대로
	sout << "banana";
	cout << "Smile";
	ifstream hin("a.txt");
	hin >> x;
	cout << x;

	return 0;
}

# 파일을 만들 때(저장) : ofstream

# 파일에서 데이터를 불러올 때는 ifstream을 사용

 

 

파일을 가지고 놀 때는 ifstream, ofstream 등을 사용

 

 

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
	int x;
	fstream sout("aa.txt"); //hout는 객체 이름. 내 마음대로
	sout << "banana";
	sout.close();
	//cout << "Smile";
	ifstream hin("a.txt");
	hin >> x;
	cout << x;

	return 0;
}

# 파일을 만든 뒤에는 .close를 사용하여 파일을 닫아줘야함.

 

 

 

이번학기에 뭘 학습했나?

1. 1학년 2학기 C++ 과목을 통해서 객체지향언어의 기본적인 문법을 익혔습니다.  C++11이후 바뀐 모던 C++의 특징에 대해서도 학습하였습니다.
2. 클래스를 통해 캡슐화하는 방법, 다형성으로 함수 오버로딩, 상속과 overriding을 통해 코드 재사용 등의 특징을 학습했습니다.
3. 또한, template, STL, exception handing, 파일 입출력 등의 문법도 익혀서 C++로 실무 프로젝트를 진행하는데 무리가 없도록 기본 문법을 확실히 이해하고 있습니다.
4. 포트폴리오?
5. 구글링/AI : C++ stl file 성적처리
6. 직접 만드는 것도 좋지만 좋은 소스를 많이 보고 만들기
7. 블로그 관리(저작권, 복붙, 비공개, 꾸준, 습관)

 

 

 

처음에 배울 때는 혼자서 무언갈 만들기보단 문법을 잘 배우고 잘 만든 코드를 분석하는게 내 실력향상에 도움이 됨.

 

개발자의 역량 두가지
1. 꾸준함, 성실성
2. 정리정돈
=> 블로그 작성

 

참조자(reference)

- C++에서만 가능

- 참조자를 사용하려면 파일명이 .cpp이어야 함

- 변수의 별명

ex) int & rx = x; //x의 별명은 rx이다. 

x = 10;

cout << x; // 10 출력

 

참조자를 사용하지 않았을 때(int rx = x;)

#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
    int x = 10;
    int rx = x;
    cout << x << " " << rx << endl;
    rx = rx + 10;
    cout << x << " " << rx << endl; //참조자(rx)에 변화를 주면 그 타켓(x)도 변함
    x = x + 10;
    cout << x << " " << rx << endl; //타켓(x)에 변화를 주면 그 참조자(rx)도 변함
    return 0;
}

실행결과

 

 

참조자를 사용했을 때

#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
    int x = 10;
    int &rx = x;
    cout << x << " " << rx << endl;
    rx = rx + 10;
    cout << x << " " << rx << endl; //참조자(rx)에 변화를 주면 그 타켓(x)도 변함
    x = x + 10;
    cout << x << " " << rx << endl; //타켓(x)에 변화를 주면 그 참조자(rx)도 변함
    return 0;
}

실행 결과

 

'2024년 2학기 > C++ 프로그래밍' 카테고리의 다른 글

2학기 14주차 예습과제  (0) 2024.12.02
2학기 13주차 예습과제  (0) 2024.11.25
2학기 12주차 과제  (0) 2024.11.18
2학기 12주차 예습과제  (0) 2024.11.18
2학기 11주차 과제  (0) 2024.11.11