반응형
본 게시물은 개인 공부용 포스트 입니다.
함수 정의, 호출
함수란?
특정 작업을 수행하는 프로그램 문장들을 하나의 단위로 모아 놓고 이름을 부여한 것
- 함수에 정의된 처리가 필요한 부분에서 호출하여 사용한다.
- 매개변수를 통해 함수에서 처리할 데이터(인수)를 전달할 수 있음
- 호출된 함수로 이동하여 몸체 블록을 실행하고 결과값을 반환할 수 있음
- 함수의 실행을 완료하면 호출한 곳으로 복귀
C++ 프로그램은 함수를 기본 단이로 하여 구성된다.
함수 정의 형식
ReturnType functionName(ParameterList){
Type1 localVar1; // 지역변수 선언
...
statement1; // 처리할 작업을 수행
...
return returnExpression; // 결과값을 반환
}
return
- 함수를 마치고 함수를 호출한 곳으로 복귀하는 명령이다.
- 함수 안의 어느 곳이든 복귀를 위해 사용할 수 있음
- returnExpression은 함수 머리부에서 선언한 returnType과 일치하는 자료형의 수식 또는 묵시적 형 변환이 가능한 자료형의 수식을 사용해야 함
- 반환하는 값이 없는 함수의 ReturnType은 void로 선언
- main함수에서는 return명령을 만나지 않은 상태로 함수의 끝에 도달하면 'return 0;'을 실행하는 것과 같다.
함수 호출 형식
functionName(aParameterList); //형식 1. 반환값 유무에 관계없이 사용 가능 (일반적으로 void함수에 사용)
varName = fuctionNAme(aParameterList); //형식 2. returnType이 void가 아닌 함수에 사용할 수 있음
함수 사용 예
#include <iostream>
usion namespace std;
float FahrToC(float fahr){ //함수선언
return (fahr - 32) * 5 / 9;
}
int main(){
float fTemp, cTemp;
cin >> fTemp;
cTemp = FahrToC(fTemp); //함수호출
cout << "---> 섭씨온도 : " << cTemp << endl;
return 0;
}
FahrToc함수보다 main함수가 더 앞에 있게 되면 에러가 발생한다. (함수를 호출하기 위해 함수가 먼저 선언되어 있어야 함)
함수 순환 호출이란?
함수를 정의하는 몸체블록 안에서 직접 또는 간접적으로 그 함수를 호출하도록 코드를 작성하는 것.
순환 호출 예
int factorial(int n){
if(n <= 1)
return 1;
else
return n * factorial(n - 1);
}
factorial 함수 안에서 n이 1보다 클 때, 계속해서 factorial 함수를 호출하게 된다.
함수의 장점
- 크고 복잡한 프로그램을 작은 크기의 의미 있는 작업 단위로 분할하여 구성할 수 있음 (간결하고 이해하기 쉬운 프로그램으로)
- 반복 사용되는 코드의 중복 방지
- 잘 설계된 함수는 다른 응용에서 재사용 가능
함수의 단점
- 함수 호출과 복귀 과정에서 처리 시간이 추가됨 (매우 효율적으로 동작해야 하는 함수라면 inline 함수로 선언)
인수 전달
인수란?
함수 호출 문장에서 함수에 전달하는 식(expression) (여러 개의 인수가 있을 경우 컴마(,)로 구분하여 나열)
매개변수를 통해 인수를 전달한다.
- 실 매개변수 : 함수 호출 문장에서 함수의 형식 매개변수에 전달할 인수
- 형식 매개변수 : 인수를 전달받기 위해 함수에 선언된 매개변수 (함수 헤더에 매개변수의 자료형과 이름을 선언)
int main(){
...
cTemp = FahrToC(fTemp); //실 매개변수
}
float FahrToc(float fahr){ //형식 매개변수
return (fahr - 32) * 5 / 9;
}
값 호출이란?
실 매개변수의 값을 형식 매개변수에 복사하는 방식
float FahrToc(float fahr){ //값 복사
fahr -= 32; //형식 매개변수 수정 (복사본)
return fahr * 5 / 9;
}
int main(){
float fTemp, cTemp;
cout << "화씨온도 : ";
cin >> fTemp;
cTemp = FahrToc(fTemp); // 원본은 변화 없음
cout << "---> 섭씨온도 : " << cTemp << endl;
return 0;
}
값 호출 장점
- 실 매개변수와 형식 매개변수는 별개의 데이터이므로 불필요한 부작용이 발생하지 않는다.
값 호출 단점
- 구조체와 같이 많은 양의 데이터로 구성된 인수를 전달할 경우 데이터의 복사량이 많아진다.
참조 호출이란?
실 매개변수의 참조를 형식 매개변수에 전달하는 방식
참조 호출의 용도
- 함수에서 처리한 결과를 매개변수를 통해 받아 오려는 경우 (함수에서 형식 매개변수의 값을 변경하는 것은 실 매개변수의 값을 변경하는 것과 같다)
- 많은 양의 데이터로 구성되는 구조체나 객체와 같은 인수를 함수에 효율적으로 전달하는 경우 (형식 매개변수에 복사되는 데이터의 양은 실 매개변수의 크기와 관계 없이 일정함)
참조 호출 예
#include <iostream>
using namespace std;
vid SwapValues(int& x, int& y){
int temp = x;
x = y;
y = temp;
}
int main(){
int a, b;
cout << "두 수를 입력하시오 : ";
cin >> a >> b;
if(a < b) SwapValues(a, b); // 순서를 바꿔 a에 큰 값을 넣음
cout << "큰 수 = " << a << "작은 수 = " << b << endl;
return 0;
}
inline 함수
inline 함수란?
함수 호출 절차를 따르지 않고 함수 호출 위치에 함수의 처리 문장이 삽입되게 번역되도록 선언된 함수
- 함수를 사용함으로써 얻을 수 있는 모듈화의 장점을 가지고 있으며, 함수 호출에 따른 부수적인 처리시간이 생략됨
- 함수 호출 루틴으로부터 함수로 넘어가는 부분의 코드 최적화가 가능해짐
- 매우 빈번히 호출되며 빠른 실행이 요구되는 함수를 inline 함수로 선언하면 성능을 높이는데 도움이 됨
- inline 함수를 선언하더라도 반드시 inline으로 번역되는 것이 아니기 때문에 주의가 필요.
- 함수가 너무 큰 경우
- 순환 호출을 하는 경우
- 프로그램 내에서 그 함수에 대한 포인터를 사용하는 경
[참고자료]
C++ 프로그래밍 방송통신대학교
반응형
'IT > 개발공부' 카테고리의 다른 글
Postman에 대해 알아보자 (Postman이 무엇인가, Postman 설치, 사용법) (0) | 2023.06.26 |
---|---|
Java 오버로딩, 오버라이딩 정리 (0) | 2023.06.23 |
Spring 처음부터 공부해보기 - 1 (프로젝트 생성, Bean, 어노테이션, Spring Container, Loose Coupling) (0) | 2023.06.15 |
C++ 언어 기초 (2) (흐름제어, 구조체, 클래스, 배열, 포인터, 메모리 할당, 참조) (0) | 2023.06.15 |
C++ 언어 기초(1) (키워드, 식별자, 자료형, 상수, 변수, 연산자) (0) | 2023.06.14 |