1. 함수
함수는 특정 작업을 수행하는 코드 블록이며, 코드의 재사용성을 높이고 프로그램의 구조를 개선하기 위해 사용
2. 함수의 기본 구조
2.1 반환 타입
함수가 실행 완료 후 반환하는 데이터 타입을 지정한다.
2.2 함수 이름
함수를 호출할 때 사용하는 이름이다. ( 함수의 특성을 잘 나타내는 것으로 하는것이 좋음 )
2.3 매개변수 리스트
함수에 전달하는 입력값의 목록이다. 여러 매개변수가 있으면 , 으로 구분한다.
2.4 함수 본체
함수가 호출될 때 실행할 코드 블록이다.
2.5 return
함수의 실행 결과를 호출한 곳으로 반환하는 명령어이다.
// 기본 구조
반환타입 함수이름(매개변수 리스트) {
// 함수 본체
// 실행 코드
return 반환값;
}
// 예시
#include <stdio.h>
// 함수 선언
int add(int a, int b);
int main() {
int result;
// 함수 호출
result = add(10, 20);
printf("결과: %d\\n", result);
return 0;
}
// 함수 정의
int add(int a, int b) {
return a + b;
}
3. 함수의 선언과 정의
3.1 함수의 선언
함수를 사용하기 위해서는 함수의 선언과 정의가 필요하다.
보통 헤더 파일(.h)이나 소스 파일(.c)의 상단에 위치한다.
하수의 선언은 함수가 어떤 작업을 수행하는지, 어떤 인자를 받고, 어떤 타입의 값을 반환하는지 컴파일러에게 알려주는 역할을 한다.
// 기본 구조
반환타입 함수이름(자료형 변수이름, 자료형2 변수이름2, ...);
// 예시
int add(int a, int b);
3.2 함수의 정의
함수가 실제로 어떤 작업을 수행하는지 구체적으로 기술한 코드 블록이다.
// 기본 구조
반환타입 함수이름(매개변수 리스트) {
// 함수 본체
// 실행 코드
return 반환값;
}
// 예시
int add(int a, int b) {
return a + b;
}
4. 매개변수와 인자
4.1 매개변수 (Parameters)
매개변수는 함수 정의에 사용되는 변수이다. 함수가 호출될 때 필요한 데이터 형식을 정의한다.
즉, 함수가 어떤 종류의 입력을 받을 수 있는지 설명하는 역할을 한다.
int add(int a, int b) { // a,b는 매개변수 이다.
return a + b;
}
4.2 인자 (Arguments)
함수를 호출할 때 실제로 전달되는 값이다.
이 값들은 함수가 실행될 때 매개변수에 복사되어 함수 내에서 사용된다.
즉, 인자는 함수의 외부에서 함수로 데이터를 전달하는 수단이다.
int add(int a, int b) { // a,b는 매개변수 이다.
return a + b;
}
int main()
{
int result = add(5, 3); // 5 , 3은 인자이다.
}
5. 반환 값
반환 값은 함수가 작업을 수행한 후 그 결과를 호출한 곳으로 전달하는 값이다.
5.1 반환 값의 기본 구조
반환 값은 함수 정의의 시작 부분에 지정된 반환 타입에 의해 결정된다.
없으면 void를 사용한다.
// 기본 구조
반환타입 함수이름(매개변수 리스트) {
// 함수 본체
// 실행 코드
return 반환값;
6. 함수의 호출 방식
함수의 호출 방식은 크게 두 가지로 나눌 수 있다.
이 두가지 방식은 함수에 인자를 전달하는 방법과 함수 내에서 인자들을 처리하는 방식에 따라 구분된다.
- 값에 의한 호출(Call by Value)
- 참조에 의한 호출(Call by Reference)
6.1 값에 의한 호출 (Call by Value)
함수에 인자를 전달할 때 인자의 실제 값을 복사해서 함수의 매개변수에 할당하는 방식이다.
따라서, 함수 내부에서 매개변수 값을 바꿔도 원본 값에는 영향을 미치지 않는다.
#include <stdio.h>
void addTen(int a) {
a = a + 10;
printf("Inside addTen: %d\\n", a);
}
int main() {
int num = 5;
addTen(num); // 값에 의한 호출
printf("In main: %d\\n", num); // num 값은 변하지 않음
return 0;
}
6.2 참조에 의한 호출 (Call by Reference)
함수에 인자를 전달할 때 인자의 메모리 주소를 전달하는 방식이다.
이 방식에서는 함수 내부에서 매개변수를 통해 인자의 실제 메모리에 접근하고 변경할 수 있으므로, 함수의 실행 결과가 호출한 곳의 변수에 직접 반영된다.
C에서는 포인터를 사용하여 참조에 의한 호출을 구현한다.
#include <stdio.h>
void addTen(int *a) {
*a = *a + 10; // 포인터를 통해 값을 변경
printf("Inside addTen: %d\\n", *a);
}
int main() {
int num = 5;
addTen(&num); // 참조에 의한 호출
printf("In main: %d\\n", num); // num 값이 변경됨
return 0;
}
7. 재귀 함수 (Recursive Function)
자기 자신을 호출하여 특정 작업을 수행하는 함수이다.
7.1 기본 구조
재귀 호출을 멈추고 함수가 자시 자신을 더 이상 호출하지 않는 조건이 필요하고
함수가 자기 자신을 호출하는 부분이 필요하다. \
#include <stdio.h>
// 팩토리얼을 계산하는 재귀 함수
int factorial(int n) {
// 기본 경우: n이 1 이하일 때
if (n <= 1) {
return 1;
}
// 재귀적 단계: n! = n * (n-1)!
else {
return n * factorial(n - 1);
}
}
int main() {
int n = 5;
printf("%d! = %d\\n", n, factorial(n));
return 0;
}