091
[C/C++] 템플릿, STL 본문
01. 템플릿(template) : 포괄적 함수(generic function)
template <class T>
T Max(T x, T y) { return x>y?x:y;} //typename을 사용해도 됨
- 인자(매개변수)를 통한 다형성을 제공하며, 코드의 변화없이 형만 다른 함수가 필요한 경우에 사용하는 것이 좋음 -> 게빌지기 민들어야하는 코드를 컴파일러가 대신 만들기 때문에 템플릿을 사용하더라도 코드는 줄어들지 않음
-> class 위치에 typename도 사용할 수 있는데 함수 템플릿에서는 typename을 더 선호하고 클래스 템플릿에서는 class를 더 선호
- 참조자(reference) : 기존 변수에 대한 별명으로, 참조자를 통해 원래 변수를 직접 수정할 수 있음(원래 변수를 통해 참조자도 수정가능)
#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
int x = 10;
int& rx = x; //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;
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;
}
02. STL(Standard Template Library)
- 자료구조 클래스와 알고리즘 등을 미리 만들어 놓은 라이브러리로 반복자를 가지고 동작하는 표준 라이브러리의 일부분
- vector 컨테이너에서 push_back(요소)를 사용하여 새로운 요소 추가, size()를 통해 사이즈 알 수 있음
#include <iostream>
#include <vector>
using namespace std;
int main( )
{
vector <int> x; //int x[10]와 차이
// 여러 개 int형을 가지고 노는 배열 공간을 만들고 싶어요
x.push_back(1);
x.push_back(2);
for(int i = 0 ; i < x.size() ; i++)
cout << x[i] << endl; //1 2
return 0;
}
03. 예외처리(exception handling, error handling)
- 예외 처리란 실행 시간에 발생할 수 있는 오류를 처리하는 것
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo){
try{
if(!mo) throw mo;
cout<<"결과:"<<ja/mo<<endl;
}
catch(double){ //mo가 double형
cout<<"오류:영으로 나눌 수 없음";
}
}
int main()
{
double x, y;
cout <<"분자를 입력하세요=";
cin>>x;
cout <<"분모를 입력하세요=";
cin>>y;
Div(x, y);
return 0;
}
04. 파일 입출력
- 형식 설정 멤버 함수 : 폭, 정밀도 등을 설정하는 멤버함수가 제공
#include <iostream>
using namespace std;
int main(){
cout << "디폴트\n";
cout.width(10);
cout << -50 << endl; //(7공백)-50
cout << "[ * fill ]\n";
cout.fill('*');
cout.width(10);
cout << -50 << endl; //*******-50
cout.width(10);
cout << 100.25 << endl; //****100.25
cout.width(10);
cout << "HanSH"<<endl; //*****HanSH
cout.fill(' ');
cout.precision(6); //소수점을 제외한 전체 자리수
cout<< 12.34567<<endl; //12.3457
cout << fixed; //소수점 이하의 자리수만 다루게 함
cout.precision(3); //12.346
cout << 12.34567 << endl;
return 0;
}
- width()함수의 영향은 일시적이므로 매 출력 시마다 지정해줘야하지만 fill()함수는 한번 지정하면 그 효과가 계속 유지됨
- setfill(char)의 경우에도 한번 지정하고 나면 그 효과가 유지됨, setw(int)의 경우 소수점을 포함한 값
- 파일클래스에는 ifstream, ofstream, fstream이 있고 각각 읽기, 쓰기, 읽기와 쓰기를 모두 가능하게 하는 클래스임
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream hout("test.txt"); // 출력파일 스트림 객체 hout 선언
if(!hout){
cout<<"출력할 파일을 열 수 없습니다.";
return 1;
}
hout<<"Han\n";
hout<<100<<endl<<hex<<100<<endl;
hout.close(); //파일 종결
return 0;
}
- Han 100 64(100의 16진수)
#include <iostream>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream hin("test.txt"); // 입력파일 스트림 객체 hin 선언
if(!hin){
cout<<"입력할 파일을 열 수 없습니다.";
return 1;
}
char str[50];
int i,j;
hin>>str>>i>>j;
cout<<str<<" "<<i<<" "<<j<<endl;
hin.close(); // 파일 종결
return 0;
}
'Programming Language > C&C++' 카테고리의 다른 글
[C/C++] ESP32를 사용하여 LED 키고 꺼지게 만들기 (4) | 2025.02.28 |
---|---|
[C/C++] Arduino IDE에서 ESP32를 사용하기 위한 환경설정하기 (3) | 2025.02.27 |
[C/C++] 오버라이딩:가상함수 (1) | 2024.12.16 |
[C/C++] 상속 (3) | 2024.12.15 |
[C/C++] 함수중첩(멤버함수,생성자), 디폴트 인자(매개변수) (1) | 2024.12.15 |