예외처리는 크게 세 부분으로 이루어져 있다

try :     예외처리가 일어날 구역을 정해준다. 예를들어, 나눗셈이 있는 구간에만 try{}문으로 묶어서 divide by zero를 처리해주거나 

          메모리를 사용하는 부분에서 간혹 참조하는 부분이 할당되지 않은 메모리를 건드리는 경우가 있을때, 이 구역을 try문으로           미리묶어서 runtime error가 일어날 수 있는 부분을 넘겨 줄 수 있고 미리 logical error가 날지 모르는 상황을 logical이라고           잡아주는 경우가 있다.


throw : try문 안에서 throw문이 발생할 경우, catch문의 parameter가 되는 descrtion에 에러메시지를 넘겨준다. 대개

if(에러조건) throw(에러메시지)와 같은 형태로 사용한다.



catch :  parameter로 에러메시지를 받는 함수로 try문 바로 아래에 위치한다. throw문을 출력하고 해당 프로그램을 계속해서 실행하

도록 해준다.



이러한 예외처리는 어떤 오류가 일어났는지 확인하고 프로그램을 종료할 수 있다. 혹은 역으로 에러메시지를 보고 어느 try구간에서 에러가 났는지 찾아가기 유용하다. 혹은 말 그대로 예외를 처리하는데에도 유용하다.

여기서는 호출하는 함수 안에 throw문을 넣어 미리 logical을 예방하도록 했다. 


이 예제는 동적할당에 있어서 예외발생을 다루고 있다. 동적할당에서는 해당변수를 할당하고 이를 해제하는 과정이 중요하다. 

그런데 이 상황에서는 정상적인 변수를 넘겨주지 않아 예외가 발생하고 이 예외를 처리하고 있다.

그런데 이 예외에서는 반드시 동적할당이기에 이 변수를 다시 해제해줘야한다. 그렇기에 catch문의 내부에 동적할당된 변수를 해제하는 내용이 포함되어 있다.



이는 새로운 연산자가 기존 연산자와 유사하다면 연산자를 오버로딩 하는것이 유용하다 사실 무엇보다 크다는 비교 연산자 >를 이용하여 오버로딩할 수 있다. 


연산자 오버로딩의 목적은 더디까지나 읽기 쉽고 이해하기 쉽기 위함이다. 연산자 오버로딩은 프로그램코드를 작성하는 것도 쉽게 해준다. 그러나 연산자의 작용이 직관적으로 연결되지 않는경우 이는 역효과를 가져올 수 있다. 이와 함께 내가 가장 헷갈리고 많이 썼지만 중요한 순간에는 잊었던 입출력 연산자 오버로딩을 보자


사진이 잘려서 잘 보이진 않지만, 맨 마지막에 show_card()함수와 monster이라는 함수를 ostream출력으로 함꼐 사용함을 볼 수 있다. 

결과는 내부 코드가 같으니 똑같이 나왔고 일단 순서는 ostream& operator <<(ostream& out, 출력대상의 포인터);로 프로토타입을 정의해두고 

함수 내부에서는 임의의 패러미터로 설정해준 ostream& out에 기존 ostream에 있는 방식대로 출력한 다음, 이 값을 리턴시킨다. 


함수 overloading 이외에, C++은 연산자를 클래스 안에서 다시 정의해서 다른 의미로 쓸 수 있다 이 기법을 연산자 overloading이라 한다. 


프로그래밍 언어에서 대개 한 연산자는 미리 정의된 정확한 의미를 갖고 있다. 반면에 어떤 프로그래밍 언어에서는 문맥을 토대로 같은 연산자가 여러 의미를 갖게 하는것이 가능하다. 두번째 경우를 잘 확인할 수 있는 것이 파이썬의 Ducktyping이다. 


 연산자의 정의를 변경하는 것은 더 가독성이 좋은 코드를 만드는데 도움을 준다. 함수에 비해서 이해가 쉽기 때문이다. 자료구조를 공부할때는

함수의 오버로딩만을 이용해서 구현했기에 연산자오버로딩에 대해서 다시 정리하고자 이 글을 썼다. 


위의 마지막 내용과 같이 원래 있는 연산자에 함수처럼 반환형식 클래스 :: operator 연산자(연산자가 받아야하는 operand)순으로 쓴다.

삼항연산자를 이용해서 연산자를 구현했기에 이해하는데 다소 시간이 걸릴 수 있으나 간단히 말해서 세 변수를 비교해서 어느 날짜가 큰지 결정하는 내용이다,

+ Recent posts