dynamic_cast : 상속관계에서의 안전한 형 변환

 

<사용하는 경우>

상속관계에 놓여 있는 두 클래스 사이에서 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환하는 경우

 

<예시>

dynamic_cast<T>(expr)

- T는 변환하고자 하는 자료형의 이름(객체의 포인터 or 참조형)을 둠

- expr은 변환의 대상

 

<코드>

 

<예외경우>

"기초 클래스가 Polymorphic클래스(하나 이상의 가상함수를 가진 클래스)인 경우 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형으로의 형 변환을 허용함

 

 

 

 

이러한 유형의 논란과 문제점 때문에 C++에서 4개의 연산자를 추가로 제공해 용도에 맞는 형 변환 연산자의 사용을 

유도함

 

- dynamic_cast

- static_cast

- const_cast

- reinterpret_cast

예외 객체 : 예외발생을 알리는 사용되는 객체

예외 클래스 : 예외객체의 생성을 위해 정의된 클래스

 

<예외클래스 코드>

-예외객체를 참조로 받음

 

-AccountException부모클래스를 DepositException, WithdrawException이 상속받는 구조로 해서 AccountException으로 throw 자료형을 명시하면 둘다 받을 수 있음

 

<예외의 전달방식에 따른 주의사항>

 

 

<new연산자에 의해서 발생하는 예외>
-new연산에 의한 메모리 공간의 할당이 실패하면 bad_alloc(<new>에 선언된 예외클래스)이라는 예외발생

 

<모든 예외를 처리하는 catch블록>

-모든 예외가 자료형에 상관없이 거렬듬

try

{

}

catch{...}

{

}

 

<예외던지기>
-catch블록에 전달된 예외는 다시 전져질수 있음

-하나의 예외가 둘 이상의 catch블록에 으해서 처리되게 할 수있음

 

try

{

}

catch(int expn)

{

 cout<<"first catch"<<endl;

 throw; //예외를 다시 던짐

}

스택풀기 : 예외가 처리되지 않아서, 함수를 호출한 영역으로 예외 데이터가 전달되는 현상

-예외가 처리되지 않아서, 예외 데이터가 main함수에 도달하고, main함수에서조차 예외을 처리하지 않으면, terminate함수(프로그램을 종료시키는 함수)가 호출되면서 프로그램이 종료되어 버림

 

<처리되지 않은 예외의 전달>

-함수 내에서 함수를 호출한 영역으로 예외 데이터를 전달하면, 해당 함수는 더 이상 실행되지 않고 종료가 됨

 

 

<예외상황이 발생한 위치와 예외상황을 처리해야 하는 위치가 다른 경우>

- 이러한 경우, 예외가 발생한 원인이 되는 데이터가 외부에서 들어온 것이기 때문 예외를 외부로 넘겨서 외부에서 처리하는 것이 맞음

 

throw한 예외데이터의 자료형이 catch에서 받는 예외데이터 자료형 매개변수의 자료형과 일치하지 않는 경우

-자료형의 불일치로 인해서 예외는 처리되지 않고, 해당 함수를 호출한 영역으로 예외 데이터가 전달됨(외부로 넘겨짐)

 

 

<하나의 try블록과 다수의 catch블록>

-하나의 try블록 내에서 유형이 다른 둘 이상의 예외상황이 발생할 때 사용

 

<전달되는 예외의 명시>

-개발자가 이 함수에서 일어나는 예외는 int형, char형과 관련된 예외일거라는 표현을 하는 것

-but, 다른 자료형의 예외 데이터가 전달될 경우 termiante함수의 호출로 인해서 프로그램 종료됨(왜냐하면 프로그램을 종료시켜서 문제의 원인을 찾고 또 발생 가능한 예외의 유형을 정확히 점거하도록 유도하는 것이 훨씬 바람직해서)

 -함수의 선언에 명시되지 않은 예외가 전달되면 unexpected라는 이름의 함수가 호출되고 이 함수의 기능은 terminate  함수의 호출임

-전달되는 예외의 자료형을 명시하는 부분을 비워놓으면 어떠한 예외도 전달하지 않음을 의미함

 

C++의 예외처리 매커니즘 : 예외가 발생하면(throw절인 실행되면) , 프로그램 흐름이 중지되고, catch블록에 의해서 예외의 처리과정을 거침

 

try 블록 : 예외발생에 대한 검사의 범위를 지정할 때 사용

catch 블록 : try블록에서 발생한 예외를 처리하는 코드가 담기는 영역

 

<예시>

try

{

   //예외발생 예상지역

}

catch

{

   //예외처리 코드의 삽임

}

 

throw : throw는 예외가 발생했음을 알림

<예시>
throw expn;

-expn은 변수,상수,객체 등 표현 가능한 예외상황에 대한 정보를 담은 의미 있는 모든 데이터가 될 수 있음

 

*throw에 의해 던져진 예외데이터는, 예외데이터를 감싸는 try블록에 의해서 감지가 되어 이어서 등장하는 catch블록에 의해 처리됨

 

 

<try-catch코드>

-try블록 내에서 예외가 발생하지 않으면, catch블록은 그냥 건너 뛰고 그 다음행이 실행됨

-try블록에서 예외가 발생하면, 예외 발생지점 이후의 나머지 try영역 코드는 건너뛰고 catch블록 코드가 실행됨

 

 

try블록을 묶는기준

-예외와 연관된 부분을 모두 하나의 try블록으로 묶음

 

예외 : 프로그램 실행 도중에 발생하는 예외적 상황(프로그램 논리에 맞지 않는 상황)

 

-예외처리를 할 때 try~catch문말고 if문을 사용하면 예외처리를 위한 코드와 프로그램의 흐름을 구성하는 코드를 쉽게 구분하지 못함

-static지역변수는 템플릿 함수별로 각각 존재함

-static멤버변수는 템플릿 클래스별로 각각 존재함

 

<예시>

함수템플릿의 static변수 선언

 

template <typename T>

void ShowStaticValue(void)

{

 static T num=0;

 num+=1;

}

 

클래스 템플릿의 static변수 선언

 

*template<typename T>와 template<>의 차이

-일단, 템플릿 관련 정의에는 이 표현을 선언해서 템플릿의일부 또는 전부를 장악하고 있다는 사실을 컴파일러에게 알림

 

-template<typename T> : template과 관련있고 템플릿 매개변수가 필요한 경우

-template<> : 템플릿 매개변수가 필요없지만 template과 관련있음을 알려야 하는 경우

 

 

<템플릿 static 멤버변수 초기화의 특수화>

-클래스 템플릿 정의의 일부인 초기화문을 대상으로도 진행가능

template<>

long SimpleStaticMem<long>::mem=5;

 

템플릿 매개변수 : T1같은거

ex) template<typename T1>

템플릿 인자 : int같이 템플릿 매개변수에 전달되는 자료형 정보

ex) Apple<int>

 

템플릿 인자 예시

-템플릿 매개변수에 값을 전달받을 수 있는 변수를 선언하면, 변수에 전달되는 상수를 통해서 서로 다른 형의 클래스를 생성가능

-길이가 다른 두 배열 객체간의 대입 및 복사에 대한 부분을 이런 특징을 이용하면 신경쓰지 않아도 됨

 

 

<템플릿 매개변수 디폴트 값 지정>

Class Template Specialization : 특정 자료형을 기반으로 생성된 객체에 대해, 구분이 되는 다른 행동을 적용하기 위함

 

Class Template 코드

 

Class Template Specialization 코드

Class Template 부분 Specialization 코드

 

-템플릿 자료형 인자에 따라서 어떤 템플릿을 사용해 클래스를 만들건지 결정됨

-전체 특수화가 부분 특수화보다 우선시 됨

'Programming Language > C++' 카테고리의 다른 글

14-4 템플릿과 static  (0) 2019.06.26
14-3 템플릿 인자  (0) 2019.06.26
13-2 Class Template(클래스 템플릿)  (0) 2019.06.25
13-1 Function Template(함수 템플릿)  (0) 2019.06.25
12-1 표준 string 클래스  (0) 2019.06.25

Class Template : 클래스를 만드는 데 사용되는 template

Template Class : class template을 기반으로 컴파일러가 만들어 내는 class

 

 

<주의할점>

template사용한 클래스를 사용할 때 파일을 나누었을 때

Point.h(함수 선언)

Point.cpp(함수 정의)

PointMain.cpp(Point클래스 사용해 실행)

 

PointMain.cpp

#include "Point.h"

-이렇게만 선언되어 있으면 컴파일러는 Point.h정보 뿐 아니라 함수 정의가 담긴 Point.cpp의 정보도 필요해서 Point클래스를 만들 수 없음

-이런 이유는 파일단위 컴파일 우너칙에 의해서 PointMain.cpp를 컴파일하면서 PointTemplate.cpp의 내용을 참조하지않기 때문

 

<해결방법>

1.첫번째 방법

PointMain.cpp

#include "Point.h"

#include "Point.cpp"

//Main.cpp에 두 개 파일 모두 include

 

2.두번째 방법

-Point.h에 함수 선언 뿐 아니라 정의도 작성함

+ Recent posts