본문 바로가기
School Study/2021-2

[week 09] C++ 복습_6장 함수 (1)

by 전전긍긍 2021. 11. 26.

20211028_C++_공부기록

 

  • 함수 정의

함수의 정의는 함수이름, 매개변수, 반환값유형, 함수몸체로 구성되어 있다.

*반환타입과 함수타입이 같아야 한다.


  • 함수 호출
//함수 호출
#include <iostream>
using namespace std;

int max(int num1, int num2)
{
	int result;
	if (num1 > num2)
		result = num1;
	else
		result = num2;

	return result;
}
int main()
{
	int i = 5;
	int j = 2;
	int k = max(i, j); //함수 호출
	cout << "The max between " << i << " and " << j << " is " << k << endl;
	cout << "The max between " << i << " and " << j << " is " << max(i, j) << endl;
	return 0;
}

//The max between 5 and 2 is 5
//The max between 5 and 2 is 5

함수를 호출하게 되면 프로그램 제어는 호출된 함수쪽으로 넘어가 함수가 실행된다.

호출된 함수에서 return문이 실행되거나 함수의 끝에 도달했을 때 호출자에게 제어를 돌려준다.

호출 스택

함수가 호출될 때마다 시스템은 스택 내에 함수의 인수와 변수를 저장하는 활성레코드를 생성한다.

함수 내에서는 함수 내에서 정의한 변수만 선언할 수 있다.


  • 함수 원형 (prototype)

사람들이 main함수를 먼저 읽어야 코드의 구조를 알 수 있기 때문에 함수 원형을 사용

함수 원형 : 함수 헤더만 main 앞부분에 적어주고 main함수 뒤에 함수를 뒤에 적는다.

함수 원형은 type만 체크하고 넘어가기 떄문에 원형에서는 변수 이름을 적지 않아도 괜찮다.

//함수 원형
#include <iostream>
using namespace std;

int max(int num1, int num2); //함수 원형


int main()
{
	int i = 5;
	int j = 2;
	int k = max(i, j); //함수 호출
	cout << "The max between " << i << " and " << j << " is " << k << endl;
	cout << "The max between " << i << " and " << j << " is " << max(i, j) << endl;
	return 0;
}

int max(int num1, int num2)
{
	int result;
	if (num1 > num2)
		result = num1;
	else
		result = num2;

	return result;
}

  • 코드 모듈화 (함수)

- 장점 

(1) 디버깅의 범위를 좁혀준다

(2) 재사용 가능

(3) 함수와 main함수가 분리되어 프로그램을 이해하기 쉽다

//코드 모듈화(함수 만들기)
//최대공약수를 계산하는 코드
#include <iostream>
using namespace std;

int getgcd(int n1, int n2);

int main()
{
	int n1, n2;
	cout << "첫 번째 정수 입력: ";
	cin >> n1;
	cout << "두 번째 정수 입력: ";
	cin >> n2;

	cout << n1 << " 와 " << n2 << " 의 최대공약수: " << getgcd(n1, n2) << endl;
	return 0;
}

int getgcd(int n1, int n2)
{
	int gcd = 1;
	int k = 2;
	while (k <= n1 && k <= n2)
	{
		if (n1 % k == 0 && n2 % k == 0)
			gcd = k;
		k++;
	}
	return gcd;
}
/*
첫 번째 정수 입력: 125
두 번째 정수 입력: 2525
125 와 2525 의 최대공약수: 25
*/

  • 매개변수에 인수 전달하기

매개변수가 있는 함수를 호출할 때 매개변수에 인수를 전달하는 방법

- 값에 의한 전달 (pass-by-value)

- 참조에 의한 전달 (pass-by-reference)


  • 값에 의한 전달

함수 내부에서 매개변수 값을 변경해도 호출한 곳의 원변수에 전혀 영향을 미치지 않는다.

값에 의한 전달

//값에 의한 전달
#include <iostream>
using namespace std;

void swqp(int n1, int n2); //함수 원형

int main()
{
	int num1 = 1;
	int num2 = 2;
	cout << "Before swap function: " << num1 << " " << num2 << endl; //1,2
	swqp(num1, num2); 
	cout << "After swap function: " << num1 << " " << num2 << endl; //1,2
	return 0;
}

void swqp(int n1, int n2)
{
	int temp = n1;
	n1 = n2;
	n2 = temp;
}
//복사본만 바꾸고 원본은 바꾸지 않았기 때문에 After도 그대로이다.

  • 참조에 의한 전달

참조 변수 

원 변수에 대한 별칭

변수의 앞 또는 변수의 데이터 유형 뒤에 앰퍼샌드(&)를 붙인다.

//참조변수
int count = 1;
int &r = count; //참조변수는 선언과 동시에 초기화 필요

원 변수를 참조하기 위해 참조 변수를 함수의 매개변수로 사용할 수 있으며, 참조 변수를 통해 변수에 저장된 원 데이터에 접근하거나 수정이 가능하다.

참조에 의한 전달

//참조에 의한 전달
#include <iostream>
using namespace std;

void swqp(int& n1, int& n2); //참조변수, 함수 원형

int main()
{
	int num1 = 1;
	int num2 = 2;
	cout << "Before swap function: " << num1 << " " << num2 << endl; //1,2
	swqp(num1, num2); //호출할 때 변수를 그냥 넘기는 것에 유의!
	cout << "After swap function: " << num1 << " " << num2 << endl; //2,1
	return 0;
}

void swqp(int& n1, int& n2) //참조변수
{
	int temp = n1;
	n1 = n2;
	n2 = temp;
}

  • 상수 참조 매개변수

원본에 접근은 할 수 있지만, 변경은 불가능해 (편집은 가능하지만, 적용은 불가능)

굳이 쓰는 이유는? 원본에 접근을 하지 않으면 복사본을 만드는데, 사이즈가 크다면 용량을 많이 차지한다.

그래서 복사본을 만들지 않고 원본을 직접적으로 건드는 것.

//상수 참조 매개변수
int max(const int& num1, const int& num2)
{
	int result;
    if (num1 > num2)
    	result = num1;
    else
    	result = num2;
    return result;
}

  • 값에 의한 전달 VS 참조에 의한 전달

- 값에 의한 전달에서는 실 매개변수와 그의 형식 매개변수가 서로 다른 독립적인 변수이다.

- 참조에 의한 전달에서는 실 매개변수와 그의 형식 매개변수는 같은 변수이다.

- 객체들은 많은 메모리를 차지할 수 있기 때문에 문자열 같은 객체 유형에 대해서는 참조에 의한 전달이 값에 의한 전달보다 더 효과적이다.

- 그러나 int, double과 같은 원시 유형의 매개변수에 대해서 그 차이는 무시해도 될 정도이므로 보통은 원본을 수정해야 할 경우에만 참조에 의한 전달을 사용한다.