B2024001225 윤지선
2학기 14주차 과제 본문
오늘 하는 내용은 시험에서 단답형으로 많이 출제
템플릿(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 컨테이너의 기본 특성과 시간 복잡도를 보여줍니다. 각 컨테이너는 특정 용도에 맞게 설계되었으며, 그에 따른 성능 특성을 가지고 있습니다.주요 특징:
- 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. 꾸준함, 성실성
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 |