220920 C++ #9

김혜진·2022년 9월 20일
0

C++

목록 보기
8/12

C++ #9

템플릿

템플릿이란

  • 사전적 의미: '형', '틀'을 의미
  • 데이터형을 다량으로 찍어낼 수 있는 매커니즘

템플릿의 필요성

  • 최대값을 구하는 함수
    두 수를 입력하여 비교한 후 큰 수를 반환한다.
    타입별로 여러 개의 중복함수를 만들어야한다.
#include<iostream>

using namespace std;

int max(int x, int y)
{
	//if (x > y) return x;
	//else return y;

	return (x > y) ? x : y;
}

double max(double x, double y)
{
	return (x > y) ? x : y;
}

char max(char x, char y)
{
	return (x > y) ? x : y;
}

void main()
{
	cout << max(10, 20) << endl;
}

⇒ 중복되는 코드가 많음.

템플릿을 사용하면 하나의 함수로 작성할 수 있다.
소스코드의 길이를 현저히 줄일 수 있다.
데이터형을 보장하는 유연성이 있다.

template <class T> T max(T x, T y)
{
	return (x < y) ? x : y;
}

템플릿의 구문구조

  • 템플릿의 선언 구조
template <class 식별자[매개변수]> 함수명 또는 클래스명
{
}
  • 클래스 템플릿 선언
template <class T> class My Class
{
	...
}
  • 함수 템플릿 선언
template <class T> void MyFunc(T& a, T& b)
{
	...
}
  • 템플릿의 참조 방법
    템플릿 클래스명 <데이터형, 매개변수> 객체명

  • 클래스 템플릿 참조

MyClass <int> mytest;
MyClass <char, 6> mytest;
  • 함수 템플릿 참조
MyFunc(5, 10);
MyFunc("string1", "string2");

클래스 템플릿

객체 생성 (매개변수가 없는 클래스 템플릿)

  • 클래스 템플릿이 정의되었으므로 객체를 생성할 수 있다.
CStack<int> test(10);
  • 클래스 템플릿의 객체가 생성될 때까지는 클래스 템플릿에 대한 어떠한 코드도 생성되지 않는다.

  • 멤버함수도 명확하게 호출될 때까지는 생성되지 않는다.

  • 클래스 템플릿이 정의되었으므로 객체를 생성할 수 있다.

객체 생성 (매개변수가 2개인 클래스 템플릿)

CParam<char, 10> pi;
  • 첫 번째 전달인자에는 타입이, 두 번째 전달인자에는 상수가 지정되었다.
  • 배열 TArray메모리 할당은 객체 pi를 선언 시 전달인자의 값에 따라 할당된다.

함수 템플릿

다른 타입을 2개 이상 갖는 함수 템플릿

  • class T 타입이 한 개 더 늘어난다.
  • 함수의 정의 형태
template<class T1, class T2> void print(T1 a, T2 b)
{
	cout << a << "," << n << endl;
}
  • 함수의 사용 형태
print('K', 10);
print(2, 3.5);
print('A', 'B');

다른 타입 및 같은 타입 모두 가능하다.

#include<iostream>

using namespace std;

template <class T> T Max(T x, T y)
{
	return (x > y) ? x : y;
}

template <class T1, class T2> void print(T1 x, T2 y)
{
	cout << x << "," << y << endl;
}

void main()
{
	//cout << max(10, 20) << endl;
	print('K', 10);
	print('A', 'B');
}

예외 처리

예외 처리란

예외 처리의 의미

  • 예외는 사전적 의미로 일반 규칙에서 벗어남을 의미한다.
  • 프로그래밍 상에서는 프로그램 실행 중에 에러를 발생시킬 가능성을 가지고 있는 코드를 말한다.
  • 예외는 컴파일 및 오류도 없지만 사소한 부주의로 원치 않는 결과를 가져오게 한다. 이러한 예외 상황을 적절히 처리해 주는 것을 예외처리(Exception Handling)이라 한다.

예외 상황이 발생하는 경우

  • 다음은 예외 상황 발생 시 나타나는 메시지 창이다.

    네트워크 접속 불량, 하드디스크 섹터 불량, 유효하지 않는 메모리 접근 등

C++ 매커니즘을 이용한 예외 처리

C++매커니즘을 이용한 예외 처리의 기본 구조

C++ 예외 처리는 언어 차원에서 지원하는 기법.
예외 처리 키워드는 크게 3가지가 있다.

종류내용
try예외 가능성이 있는 코드 영역을 처리한다. 이 블록에서 예외가 발생하면 throw 명령으로 예외를 넘긴다.
catch사전적 의미로 '잡는다'는 의미로, 예외 발생 시 예외를 잡아서 처리한다.
throw사전적 의미로 '던진다'는 의미로, 이 키워드를 만나면 예외를 처리하는 구문으로 던진다.
try
{
	// 예외 가능성이 있는 코드 영역
    if(예외 조건) throw 예외 객체
}
catch(예외 객체)
{
	// 예외 발생에 처리할 영역
}

다중 캐치문

#include<iostream>

using namespace std;

void main()
{
	int a, b;
	cout << "나누어질 수 입력 : ";
	cin >> a;
	cout << "나누는 수 입력 : ";
	cin >> b;

	try
	{
		if (a < 0) throw "나누어질 수가 음수입니다.";
		if (b == 0) throw b;
			cout << "나누기 결과 " << a / b << endl;
	}
	catch (int e)
	{
		cout << "나누는 수에 " << e << "이 입력되었습니다." << endl;
	}
	catch (const char* msg)
	{
		cout << msg << endl;
	}
}

함수 안에서의 예외처리

#include<iostream>

using namespace std;

void divide(int argA, int argB)
{
	if (argB == 0) throw argB;
	cout << "나누기 결과 " << argA / argB << endl;
}

void main()
{
	int a, b;
	cout << "나누어질 수 입력 : ";
	cin >> a;
	cout << "나누는 수 입력 : ";
	cin >> b;

	try
	{
		divide(a, b);
	}
	catch (int e)
	{
		cout << "나누는 수에 " << e << "이 입력되었습니다." << endl;
	}
	catch (const char* msg)
	{
		cout << msg << endl;
	}
}
profile
알고 쓰자!

0개의 댓글