-
2024.02.26 - 함수C++ 2024. 2. 26. 18:15
- 함수
자료형 함수명(매개변수1, 매개변수2, ...){
처리과정
return 결과값;
}함수는 입력받은 매개변수 값을 처리하여 결과값을 출력해준다.
함수를 사용하면 반복적인 프로그래밍을 피할 수 있고, 유지보수가 수월해지고 코드가 간략화 된다.
불륨이 큰 프로그램일 수록 수정 또는 유지보수가 쉽지 않기 때문에 기능별로 세분화 하는 것이 필요하다.
예시
#include<iostream> int Sum(int a, int b) { int result = a + b; return result; } int main() { int num = Sum(3, 4); std::cout << num << std::endl; }
매개변수 a, b를 받아 result를 반환하는 함수 Sum이다.
*함수의 이름과 매개변수만 선언해놓고 main함수 밑에서 기능을 쓸 수도 있다.
#include<iostream> int Sum(int a, int b); int main() { int num = Sum(3, 4); std::cout << num << std::endl; } int Sum(int a, int b) { return a + b; }
함수의 이름은 대문자로 시작하는 것이 관례이다.
- 함수의 형태
함수는 기본적으로 매개변수의 유무와 반환값의 유무에 따라 네개의 형태로 나눌 수 있다.
1. 매개변수와 반환값이 모두 있는 경우
위의 코드가 그와 같은 경우이다. Sum()함수는 int형 매개변수 a, b를 가지고, int형 반환 값을 return한다.
2. 매개변수는 있는데 반환값이 없는 경우
#include<iostream> void Print(int num) { std::cout << num << std::endl; } int main() { Print(4); }
반환값이 없기 때문에 함수의 자료형이 void이다.
3. 매개변수가 없고 반환값이 있는 경우
#include<iostream> int ReadNum() { int num; std::cin >> num; return num; } int main() { std::cout << "ReadNum()으로 반환받은 값 = " << ReadNum(); }
4. 매개변수도, 반환값도 없는 경우
#include<iostream> void PrintMe() { std::cout << "나는 반환값도 없고 매개변수도 없다. " << std::endl; } int main() { PrintMe(); }
- 함수 내부에서 다른 함수를 호출하기
ex) 절대값을 비교하는 함수 만들기
#include<iostream> //1. 절대값 구하는 함수 int GetAbsValue(int num) { if (num < 0) return num * (-1); else return num; } //2. 절대값끼리 비교하는 함수 int AbsCompare(int a, int b) { if (GetAbsValue(a) > GetAbsValue(b)) return a; else return b; } int main() { int inputNum1; int inputNum2; std::cout << "두개의 정수를 입력해라: "; std::cin >> inputNum1; std::cin >> inputNum2; int result = AbsCompare(inputNum1, inputNum2); std::cout << "절대값이 큰 수는 " << result << std::endl; }
함수는 return을 만나면 결과값을 반환하고 함수를 종료한다.
- 배열을 매개변수로 받는 함수
배열을 매개변수로 받는 것도 가능하다.
#include<iostream> //배열안의 두 숫자를 더하는 함수 int SumNumber(int number[]) { return number[0] + number[1]; } int main() { int arr[2] = { 3,7 }; std::cout << SumNumber(arr); }
- 2차원 배열을 매개변수로 받는 함수
2차원 배열을 매개변수로 받을 때는 배열의 열 크기를 넣어주어야 한다.
ex)
#include<iostream> const int RAW = 3; //배열의 각 요소의 합을 출력해주는 함수 void SumArr2(int number[][RAW], int arrCol) { int sum = 0; for (int i = 0; i < arrCol; i++) { for (int k = 0; k < RAW; k++) { sum += number[i][k]; } } std::cout << "배열 각 요소의 합 = " << sum << std::endl; } int main() { int arr[2][RAW] = { 1,2,3,4,5,6 }; SumArr2(arr, 2); }
- 배열을 결과값으로 반환하는 함수
배열을 결과값으로 반환하기는 힘들고, 배열이 저장된 메모리의 주소값을 반환하는 것은 가능하다.
주소값을 이용해 배열의 각 요소 값을 참조할 수 있다.
이를 이해하기 위해서는 포인터를 다룰 줄 알아야 할 것이다.
ex) static 배열을 만들어서 주소값을 넘기기
#include<iostream> //매개변수의 값에 2,3,4,5을 곱한 값을 요소로 저장하고 배열의 주소값을 반환하는 배열 int* GetArr(int num) { int static arr[4]; for (int i = 0; i < 4; i++) { arr[i] = num * (i + 2); } return arr; } int main() { int select; std::cout << "입력한 수: "; std::cin >> select; std::cout << "arr의 0번째 요소의 값 = " << *(GetArr(select)) << std::endl; std::cout << "arr의 1번째 요소의 값 = " << *(GetArr(select)+1) << std::endl; std::cout << "arr의 2번째 요소의 값 = " << *(GetArr(select)+2) << std::endl; std::cout << "arr의 3번째 요소의 값 = " << *(GetArr(select)+3) << std::endl; }
주소값을 더해주어 배열을 참조할 수 있다.
- 함수 오버로딩
함수 오버로딩은 동일한 함수이름을 사용해 매개변수 자료형, 갯수가 다른 함수를 정의하는 것을 말한다.
비슷한 작업을 하는 여러가지의 함수가 있을 때, 각 함수에 다른 이름을 부여하는 대신 함수 오버로딩 기능을 사용하면 좋다. 코드의 일관성을 유지시켜준다.
예시)
#include<iostream> void PrintValue(int num) { std::cout << "정수: " << num << std::endl; } void PrintValue(int a, int b) { std::cout << "정수: " << a << " " << b << std::endl; } void PrintValue(double num) { std::cout << "실수 값 : " << num << std::endl; } int main() { PrintValue(5); PrintValue(5,7); PrintValue(1.2); }
'C++' 카테고리의 다른 글
2024.02.27 - 구조체(struct) (0) 2024.02.27 2024.02.26 - 열거형 자료형(enum) (0) 2024.02.27 2024.02.23 - 실습 (0) 2024.02.24 2024.02.23 - 배열 (0) 2024.02.24 2024.02.22 - 난수 생성 (0) 2024.02.22