일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 장고 기초 강의
- C언어
- cpp
- 기초강의
- 파이썬강의
- Python
- 플라스크
- 개발자
- flask
- 개발언어
- mlops
- 웹개발
- 에어플로우 기초강의
- 프로그래밍
- Django
- airflow
- 파이썬
- ADP
- 도커 컴포즈
- 쇼핑몰예제
- 개발자취업
- 예제프로젝트
- 도커
- docker
- 장고 튜토리얼
- c++
- 장고
- c
- 인공지능
- 파이썬 장고
- Today
- Total
TITEDIOS Dev Note
C 기초강의: #12 함수 - 함수 작성 방법 및 가이드 본문
TL;DR
C언어에서 함수는 특정 작업을 수행하는 코드 블록으로, 프로그램의 구조를 효율적으로 관리하고 중복 코드를 줄이며 가독성을 높여줍니다. 함수는 선언, 정의, 호출의 세 가지 단계로 구성되며, 반환값과 매개변수를 통해 다양한 작업을 수행할 수 있습니다.
목차
- 함수란 무엇인가?
- 함수의 선언과 정의
- 함수의 반환값과 매개변수
- 함수 호출
- 재귀 함수
- 함수의 장점
- 함수와 스택 메모리
- 주요 예제 및 코드
- 결론
1. 함수란 무엇인가?
함수는 C언어에서 특정 작업을 수행하기 위해 작성된 코드 블록입니다. 함수는 프로그램 내에서 여러 번 호출될 수 있으며, 이를 통해 코드의 재사용성을 높이고 중복을 피할 수 있습니다. 함수는 일반적으로 입력을 받아 특정 작업을 수행한 후 결과를 반환하거나, 단순히 작업만 수행하고 종료됩니다.
2. 함수의 선언과 정의
함수는 먼저 선언(declaration)되고, 이후 정의(definition)됩니다. 함수의 선언과 정의는 사용 전에 있어야 합니다. 따라서, 함수를 호출하기 전에 선언이나 정의를 하여야 합니다.
- 함수 선언: 함수가 어떤 반환값을 가지며, 어떤 인자를 받을지에 대해 컴파일러에게 알려주는 것입니다. 보통 함수가 사용되기 전에 선언됩니다.
int add(int a, int b);
- 함수 정의: 함수가 실제로 수행할 작업을 코드로 작성하는 부분입니다.
int add(int a, int b) {
return a + b;
}
3. 함수의 반환값과 매개변수
함수는 작업을 마친 후 결과를 반환할 수 있으며, 이를 반환값이라고 합니다. 반환값의 데이터 타입을 정의할 수 있으며, 반환할 필요가 없다면 void 타입을 사용할 수 있습니다. 그림에서 ① 이 매개변수를 의미합니다. 외부로 부터 값을 받아 ②에서 연산을 수행합니다. 이후 ③에서 결과를 반환합니다. 이를 반환값이라고 합니다.
- 반환값: 함수가 처리한 결과를 호출한 코드에 돌려주는 값입니다.
int add(int a, int b) {
return a + b; // 반환값
}
- 매개변수: 함수가 외부로부터 입력받는 값입니다. 여러 개의 매개변수를 사용할 수 있으며, 각 매개변수의 타입과 이름을 정의합니다.
int multiply(int x, int y) { // 매개변수로 x, y를 사용
return x * y;
}
4. 함수 호출
함수를 정의한 후, 프로그램에서 해당 함수를 호출(call)하여 사용합니다. 호출된 함수는 자신이 정의된 작업을 수행한 후, 필요시 값을 반환하고 종료됩니다. 실제로 함수는 호출을 위해 작성하는 것이므로 적절한 호출이 중요합니다.
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); // 출력: Result: 8 return 0;
}
5. 재귀 함수
함수는 자기 자신을 호출할 수 있으며, 이를 재귀 함수라고 합니다. 재귀 함수는 반복적인 작업을 수행할 때 유용하지만, 적절한 종료 조건을 명시하지 않으면 무한 루프에 빠질 수 있습니다.
int factorial(int n) {
if (n == 1) return 1; // 종료 조건에 대한 명시
else return n * factorial(n - 1); // 자기 자신을 호출
}
6. 함수의 장점
- 코드 재사용성: 한 번 정의한 함수를 여러 곳에서 호출하여 사용함으로써 중복 코드를 줄일 수 있습니다.
- 가독성 향상: 코드를 함수 단위로 나누어 작성하면, 코드의 가독성이 높아지고 유지보수가 용이해집니다.
- 모듈화: 각 함수가 특정 작업을 담당하게 하여 프로그램을 모듈화할 수 있습니다.
7. 함수와 스택 메모리
이제 조금 어려운 얘기를 꺼내야겠습니다. 우리가 작성한 함수가 메모리에 어떻게 적재되는지에 대한 이야기 입니다. 너무 한꺼번에 이해하려고 하지 마시고 조금씩 이해가 가는 부분만 이해하시면 되겠습니다.
우리가 작성한 프로그램은 메모리에 저장됩니다. 메모리에는 주소값이 있습니다. 낮은 주소부터 우리의 프로그램이 착착 쌓이는데요. 낮은 주소 공간부터 Code, Data, Heap, Stack 영역으로 구분됩니다. 우리가 작성한 프로그램은 이렇게 4부분으로 쪼개져 저장된다고 생각하시면 됩니다. 그런데 이때 함수는 Stack 영역과 밀접한 영향이 있습니다.
C언어에서는 함수 호출 시, 함수의 매개변수와 지역 변수들이 스택(stack) 메모리에 저장됩니다. 함수가 종료되면 이 메모리 공간은 자동으로 해제됩니다. 재귀 함수에서 스택 오버플로우(stack overflow)가 발생할 수 있으므로 주의해야 합니다. 이전에 설명드렸던 종료 조건 기억하시죠? 이 종료 조건이 재귀 함수에서 스택 오버플로우가 발생하지 않도록 하기 위한 안전장치입니다.
- 스택 오버플로우(Stack Overflow)는 프로그램이 스택(Stack) 메모리 영역을 초과하여 사용하는 상황을 말합니다. 스택은 함수 호출, 지역 변수, 매개변수 등을 저장하기 위해 사용하는 메모리 공간으로, 한정된 크기를 가지고 있습니다.
8. 주요 예제 및 코드
앞서 알아봤던 함수를 어떻게 사용하는지 다양한 함수 사용 예제를 작성해 보겠습니다. 3가지 함수의 형태를 잘 익혀두시기 바랍니다. c언어에 대한 작성 요령에 대해 잘 아시게 될 것입니다.
단순 함수 호출
void sayHello() {
printf("Hello, World!\n");
}
int main() {
sayHello(); // 출력: Hello, World! return 0;
}
매개변수와 반환값이 있는 함수
int square(int n) {
return n * n;
}
int main() {
int result = square(4);
printf("Square of 4: %d\n", result); // 출력: Square of 4: 16 return 0;
}
재귀 함수
int fibonacci(int n) {
if (n <= 1) return n;
else return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
int result = fibonacci(5);
printf("Fibonacci of 5: %d\n", result); // 출력: Fibonacci of 5: 5 return 0;
}
결론
함수는 C언어에서 프로그램의 효율성을 높이고, 코드의 구조를 체계적으로 관리하는 데 필수적인 요소입니다. 함수의 적절한 사용은 프로그램의 유지보수성을 높이고, 버그를 줄이며, 복잡한 문제를 해결하는 데 도움을 줍니다. 이 포스팅에서는 함수에 대해 다루었으며, 이를 통해 C언어 함수의 기본적인 사용법에 대해 잘 이해하셨을 것이라고 생각합니다.
도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.
감사합니다!
'C++' 카테고리의 다른 글
C 기초강의: #14 포인터 - 포인터 기초 개념 및 사용 방법 (2) | 2024.09.01 |
---|---|
C 기초강의: #13 배열과 문자열 - 기초 개념과 활용 방법 (5) | 2024.08.31 |
C 기초강의: #11 조건문 - if (0) | 2024.08.24 |
C 기초강의: #10 반복문 - for, while (1) | 2024.08.18 |
C 기초강의: #9 비트마스킹 - 비트연산자의 활용 (0) | 2024.08.17 |