5~6 : 함수와 활용
typeName functionName(parameterList){
statement(s);
return value;
}
void functionname(parameterList){
statement(s);
return; // 생략될 수 있음. (종종 생략되곤함)
}
으로 나뉩니다.
여기서 리턴값이란, 자신을 호출한 함수에게 되돌려 주는것
#include <iostream>
using namespace std;
const float PIE = 3.14;
// 함수의 원형 미리 정의
void cheers(int n);
float circle(int x);
int main(){
int a;
cout << "하나의 수를 입력하십시오." << endl;
cin >> a;
cheers(a);
int b;
cout << "원의 반지름 길이를 입력하세요." << endl;
cin >> b;
float c = circle(b);
cout << "원의 넓이는" << c << "입니다." << endl;
}
// 함수를 정의한 부분
// cheers 라는 부분은, void로 선언. return 없음.(생략)
void cheers(int n){
for (int i = 0; i < n; i++)
{
cout << "cheers" << endl;
}
}
float circle(int x){
return x * x * PIE;
}
사용자의 필요에따라 갯수를 지정할 수 있음.
파라미터 1개
// 1
#include <iostream>
using namespace std;
void helloCPP(int);
int main(){
int times;
cout << "정수를 입력하십시오.\n";
cin >> times;
helloCPP(times);
return 0;
}
// 함수정의
void helloCPP(int n){
for(int i=0;i<n;i++)
cout << "HELLO, C++\n";
}
매개변수 2개
// 2
#include <iostream>
using namespace std;
// 파라미터
void helloCPP(int,int);
int main(){
int times1, times2;
cout << "정수를 입력하십시오.\n";
cin >> times1;
cout << "한번 더 정수 입력"<< endl;
cin >> times2;
// 함수 값 전달
helloCPP(times1,times2);
return 0;
}
// 함수정의, 전달인자 argument
void helloCPP(int n,int m){
for(int i=0;i<n;i++)
cout << "HELLO, ";
for(int i=0;i<m;i++)
cout << " C++";
}
//수정 전
#include <iostream>
using namespace std;
const int SIZE = 8;
//위에 이렇게 해줘야 아래 사용가능.
int sumArr(int[],int);
//배열의 요소 모두 출력
int main(){
// arr은 배열이 아니라 포인터임.
int arr[SIZE]={1,2,4,6,7,8,772,992};
// arr == &arr[0]
int sum = sumArr(arr,SIZE);
cout << "함수의 총합은 "<< sum << endl;
return 0;
}
// c++에서 배열 이름을 그 배열의 첫번째 원소의 주소로 인식함.
// 즉 sumArr은 주소를 전달받게 되는것임.
int sumArr(int arr[],int n){
int total=0;
for (int i = 0; i < n; i++){
total+=arr[i];
}
return total;
}
// 수정 후
#include <iostream>
using namespace std;
const int SIZE = 8;
//위에 이렇게 해줘야 아래 사용가능.
int sumArr(int*,int);
//배열의 요소 모두 출력
int main(){
// arr은 배열이 아니라 포인터임.
int arr[SIZE]={1,2,4,6,7,8,772,992};
// arr == &arr[0]
int sum = sumArr(arr,SIZE);
cout << "함수의 총합은 "<< sum << endl;
return 0;
}
// c++에서 배열 이름을 그 배열의 첫번째 원소의 주소로 인식함.
// 즉 sumArr은 주소를 전달받게 되는것임.
int sumArr(int* arr,int n){
int total=0;
for (int i = 0; i < n; i++){
total+=arr[i];
}
return total;
}
#include <iostream>
using namespace std;
const int SIZE = 8;
//위에 이렇게 해줘야 아래 사용가능.
int sumArr(int*,int*);
//배열의 요소 모두 출력
int main(){
// arr은 배열이 아니라 포인터임.
int arr[SIZE]={1,2,4,6,7,8,772,992};
// arr == &arr[0]
int sum = sumArr(arr,arr+SIZE);
cout << "함수의" << SIZE << "까지의 합은 "<< sum << "입니다\n";
sum=sumArr(arr,arr+3);
cout<< "함수의 " <<"세 번째 인덱스 까지의 합은 " << sum << endl;
return 0;
}
// 파라미터에 배열의 시작 주소, 배열의 사이즈 || 배열의 끝
int sumArr(int* begin,int* end){
int total=0;
int* pt;
for (pt = begin; pt != end;pt++){
total+= *pt;
}
return total;
}
#include <iostream>
using namespace std;
struct Time{
int h;
int min;
};
// 함수의 원형제공
const int minPerHr = 60;
Time sum(Time*, Time*);
void showTime(Time t1);
int main(){
// 함수는 원본이 아닌 복사본을 대상으로 작업합니다.
// 구조체를 값으로 전달할 때는 단점이 있음. -> 메모리 용량이 커져서 낭비 심함. -> 그래서 포인터 사용하게 됨.
Time day1 = {5,45};
Time day2 = {4,55};
Time total = sum(&day1, &day2);
cout << "이틀간 소요 시간 : ";
showTime(total);
return 0;
}
// 구조체 + 구조체 = 구조체 구현
Time sum(Time* t1, Time* t2){
Time total;
// 구조체가 아니라 구조체에 대한 포인터가 매개변수임으로, " . " 사용해서는 절대 안됨.
// 구조체의 주소에 대하여서 그 멤버에 접근하고 싶을 때에는 무조건 간접 멤버연산자인 " -> " 을 사용해줘야합니다.
// 즉, " . " : 구조체의 값에서 멤버접근
// " -> " : 구조체의 주소에서 멤버 접근
total.min = (t1->min + t2->min)% minPerHr;
total.h = t1 -> h + t2 -> h +
(t1->min + t2->min)/minPerHr;
return total;
}
// 구조체의 값을 매개변수로 받음.
void showTime(Time t1){
cout << t1.h << "시간 ," << t1.min << "분 입니다." << endl;
}
예시,
#include <iostream>
using namespace std;
int main(){
void recurs(argumentList){
//code #1
if (condition)
recurs(argumentList);
//code #2
}
return 0;
}
#include <iostream>
using namespace std;
void countDown(int n);
int main(){
countDown(5);
return 0;
}
void countDown(int n){
cout << "Counting..." << n << endl;
if ( n > 0 )
countDown(n-1);
cout << n << "번째 재귀함수" << endl;
}
#include <iostream>
using namespace std;
int func(int);
int main(){
int (*pf)(int);
// 이 포인터에게 함수의 주소를 저장
pf = func; // 이제 이 pf는 함수를 지시하게됨 , 이제 pf가 함수이름과 같은 역할을 수행하게됨.
cout << (*pf)(3) <<endl;
return 0;
}
int func(int n){
return n+1;
}
#include <iostream>
using namespace std;
// 함수의 원형 앞에 inline 함수를 붙여서 사용함
inline float square(float x){ return x*x; };
int main(){
//인라인 함수
int a=5;
cout << "한 변의 길이가 "<< a<<"인 정사각형의 넓이는?" << endl;
float b = square(a);
cout << b << endl;
return 0;
}
#include <iostream>
using namespace std;
const int SIZE = 8;
int sumArr(int*,int n=1);
// 디폴트 매개변수
int main(){
int arr[SIZE]={1,2,4,6,7,8,772,992};
int sum = sumArr(arr);
cout << "함수의 총합은 "<< sum << endl;
return 0;
}
int sumArr(int* arr,int n){
int total=0;
for (int i = 0; i < n; i++){
total+=arr[i];
}
return total;
}
int n=1
이라는 값이 sumArr의 int n에 1이 전달되어 동작함.int a;
int &b = a;
int a
에 대한 참조변수를 사용하고자 한다면, 참조연산자 &
를 사용 + 참조 변수로 사용할 변수명 쓰면 됨.#include <iostream>
using namespace std;
void swap(int,int);
int main(){
int wallet1 = 100;
int wallet2 = 200;
cout << "최초 상태 " << endl;
cout << "wallet1 = " << wallet1 <<", wallet2= "<< wallet2 <<endl;
cout << "참조를 이용한 값의 교환\n";
swapA(wallet1,wallet2);
cout << "참조 교환 이후 상태\n";
cout << "wallet1 = " <<wallet1 << ",wallet2" << wallet2 <<endl;
cout << "포인터를 이용한 값의 교환\n";
swapB(&wallet1,&wallet2);
cout << "포인터 교환 이후 상태\n";
cout << "wallet1 = " <<wallet1 << ",wallet2" << wallet2 <<endl;
cout << "값를 이용한 값의 교환\n";
swapC(wallet1,wallet2);
cout << "값 교환 이후 상태\n";
cout << "wallet1 = " <<wallet1 << ",wallet2" << wallet2 <<endl;
return 0;
}
// 매개변수 3가지 경우,
// 참조로 전달하는 방식
void swapA(int& a, int& b){
int temp;
temp =a;
a=b;
b=temp;
}
// 포인터로 전달하는 방식
void swapB(int* a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
// 값으로 전달하는 방식
void swapC(int a, int b){
int temp;
temp =a;
a=b;
b=temp;
}
#include <iostream>
using namespace std;
int sum(int, int);
float sum (float,float);
int main(){
cout << "두 정수를 입력하세요.\n";
int a,b;
cin >> a >> b;
cout << "두 정수의 합은" << sum(a,b) << "입니다." << endl;
cout << "두 실수를 입력하세요." << endl;
float c,d;
cin >> c >> d;
cout << "두 실수의 합은 " << sum(c,d) << "입니다" << endl;
return 0;
}
int sum (int a, int b){
return a+b;
}
float sum(float a, float b){
return a+b;
}
// 예시 1
// 참고로 당연하게도 맨 앞은 리턴형임.
int sum(int, int);
float sum (int, int););
template <class
원하는이름>
// class 혹은 typeName 사용
// 수정 전
#include <iostream>
using namespace std;
template <class Any>
Any sum(Any, Any);
int main(){
int a = 3;
int b = 4;
cout << sum (a,b) << endl;
float c = 3.14;
float d = 1.592;
cout << sum(c,d) << endl;
//cout << sum(a,c) << endl;
return 0;
}
template <class Any>
Any sum(Any a, Any b){
return a+b;
}
// 수정 후
// 매개변수 int float 두개 다 받게됨.
#include <iostream>
using namespace std;
template <class T>
T sum(int , T);
int main(){
int a = 3;
float c = 3.14;
cout << sum(a,c) << endl;
return 0;
}
template <class T>
T sum(int a, T b){
return a+b;
}
템플릿 + 오버로딩
#include <iostream>
using namespace std;
template <class Any>
Any sum(Any , Any);
template <class Any>
Any sum(int , Any);
int main(){
int a = 3;
int b =4;
// cout << sum(a,b) << endl; //첫 번째와 두 번째 sum 둘다 매칭되기 때문에 사용할 수 없음
float c =3.14;
float d= 1.1231;
cout << sum (c,d)<< endl;
cout << sum(a,c) << endl;
return 0;
}
template <class Any>
Any sum(Any a, Any b){
return a+b;
}
template <class Any>
Any sum(int a, Any b){
return a+b;
}