1. 다중 정의 (Overload)
이름은 같지만 매개변수가 다르며, 같은 유효 범위 내에 있는 함수를 다중정의(overload)했다고 함.
void print(const char* cp);
void print(int* arr, int size); // (1)
void print(const int* arr, const int size); // (1)을 재선언
다중 정의한 함수는 반드시 매개변수 수나 타입이 달라야 함. 또한, 두 함수에서 반환 타입만 다르다면 오류임.
매개변수에 const만 새로 선언되고 나머지는 이전에 정의된 함수의 매개변수와 같으면 함수를 재선언함. 상위 const는 함수에 전달할 수 있는 객체에 아무런 영향을 미치지 않기 때문. 단, 매개변수에 const가 선언되어 있는데 새로 선언할 때 const가 없는 경우는 오류.
다중 정의를 사용해 공통 연산에 대한 이름을 고안하는 것을 피할 수 있을지라도, 실제로 비슷한 일을 하는 연산에 대해서만 다중 정의해야함. 실제로 프로그래밍을 하다보면 overloading 하는 것 보다 다른 이름으로 정의해 함수를 사용하는 것이 가독성 면에서 좋은 경우가 꽤 있음.
2. 함수의 전문적 용도를 위한 기능
기본 인자
공통 값을 함수에 대한 기본 인자로 선언할 수 있음. 기본 인자를 사용하는 함수는 그 인자를 사용하거나 사용하지 않고 호출할 수 있음.
호출에서 인자는 위치로 해석함. 후행 인자만 생략할 수 있음.
void printArr(int* arr, int size = 10, int start = 0); // int형 배열을 출력하는 함수
printArr(intArr); // ==printArr(intArr,10,0);
printArr(intArr,20); // ==printArr(intArr,20,0);
printArr(intArr, ,5); // 오류: 후행 인자만 생략 가능
기본 값을 사용하지 않을 것 같은 매개변수는 매개변수 목록 앞쪽에, 기본 값을 사용할 것 같은 것은 뒤에 두도록 순서를 지정하는 것이 기본 인자를 사용하는 함수 설계의 일부분임.
이미 선언한 기본 값은 재정의로 바꿀 수 없음. 하지만 기본 인자가 적용되지 않은 매개변수에 대한 추가는 가능함.
인라인(inline) 및 constexpr 함수
함수를 사용하면 동일한 행동을 보장하고, 유지보수적인 측면이나 코드의 가독성 면에서 좋다는 장점이 있으나, 함수 호출은 동일한 표현식을 평가하는 것 보다 느리다는 단점이 있음. 대부분의 시스템에서 함수를 호출 할 때 레지스터를 저장하고 반환한 후 복원하며, 인자를 복사하고 프로그램을 새로운 위치로 분기하기 때문임.
inline 함수
inline으로 정의한 함수는 호출한 각 위치에 함수의 내용을 정렬해 확장함.
일반적으로 inline 메커니즘에서 의도한 것은 자주 호출되는 작고 직선적인 함수에 대한 최적화.
inline void printArr( … );
inline 지정은 컴파일러에 대한 요청이지, 컴파일러에서 무조건 따르지는 않음. 일반적으로 재귀함수는 인라인하지 않으며 몇 십줄 짜리 코드를 가진 함수도 거의 확실히 인라인하지 않음.
__inline과 inline은 같으나, __forceinline을 통해 inline을 컴파일러에게 강제할 수 있음. 하지만 이 때는 프로그래머의 판단에 의존하게 되어 잘못 사용했을 때 성능을 오히려 저하시키거나 큰 효과를 보지 못할 수 있으니 주의해서 사용해야 함.
constexpr 함수
상수 표현식에 사용할 수 있는 함수.
return 타입과 각 매개변수 타입이 상수 타입이어야 하며 함수 본체에는 return 문이 정확히 하나만 있어야 함.
컴파일러에서는 constexpr 함수에 대한 호출을 해당 호출 결과값으로 바꿀 수 있을 때 그렇게 하며, 또한 그 함수를 즉시 확장할 수 있도록 constexpr 함수는 암시적으로 inline 함수임.
일반적으로 inline, constexpr 함수는 헤더에 정의함. inline과 constexpr 함수는 프로그램에서 여러 번 정의할 수 있으므로 컴파일러에서는 선언이 아닌 정의가 필요하고, 해당 inline과 constexpr 정의는 모두 정확히 일치해야 하기 때문.
3. 오류 수정 지원 도구
응용 프로그램 개발을 완료하고 출시할 준비가 되면 오류 수정용 코드를 해제해 작동하지 않도록 하는데, assert와 NDEBUG를 사용
Assert 전처리기 매크로
assert는 전처리기 매크로. 조건으로 사용하는 표현식을 하나 취함. 흔히 일어날 수 없는 조건을 확인하는데 사용.
표현식을 평가해 표현식이 거짓이면 메시지를 출력하고 프로그램을 종료.
assert 매크로는 cassert 헤더에서 정의함. 그러므로 사용하려면 cassert 헤더를 포함해야 함.
NDEBUG 전처리기 변수
assert는 NDEBUG라는 전처리기 변수 상태에 따라 행동이 달라짐. NDEBUG를 정의하면 assert에서는 아무것도 하지 않음.
#define으로 정의해 사용
#include <iostream>
#define NDEBUG
#include <cassert>
using namespace std;
int main(void) {
assert(0);
cout << "PUBLIC MODE" << endl;
return 0;
}
[NDEBUG 매크로 상수를 정의했을 때]
[NDEBUG 매크로 상수를 정의하지 않았을 때]
'Programming > Programming' 카테고리의 다른 글
[C++] 스택을 활용한 수식 계산기 (0) | 2018.12.23 |
---|---|
[C++] 사용자 정의 Vector 클래스 디자인 (0) | 2018.12.23 |
[C++] Try 구역과 예외 처리 (0) | 2018.01.15 |
[C++] 문자열 & 벡터 (0) | 2018.01.13 |
[C++] 변수와 기본 타입 (0) | 2018.01.11 |