C/C++에서 함수(Function)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.
함수는 코드의 재사용성과 구조화를 위해 사용되는 코드 블록입니다. 함수는 특정 작업을 수행하며, 필요할 때 호출되어 실행됩니다. 함수는 입력을 받아 작업을 수행하고, 결과를 반환할 수 있습니다.
C/C++에서 함수는 선언(declaration)과 정의(definition)로 나눌 수 있습니다. 선언은 함수의 이름, 매개변수, 반환 타입을 명시합니다. 정의는 함수의 실제 구현을 포함합니다.
// 함수 선언
int add(int a, int b);
// 함수 정의
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(5, 3);
printf("Result: %d\n", result);
return 0;
}
함수가 호출될 때마다 새로운 스택 프레임이 생성됩니다. 스택 프레임은 함수의 매개변수, 지역 변수, 반환 주소 등을 저장합니다. 함수 호출이 완료되면 해당 스택 프레임은 제거됩니다.
스택 메모리 구조:
+------------------+
| ... |
+------------------+
| 함수 호출 2 |
| 매개변수, 지역변수 |
+------------------+
| 함수 호출 1 |
| 매개변수, 지역변수 |
+------------------+
| main 함수 |
| 매개변수, 지역변수 |
+------------------+
| ... |
+------------------+
함수는 매개변수와 지역 변수를 스택에 저장하고, 함수가 종료되면 자동으로 스택에서 제거됩니다. 이를 통해 함수 간의 데이터 격리를 보장하고, 메모리 관리를 단순화합니다.
함수 호출과 스택 프레임을 이해하기 쉽게 그림과 표로 표현하였습니다.
함수 호출과 스택 프레임:
int main() {
int result = add(5, 3);
printf("Result: %d\n", result);
return 0;
}
int add(int a, int b) {
return a + b;
}
스택 구조:
+------------------+
| ... |
+------------------+
| add 함수 |
| a, b, 반환 주소 |
+------------------+
| main 함수 |
| result, 반환 주소 |
+------------------+
| ... |
+------------------+
다양한 상황에서 함수를 사용하는 예제를 추가로 제공합니다.
#include <stdio.h>
// 재귀 함수 선언 및 정의
int factorial(int n) {
if (n <= 1)
return 1;
else
return n * factorial(n - 1);
}
int main() {
int num = 5;
printf("Factorial of %d is %d\n", num, factorial(num));
return 0;
}
#include <iostream>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
// 함수 포인터 선언 및 초기화
int (*operation)(int, int) = add;
std::cout << "Addition: " << operation(5, 3) << std::endl;
// 함수 포인터를 다른 함수로 변경
operation = subtract;
std::cout << "Subtraction: " << operation(5, 3) << std::endl;
return 0;
}
#include <iostream>
// 함수 오버로딩
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int main() {
std::cout << "Integer addition: " << add(5, 3) << std::endl;
std::cout << "Double addition: " << add(5.5, 3.3) << std::endl;
return 0;
}
함수는 코드의 재사용성과 구조화를 위해 사용되는 코드 블록으로, 특정 작업을 수행하고 결과를 반환합니다. 함수 호출 시 스택 프레임이 생성되어 매개변수와 지역 변수를 저장하며, 함수가 종료되면 스택 프레임이 제거됩니다. 이를 통해 함수 간의 데이터 격리를 보장하고, 메모리 관리를 단순화할 수 있습니다. 운영체제는 함수 호출과 관련된 스택 메모리를 관리하여 프로그램이 효율적으로 실행될 수 있도록 돕습니다.
이와 같은 내용을 통해 C/C++의 함수에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!