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과 같은 원시 유형의 매개변수에 대해서 그 차이는 무시해도 될 정도이므로 보통은 원본을 수정해야 할 경우에만 참조에 의한 전달을 사용한다.
'School Study > 2021-2' 카테고리의 다른 글
[week 11] C++ 복습_7장 1차원 배열과 문자열 (1) (0) | 2021.12.06 |
---|---|
[week 10] C++ 복습_6장 함수 (2) (0) | 2021.11.27 |
[week 07] C++ 복습_5장 반복문 (2) (0) | 2021.11.26 |
[week 06] C++ 복습_5장 반복문 (1) (0) | 2021.11.26 |
[week 05] C++ 복습_4장 수학함수, 문자, 문자열 (0) | 2021.10.17 |