탐구

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면 오류를 내뱉는다.