try와 if는 장단점이 존재하고 있었습니다. 일단 둘의 차이점은 try 구문에서 예외가 발생하면 그 즉시 블록이 종료가 되고 catch 블록으로 제어가 이동된다고 합니다. 그리고 try/catch는 블럭if/else 는 구문이라는 점이 다릅니다.


if/else 로 에러를 처리한다면 에러가 발생한 객체에 대해서 수명이 유지되기 때문에 에러를 처리하는 동안에도 에러가 발생한 객체를 참조하는 코드가 정상적으로 컴파일 된다. 어떤 예외가 발생했을 경우 try/catch 안의 모든 객체는 스코프를 벗어나 참조 할 수 없게 되지만 if/else 문은 스코프가 벗어 나지 않게 되므로 try/catch 보다 더 위험합니다. 또한 활성 스택에서 생성되는 지역객체들의 자동 소멸을 위해 그것의 정보들을 유지합니다. 따라서 if문의 예외처리와는 달리 지역 객체들의 소멸자가 자동으로 호출되므로 메모리 등 리소스 누수의 문제를 조금이나마 해결할 수 있습니다.


하지만 try/catch 의 단점도 존재하게 됩니다. try/catch 블록은 유지해야 할 정보도 많고 또 실제 예외가 발생 했을 때도 해주어야 할 일이 많기 때문에 당연히 코드 크기나 예외 발생시 처리 속도는if/else의 전통적인 반환 값을 통한 오류처리와는 비교하기 힘듭니다.

 

하지만 try/catch는 자동으로 해주는 일이 많으며 당연히 더 느립니다. 하지만 우리가 만들어낸 코드가 컴파일러가 자동으로 만들어준 코드보다 더 안전하다고 말하기는 힘들겠네요.

Snap1.png


예외를 던질 때 단순히 기본형을 넘기는 것이 아니라, 예외 처리를 위해 미리 만들어진 클래스의 임시 객체를 넘기면 보다 자세한 정보를 catch 핸들러가 얻을 수 있습니다.


하지만 try/catch 를 사용하는 것은 검사코드가 포함되고 stack unwinding을 위한 코드가 추가되기 때문에 실행 파일의 크기를 약간 증가시키고 실행 속도를 약간 감소시킵니다.
예외 처리의 이러한 단점 때문에, 예외 처리는 사용되어야 할 곳에만 사용하는 것이 바람직합니다. (어떤 프로그래머는 DirectX로 개발하는 게임 프로그램의 렌더링 루프에서는 try/catch를 사용하지 않는다고 한다.)

'Programming > 이것저것' 카테고리의 다른 글

Virtual Function  (0) 2010.03.18
Virtual Destructor  (0) 2010.03.18
C++ Style Type Casting  (0) 2010.03.18
#pragma pack  (0) 2010.03.18
#define swap  (0) 2010.03.18

C++에서는 static_cast, const_cast, dynamic_cast, reinterpret_cast의 4가지 casting이 지원된다. 사용 형식은 다음과 같다.

xxxxx_cast<type>(value)

  • const_cast : 상수 객체나 상수 포인터의 상수성을 제거하려는 목적을 갖는다.
  • dynamic_cast : 상위 클래스의 포인터에서 하위 클래스의 포인터로 변환하는 것을 뜻한다. 이 때, 변환에 성공한 경우(즉, 원래의 포인터가 조상 클래스의 포인터인 경우)에는 유효한 포인터가 제대로 리턴되고, 실패한 경우(두 포인터 타입 간에 연관이 없는 경우)에는 NULL이 리턴된다. dynamic_cast보다는 virtual 함수를 사용하는 것이 원래는 더 깔끔한 방법이지만, 라이브러리 안에 들어있는 클래스들이라서 직접 소스 수정이 불가능하다거나한 경우에는 이것을 사용한다(static_cast보다는 안전하다). - Effective C++ 항목 39 참조.
  • reinterpret_cast : 함수 포인터 타입을 형변환하는 것과 같이 구현에 따라 달라지는 결과를 위한 형변환을 목적으로 사용된다. 또한, 포인터 형변환 시에 static_cast로는 불가능한 경우에 사용할 수 있다(예 : void*를 Student*로 바꾼다거나..)
  • static_cast : 일종의 잡동사니 형변환이다. 어떤 형변환도 적합치 않을 때 사용할 수 있다. 의미상으로 볼 때는 기존 C의 형변환에 해당한다.

기존의 형변환도 그대로 사용되지만 새로운 형태의 형변환을 사용하는 것이 좋다. 코드에서 찾아보기도 쉽고 (사람뿐만 아니라 grep 같은 툴에게도 쉽다.) 보다 전문화된 목적의 형변환 형태가 컴파일러가 사용 에러를 진단하는 것을 가능하게도 해주기 때문이다.

'Programming > 이것저것' 카테고리의 다른 글

Virtual Function  (0) 2010.03.18
Virtual Destructor  (0) 2010.03.18
try/catch와 if/else의 차이점  (0) 2010.03.18
#pragma pack  (0) 2010.03.18
#define swap  (0) 2010.03.18

 #pragma pack은 구조체의 저장 크기를 결정하는 명령어입니다.

 BYTE 의 멤버 변수를 1바이트로 실제 저장하는가 아니면 2, 4바이트로 저장하는가를 설정합니다.


#pragma pack(push,2) <---- gcc, vs에서 이렇게 사용합니다.

    struct KBITMAPFILEHEADER

    {

        WORD bfType;

        DWORD bfSize;

        WORD bfReserved1;

        WORD bfReserved2;

        DWORD bfOffBits;

    };

#pragma pack(pop)

'Programming > 이것저것' 카테고리의 다른 글

Virtual Function  (0) 2010.03.18
Virtual Destructor  (0) 2010.03.18
try/catch와 if/else의 차이점  (0) 2010.03.18
C++ Style Type Casting  (0) 2010.03.18
#define swap  (0) 2010.03.18

+ Recent posts