본문 바로가기

프로그래밍/C ++

[C++] 함수

함수의 형식

ReturnType functionName(fParameterList) // 머리부
{ // 몸체 블록
	Type1 localVar1; // 지역변수 선언
	Type2 localVar2;
	······
	statement1; // 처리할 작업을 수행하는 문장
	statement2;
	······
	return returnExpression; // 결괏값을 반환함
}

 

ex] n개의 데이터가 들어있는 정수형 배열에서 최댓값을 구하는 함수

#include <iostream>
using namespace std;

// 배열에서 최대값을 찾는 함수
int findMax(int arr[], int n) {
    int max = arr[0];
    for (int i = 1; i < n; i++) {
        if (max < arr[i]) max = arr[i];
    }
    return max;
}

int main() {
    int arr[] = {3, 5, 2, 8, 6};
    int n = sizeof(arr) / sizeof(arr[0]); // 배열 크기 계산
    cout << "Maximum value: " << findMax(arr, n) << endl;
    return 0;
}

 

return 명령

  • 함수를 마치고 함수를 호출한 곳으로 복귀
  • 함수 안의 어느 곳이든 복귀를 위해 사용 가능
  • returnExpression은 함수 머리부에 선언한 ReturnType과 일치하는 자료형의 수식 또는 묵시적 형 변환이 가능한 자료형의 수식을 사용함
  • 반환하는 값이 없는 함수의 ReturnType은 void로 선언
  • main 함수에서는 return 명령을 만나지 않은 상태로 함수의 끝에 도달하면 ‘return 0;’을 실행한 것과 같다.

함수의 원형

프로그래밍을 하다보면 순서에 맞춰 함수를 배치하는 것이 어렵거나 가능하지 않을 수도 있다.
main()함수를 앞으로 옮기면 함수를 호출하는 명령이 함수를 정의하는 문장들의 앞에 위치해 오류가 발생한다.
이런 경우 함수를 완전히 정의하는 대신 함수의 원형(prototype)을 프로그램의 앞부분에 선언한다.
float FahrToC(float fahr); // 함수의 원형
int main(){
	float fTemp, cTemp;
	cout << "화씨온도 : ";
	cin >> fTemp;
	cTemp = FahrToC(fTemp); // 함수 호출
	cout << "---> 섭씨온도 : " << cTemp << endl;
	return 0;
}

float FahrToC(float fahr){
return (fahr - 32) * 5 / 9;
}

 
순환 호출

함수를 정의하는 몸체블록 안에서 직접 또는 간접적으로 그 함수를 호출하도록 코드 작성
ex) 팩토리얼 계산 함수의 순환 호출 구현

 
👉 이렇게 호출과 복귀 과정에서 처리 시간이 추가된다.
매우 효율적으로 동작해야 하는 함수라면 inline 함수로 선언한다.
 

인수(argument)

실 매개변수 형식 매개변수
함수 호출 문장에서 함수의 형식 매개변수에 전달할 인수 - 인수를 전달받기 위해 함수에 선언된 매개변수함수
- 함수 헤더에 매개변수의 자료형과 이름 선언
cTemp = FahrToC(fTemp); float FahrToC(float fahr){
    return (fahr - 32) * 5 / 9;
}
  형식 매개변수 값을 변경해도 실 매개변수는 변함 없음

 
값 호출 (call-by-value)
실 매개변수의 값을 형식 매개변수에 복사하는 방식

  • 장점 : 실 매개변수와 형식 매개변수는 별개의 데이터이므로 불필요한 부작용 발생하지 않음
  • 단점 : 구조체와 같이 많은 양의 데이터로 구성된 이수를 전달할 경우 데이터 복사량이 많아짐.

참조호출(call-by-reference)
실 매개변수의 참조(주소)를 형식 매개변수에 전달하는 방식

  • 용도:
    • 함수에서 형식 매개변수의 값을 변경하는 것은 실 매개변수의 값을 변경하는 것과 같음
    • 형식 매개변수에 복사되는 데이터 양은 실 매개변수의 크기와 관계없이 일정
  • 실 매개변수의 값이 변경되는 것을 원하지 않는 경우에는 형식 매개변수에 const 한정어를 지정하여 실 매개변수를 보호한다.
#include <iostream>
using namespace std;

void SwapValues(int &x, int &y); // 원형

int main(){
    int a, b;
    
    cout << "두 수를 입력하시오 : ";
    cin >> a >> b;
    if (a < b) SwapValues(a, b); // 순서를 바꿔 a에 큰 값을 넣음
    cout << "큰 수 = " << a << " 작은 수 = " << b << endl;
    return 0;   
}
void SwapValues(int& x, int& y){
    int temp = x;
    x = y;
    y = temp;
}

 

디폴트 인수

  • 인수의 디폴트 값을 지정하는 방법 : 일반적으로 사용되는 디폴트값이 있는 인수의 경우 함수를 정의할 때 그 값을 미리 지정할 수 있다.
  • 디폴트 인수는 인수 중 끝에만 위치할 수 있음

 

istream& getline(char* str, int count, char delimiter='\n');

char str1[10], str2[10];
cin.getline(str1, 10, '.'); // ','가 나올 때까지 최대 9자 입력
cin.getline(str2, 10);     //cin.getline(str, 10, '\n')과 동일

다중정의(Overloading)

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

다중정의된 함수의 구분: 인수의 개수 및 자료형
함수의 반환 자료형으로 함수를 구분할 수 없음

Inline함수?

함수 호출 절차를 따르지 않고 함수 호출 위치에 함수의 처리 문장이 삽입되게 번역하도록 선언된 함수
모듈화의 장점 살리면서, 함수 호출에 따른 부수적인 처리시간이 생략됨
코드 최적화 가능
👉🏻매우 빈번히 호출되며 빠른 실행이 요구되는 함수를 inline 함수로 선언하면 성능을 높이는 데 도움이 된다.
But inline선언 무시하고 일반 함수로 번역하는 경우

  • 함수가 너무 큰 경우
  • 순환 호출
  • 프로그램 내에서 그 함수에 대한 포인터 사용시




반응형

'프로그래밍 > C ++' 카테고리의 다른 글

[C++]생성자  (2) 2024.12.04
[C++] 객체 (object)  (0) 2024.12.04
[C++] 자료형 (묵시적형변환)  (0) 2024.12.03
[c++] C++ 변수의 특징  (0) 2024.07.08
[C++] iosteam 표준 입출력  (0) 2024.07.08