수업/C++

4강 함수

MDanderson 2024. 10. 1. 17:34

 

실매개변수 : 함수호출문장에서 함수의 형식 매개변수에 전달할 인수

 

형식매개변수 : 인수를 전달받기위해 함수에 선언된 매개변수, 함수헤더에 매개변수의 자료형과 이름을 선언함

 

 

값 호출( call-by value)

실 매개변수의 값을 형식매개변수에 복사하는 방식

값 호출 방식의 장단점

장점 : 실 매개변수와 형식 매개변수는 별개의 데이터이므로 불필요한 부작용이 발생하지않음 (실 매개변수의 값이 바뀌지않음)

단점 : 구조체와 같이 많은 양의 데이터로 구성된 인수를 전달할 경우 데이터의 복사량이 많아짐

 

참조호출(call-by-reference) 

-C언어에서는 안됨 C언어에서는 포인터를 이용했었음

- 실 매개변수의 참조를 형식매개변수에 전달하는 방식

 

참조호출의 용도

- 함수에서 처리한 결과를 매개변수를 통해 받아오려는 경우

--함수에서 형식 매개변수의 값을 변경하는 것은 실 매개변수의 값을 변경하는 것과 같음

-많은 양의 데이터로 구성되는 구조체나 객체와 같은 인수를 함수에 효율적으로 전달하는 경우

--형식 매개변수에 복사되는 데이터의 양은 실 매개변수의 크기와 관계 없이 일정함

 

 

-많은 양의 데이터로 구성되는 구조체나 객체를 인수로 전달하는 경우 값 호출을 사용하는 것에 비해 참조호출을 사용하는 것이 효율적임

-함수 호출의 효율성을 위해 참조호출을 하지만 실매개변수의 값이 변경되는 것을 원하지 않는 경우에는 형식 매개변수에 const를 한정어를 지정하여 실 매개변수를 보호.

 

디폴트 인수는 인수중 맨 끝에만 위치할 수 있다.

void f (int x , int y=10 , int z=20);  //OK

 

f(5,100);// OK z=20으로 입력됨

f(5, , 300);  // 오류

f(5,10,300); // OK   중간에 있는값만 디폴트값을 써야할떄는  디폴트값을 입력을해줘야만한다.

 

 

void g(int x , int y=10 , int z);  //오류

 

 

함수의 다중정의

(c에서는 안됨 c++에서 제공)

다중정의? 

- 동일한 이름에 대하여 여러가지 의미를 부여하는 것

 

 

함수의 다중정의

-동일한 이름을 갖는 함수를 여러 개 정의하는 것

동일한 개념의 처리를 여러가지 데이터나 객체에 대해 각각의 대상에 맞는 처리를 해야할 경우 사용함

다중 정의된 함수의 구분 : 인수의 개수 및 자료형

 

함수의 반환 자료형으로는 함수를 구분할 수 없음

ex) 아래의 경우 에러

 

 

ex)g(10)의 경우 모호한 정의.   에러남.

 

ex) h(10.0)에러남. 형변환 대상이 모호함   10.0은 double형이라서 

 

 

inline함수란

  • inline int square(int x): square 함수는 inline 함수로 선언되었습니다. 컴파일러가 square(num) 호출을 num * num로 대체하도록 요청합니다.
  • 함수 호출 오버헤드 제거: square 함수가 호출될 때, 실제 함수 호출을 하지 않고, 해당 코드를 직접 삽입하여 오버헤드를 줄입니다.

inline 함수의 동작 방식

  • 컴파일러 요청: inline 키워드는 컴파일러에게 함수 호출을 대체 코드로 삽입하도록 요청하지만, 컴파일러가 반드시 이를 적용하는 것은 아닙니다.
  • 적합한 함수: inline 함수는 짧고 간단한 함수에 적합합니다. 복잡한 함수반복문, 재귀 함수는 inline 처리가 되지 않을 수 있습니다.

 

- 함수 호출 절차를 따르지않고 함수 호출위치에 함수의 처리 문장이 삽입되게 번역되도록 선언된 함수

- 함수를 사용함으로써 얻을 수 있는 모듈화의 장점을 살리면서 , 함수 호출에 따른 부수적인 처리시간이 생략됨

- 함수 호출 루틴으로부터 함수로 넘어가는 부분의 코드 최적화가 가능해짐

 

 

-매우 빈번히 호출되며 빠른 실행이 요구되는 함수를 inline함수로 선언하면 성능을 높이는데 도움이 됨

 

inline함수로 선언하더라도 반드시 inline으로 번역되는 것은 아님

inline선언을 무시하고 일반 함수로 번역하는 경우

- 함수가 너무 큰 경우

-순환호출을 하는경우

-프로그램 내에서  그 함수에 대한 포인터를 사용하는 경우