탐구
2024.01.30 {Assert 어디에 넣을지 모르면 넌 주니어}로부터
트부
2024. 1. 30. 16:32
참고 영상
https://www.youtube.com/watch?v=6ts1Uxp_i3w
함수 시그니처
함수의 형태를 나타내는 식을 말한다.
Epsilon& Calc(Epsilon& destEpsilon, int former, int latter){
destEpsilon.Normalize();
try{
IntuitiveGraphic(destEpsilon, former, latter);
}catch(GraphicException& gexc){
return destEpsilon.Init();
}
return destEpsilon;
}
위와 같은 함수가 있을 때는 Epsilon&(Epsilon&, int, int)가 함수 시그니처이다.
Pre-condition & Post-condition
사전 조건 & 사후 조건이라고도 하는데
다음 예를 보면 쉬울 것 같다.
double MySqrt(double x){
double res = 0;
/*x가 음수가 아닌 정수여야 한다.*/
//Taylor Series
. . .
/*res가 양수여야 한다.*/
return res;
}
/**/ 주석으로 감싸진 부분이 각각 사전 조건과 사후 조건이다.
간단하게는 다음처럼 조건을 확인할 수 있다.
double MySqrt(double x){
double res = 0;
if (x < 0) abort();
//Taylor Series
. . .
if (x <= 0) abort();
return res;
}
Assert 함수
위의 예시는 조건들이 매우 간단하기 때문에 별 다른 문제가 없어 보인다.
하지만, 인간은 완벽하지 않기 때문에 조건이 많아질수록 그 조건을 하나하나 검사할 수는 없다.
이때, assert를 써주면 편하다.
debug 개발에서만 작동하고 release하면 assert 구문이 삭제된다.
이는 위처럼 간단한 예시에서도 아주 약간의 오버헤드를 줄일 때 이용할 수도 있을 것이다.
assert를 이용하면 조건문을 남발한다거나 try-catch를 쓸 필요가 없다.
#include <cassert>
double MySqrt(double x){
double res = 0;
assert(x >= 0);
//Taylor Series
. . .
assert(res >= 0);
return res;
}
assert의 매개변수로 전달된 식이 false면 오류를 내뱉는다.