한성대학교 김설현교수님 강의내용을 바탕으로 작성함
함수
함수는 함수이름, 매개변수, 반환값유형, 함수몸체로 구성되어 있다.
함수 생성,호출
함수생성이란 해야 할 일을 정의하고, 생성한 함수를 사용하기 위해 함수를 호출해야 한다.
/* @brief : 함수 생성, i를 num1로 j는 num2로 받는다 */
int Max(int num1, int num2)
{
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
int main()
{
int i = 3;
int j = 5;
int k = Max(i, j); //함수 호출, i와 j를 전달한다
cout << "The max between " << i << " and " << j << " is " << k << endl;
system("Pause");
return 0;
}
호출 스택
함수가 호출될 때마다 스택 내에 함수의 인수와 변수를 저장하는 활성레코드를 생성한다.
함수 원형
메인함수에서 함수 호출 전에 함수 정의가 위해 있어야 하지만, 함수 원형을 정의하면 함수 정의가 호출 뒤에 있어도 된다.
int Max(int num1, int num2) //함수 생성(구현)
{
if (num1 > num2)
return num1;
else
return num2;
}
int main()
{
cout << "The max between 3 and 4 is " << Max(3, 4) << endl;
system("Pause");
return 0;
}
int max(int num1, int num2); //함수 원형(선언)
int main()
{
cout << "The max between 3 and 4 is " << Max(3, 4) << endl;
system("Pause");
return 0;
}
int Max(int num1, int num2) //함수 생성(구현)
{
if (num1 > num2)
return num1;
else
return num2;
}
둘의 결과는 같다.
함수 모듈화의 장점
1. 하면 메인 함수와 함수 생성부분이 분리되어 프로그램이해가 쉽다
2. 함수내에서 계산하는데 오류가 발생시 함수에 국한된 오류이고, 디버깅의 범위가 좁아진다.
3. 다른 프로그램에서 재사용 가능
매개변수에 인수 전달하기
매개변수가 있는 함수를 호출할 때 매개변수에 인수를 전달하는 방법은 두 가지가 있다.
- 값에 의한 전달(pass-by-value)
- 참조에 의한 전달(pass-by-reference)
값에 의한 전달(pass-by-value)
함수 내부에서 매개변수 값을 변경해도 호출한 곳의 원변수에 영향을 미치지 않는다.
void swap(int n1, int n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
}
int main()
{
int num1 = 1;
int num2 = 2;
cout << "Before swap function: " << num1 << " " << num2 << endl;
swap(num1, num2);
cout << "After swap function: " << num1 << " " << num2 << endl;
system("Pause");
return 0;
}
참조에 의한 전달(pass-by-reference)
매개변수는 원변수에 대한 별칭이 된다. 따라서 참조 변수의 값을 변경하면 원변수의 값도 변경된다.
void swap(int& n1, int& n2) //참조에 의한 전달
{
int temp = n1;
n1 = n2;
n2 = temp;
}
int main()
{
int num1 = 1;
int num2 = 2;
cout << "Before swap function: " << num1 << " " << num2 << endl;
swap(num1, num2);
cout << "After swap function: " << num1 << " " << num2 << endl;
system("Pause");
return 0;
}
void swap(int& n1, int& n2) //xor스왑이라는 꼼수도 있음 임시 변수 안써도 됨
{
n1 = n1 ^ n2;
n2 = n1 ^ n2;
n1 = n1 ^ n2;
}
인수전달 정리
값에 의한 전달은 실 매개변수와 그의 형식 매개변수가 서로 다른 독립적인 변수지만,
참조에 의한 전달은 위의 코드에서 &n1의 n1은 num1의 별명이라고 생각하면 된다. n1를 부르면 num1이 호출되므로 두 변수가 같은 변수이다.
함수 오버로딩
함수 이름은 같지만 매개변수만 다른 함수를 작성하는 것이다.
int Max(int num1, int num2)
{
cout << "(int type) ";
if (num1 > num2)
return num1;
else
return num2;
}
double Max(double num1, double num2)
{
cout << "(double type) ";
if (num1 > num2)
return num1;
else
return num2;
}
int main()
{
cout << "The max between 3 and 4 is " << Max(3, 4) << endl;
cout << "The max between 3.0 and 5.4 is " << Max(3.0, 5.4) << endl;
system("Pause");
return 0;
}
코드크기 늘리지말고 템플릿써라
인라인 함수
함수를 호출하는 것이 아니라 인라인 함수를 호출하는 지점에 함수 코드를 복사한다.
함수 호출이 해당 함수로 이동할 필요가 없어 실행속도는 증가하지만,
자주사용하거나 인라인 함수가 길면 메인함수의 길이가 길어져 성능저하의 원인이 된다.
int main()
{
int month = 10, year = 2008;
cout << "month is " << month << endl; //f(month, year)
cout << "year is " << year << endl;
cout << "month is " << 9 << endl; //f(9,2010)
cout << "year is " << 2010 << endl;
system("Pause");
return 0;
}
inline void f(int month, int year)
{
cout << "month is " << month << endl;
cout << "year is " << year << endl;
}
int main()
{
int month = 10, year = 2008;
f(month, year); //인라인 함수 호출
f(9, 2010); //인라인 함수 호출
system("Pause");
return 0;
}
위의 코드처럼 인라인f함수를 호출시 함수내의 코드를 그대로 복사한다.
'개발 > C++' 카테고리의 다른 글
10장 객체 지향 개념 (0) | 2019.02.11 |
---|---|
9장 객체와 클래스 (0) | 2019.01.19 |
8장 다차원 배열 (0) | 2019.01.16 |
7장 1차원 배열 (0) | 2019.01.15 |
5장 반복문 (0) | 2019.01.03 |
4장 수학함수 (0) | 2018.12.30 |
3장 선택문 (0) | 2018.12.29 |
2장 기본프로그래밍 (0) | 2018.12.01 |
댓글