본문 바로가기
언어/C++

[C++ 기본 공부정리] 11-5. 다양한 함수 사용법(default parameter, inline function)

by 민-Zero 2019. 12. 20.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

1. 디폴트 매개변수(default parameter)

디폴트 매개변수란 함수를 선언및 정의 할때 사용자가 미리 기본값을 지정한 매개변수 이다. 함수 호출시 인수로 아무런 값을 넘겨주지 않으면 설정한 기본값으로 함수가 동작하며 인수를 넘겨줄 경우 기본값 대신 인수로 넘겨준 값으로 동작한다. 즉, 디폴트 매개변수가 설정된 함수는 사용자가 무시할 수도 사용할 수도 있다.

 

디폴트 매개변수를 설정하는 것에 몇가지 규칙이 있다.

1) 함수의 원형에서만 설정 가능하다.

2) 매개변수가 여러개일 경우 맨 오른쪽에서 부터 순서대로 선언 하고 반드시 모든 매개변수에 설정할 필요는 없다.

3) 2)로 인해 가운대 매개변수만 설정하거나 맨앞 매개변수만 설정하는등의 경우는 에러를 발생시킨다.

 

디폴트 매개변수가 사용된 함수의 호출에 대해 확인하자.

 

int, double, char, string 타입의 매개변수를 가진 PrintVal 함수에 대해 기본값이 설정된 매개변수에 다른 값을 인수로 전달해 주면 설정된 값이 아니라 전달해준 값을 이용하는 것을 확인할 수 있고, 기본값이 설정 되어 있다면 아무런 인수를 전달하지 않아도 에러를 발생시키지 않는것을 확인할 수 있다.

 

초기값을 지정하지 않고 인수를 전달하지 않을 경우 에러를 발생 시키며, 초기값이 있더라도 중간에 인수전달을 건너뛰게되면 에러를 발생시킨다.

 

또한 디폴트 매개변수는 오직 한번만 선언할 수 있다.

 

이처럼 함수의 원형만 먼저 선언해두고 나중에 함수를 정의 하는 경우 전혀 이상이 없어 보이지만 에러를 발생시킨다. 이유는 함수의 선언에서 디폴트 매개변수가 이미 설정 되었는대 정의에서 한번더 디폴트 매개변수를 또 설정하기 때문이다. 따라서 함수의 원형이나 함수 정의 둘중 하나만 정해 디폴트 매개변수를 사용해야 한다.

 

2. 인라인 함수(inline function)

인라인 함수는 함수 호출시 발생하는 일정량의 성능 오버헤드(overhead)가 발생하는 단점을 극복하기 위해 제시된 하나의 길이다.

(오버헤드에 대해 간단한 예를 들면, 만약 A라는 과정이 동작하는대 10초가 소요된다고 하자 이때 A의 안정화 등의 목적으로 B과정을 추가하였더니 15초가 소요되었다. 그럼 이때 오버헤드는 5초가 된다.)

 

일반적으로 함수가 호출될때 마다 일련의 과정이 진행된다.

① 스택 영역에 함수로 전달할 매개변수와 함수 종료시 호출한 곳으로 돌아가기 위한 주소값을 저장한다.

② 함수를 실행하며 함수내 지역 변수도 스택에 저장후 기능을 수행하고 반환값이 있다면 반환하게 된다.

③ 반환하고 나면 함수가 종료되었으므로 돌아갈 주소값으로 이동하고 호출 될때 사용한 정보들을 제거한다. 

 

이런 복잡한 과정이 진행되므로 함수 호출에 약간의 시간이 걸리게 된다. 만약 함수의 실행과정이 크고 복잡하여 시간이 꽤 걸릴경우 함수 호출에 관한 오버헤드와 비교하였을때 전혀 중요하지 않지만 일반적으로 사용하는 함수의 실행 과정이 작고 간단하여 시간이 얼마 걸리지 않는 다면 함수 호출에 걸리는 시간이 함수 실행 시간보다 더 많이 걸려 성능 저하가 발생할 수 있다.

 

이런 경우 단점을 극복하기 위해 인라인 함수(inline function)라는 것을 제공한다. 

inline 키워드를 함수앞에 붙여 사용한다. 인라인 함수로 선언된 함수는 컴파일시 함수 호출 과정이 이루어 지지 않고 함수 호출 위치에 함수 자체 모든내용이 복사되어 자리잡아 수행된다. 따라서 함수 호출시 발생하는 시간은 없앨수 있으나 함수 호출과정 으로 발생되는 이점을 포기하며 컴파일된 코드가 원본보다 커질수가 있다.

 

인라인 함수 사용예)

합과 차를 반환하는 아주 간단한 함수의 경우 함수 호출에 관한 오버헤드가 2번이나 발생하므로 그냥 선언하기 보다는

 

inline 키워드를 통해 호출에 관한 오버헤드를 줄이는 것이 좋다.

 

inline은 코드가 커질수 있으므로 함수 내부 루프가 짧은 함수에 사용하는 것이 좋으며 권장 사항이지 반드시 사용해야하는 기능은 아니다. 컴파일러 자체에서 코드가 긴 함수에 대한 inline 요청을 자동적으로 무시하기도 하고 짧은 함수의 경우 알아서 inline화 하기도 한다. 그러니까 inline 키워드가 무엇인지 알아두기만 하자.

 

댓글