본문 바로가기

전체 글93

[ C++ ] 예외 클래스와 예외 객체 기본 자료형 데이터만을 '예외' 데이터로 사용했는데, 클래스의 객체도 '예외' 데이터가 될 수 있다. 또 이것이 보다 일반적인 방법이다. 예제를 보자. 예외 발생 시에 DivideException 객체를 생성하여 예외를 처리한다. 예외 발생을 알리는 데 사용되는 객체를 가리켜서 '예외 객체'라고 하며, 예외객체의 생성을 위해 정의된 클래스는 '예외 클래스'라고 한다. 객체를 이용해서 예외상황을 알리면, 예외가 발생한 원인에 대한 정보를 보다 자세히 담을 수 있다. 2019. 12. 2.
[ C++ ] Stack Unwinding(스택 풀기) 이전 포스팅에서 함수 내에서 throw를 던진 경우에 그 함수를 호출한 영역으로 돌아가서 예외처리를 하였다. 이렇듯, 예외처리에 대한 책임은 throw가 발생한 함수를 호출한 영역으로 넘어가게 된다. 그리고 호출한 영역으로 '예외' 데이터를 전달하면, 해당 함수는 더 이상 실행되지 않고 종료가 된다. 이렇게 함수 내에서 예외가 처리되지 않아서, 함수를 호출한 영역으로 예외 데이터가 전달되는 현상을 가리켜 'Stack Unwinding(스택 풀기)'라고 한다. 위의 함수 호출 순서는 다음과 같다. main -> One -> Two -> Three ( 스택이 쌓이는 방향 ) 그리고 Three에서 예외를 던졌다. 그래서 다시 Three -> Two -> One -> main ( '예외' 데이터가 전달되면서 스.. 2019. 12. 2.
[ C++ ] 예외처리 메커니즘( try, catch, throw ) 총 정리 우리에게 익숙한 예외처리는 if문을 이용한 예외처리이다. 하지만 if문을 보고 예외처리를 위한 코드인지 프로그램의 흐름을 구성하는 코드인지 쉽게 구분하지 못해서 가독성이 떨어진다. 하지만 C++의 예외처리 메커니즘을 이용하면 가독성을 높일 수 있다. C++은 구조적으로 예외를 처리할 수 있는 메커니즘을 제공한다. 가독성과 유지보수성을 높일 수 있을 뿐만 아니라, 예외의 처리를 프로그램의 일반적인 흐름에서 독립시키는 것이 가능하다. try try { // 예외발생 예상지역 } try 블록은 예외 발생에 대한 검사의 범위를 지정할 때 사용된다. 즉, try 블록 내에서 예외가 발생하면, C++의 예외처리 메커니즘에 의해서 처리가 된다. catch catch(처리할 예외의 종류 명시) { // 예외처리 코드의.. 2019. 12. 2.
[ C++ ] template<typename T>과 template<> 언제 template를 선언해야하고 언제 template을 선언해야 할까? 템플릿을 정의할 때는 template 또는 template와 같은 선언을 둬서 템플릿의 일부 또는 전부를 정의하고 있다는 사실을 컴파일러에게 알려야 한다. 그럼 template의 선언이 필요한 경우롸 template의 선언이 필요한 경우를 구분하면 된다. 초반에 템플릿을 공부할 때는 많이 헷갈렸는데 결론은 간단하다. 정의 부분에 T가 존재하면 를 선언하고 T, T1, T2와 같은 문자가 존재하지 않으면 를 선언하면 된다. template class Temp { private: T num; }; //--------------------- template class Temp { private: int num; }; 주의할 점은 부분 .. 2019. 12. 1.
[ C++ ] 함수 템플릿, 클래스 템플릿과 static template void StaticValue() { static T num = 0; num += 1; cout 2019. 12. 1.
[ C++ ] 템플릿 매개변수와 디폴트 값(default value) 템플릿을 정의할 때 결정되지 않은 자료형을 T, T1, T2와 같은 문자로 표기하는데 이런 문자를 템플릿 매개변수라고 한다. 그래서 다음과 같은 형태로 객체 생성이 가능하다. 또한 디폴트 값도 지정이 가능합니다. 자료형도 디폴트 값을 정해줄 수 있다. 2019. 12. 1.
[ C++ ] 클래스 템플릿의 특수화( Class Template Specialization ) 이전에 함수 템플릿의 특수화에 대해 포스팅을 한 적이 있다. 함수 템플릿을 특수화하는 이유는 특정 자료형에 대해서는 개발자가 커스텀한 다른 템플릿 함수를 생성하기 위해서이다. 이처럼 클래스 템플릿을 특수화하는 이유는 특정 자료형에 대해서는 다르게 구분이 되는, 템플릿 클래스의 객체를 생성하기 위해서이다. 예제를 보자. Hello 클래스 템플릿을 double형에 대해서 특수화하였다. 그래서 double형으로 Hello 객체를 생성 시에 특수화한 부분을 기반으로 객체가 생성된 것을 확인할 수 있다. 그럼 Hello 클래스에 typename을 하나 더 뒀다고 생각해보자. template class Hello { ... } 그럼 이에 대하여 char형으로 특수화를 시키면 다음과 같이 될 것이다. template.. 2019. 12. 1.
[ C++ ] 스마트 포인터의 템플릿화 #ifndef __SMART_POINTER_TEMPLATE_H_ #define __SMART_POINTER_TEMPLATE_H_ #include #include using namespace std; template class Smart_Pointer { private: T * ptr; public: Smart_Pointer(T* _ptr); T& operator*() const; T operator->() const; ~Smart_Pointer(); }; template Smart_Pointer::Smart_Pointer(T* _ptr) : ptr(_ptr) { } template T& Smart_Pointer::operator*() const { return *ptr; } template T Smart.. 2019. 11. 30.
[ C++ ] 배열 클래스의 템플릿화 #ifndef __ARRAY_TEMPLATE_H_ #define __ARRAY_TEMPLATE_H_ #include #include using namespace std; template class Bound_Chk_Array { private: T * arr; int len; Bound_Chk_Array(const Bound_Chk_Array& arr) { } Bound_Chk_Array& operator=(const Bound_Chk_Array& arr) { } public: Bound_Chk_Array(int _len); T& operator[] (int idx); T operator[] (int idx) const; int GetArrLen() const; ~Bound_Chk_Array(); }; .. 2019. 11. 30.