일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 동적 프로그래밍(Dynamic Programming)
- 스택(Stack)
- 트리(Tree)
- BFS
- 큐(Queue)
- 알고리즘 개념
- 위상 정렬(Topological Sort)
- 백준 2493번
- DFS(Depth First Search)
- 백준 9012번
- 백준 10000번
- DFS
- DFS & BFS
- 백준 2261번
- 백준 1707번
- 그리디 알고리즘(Greedy Algorithm)
- 분할 정복(Divide and Conquer)
- 그래프(Graph)
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 이분 그래프(Bipartite Graph)
- 백준 17608번
- 이분 탐색(Binary Search)
- BFS(Breadth First Search)
- 위상 정렬(Topology Sort)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 백준 21606번
- 백준 18352번
- 백준 2504번
- 백준 1948번
- 백준 2812번
- Today
- Total
Always Be Wise
함수란? 본문
함수란 특정한 기능을 따로 분리해놓은 것을 의미한다. 함수를 이용하면 코드의 유지보수 및 가독성, 재활용성이 높아진다.
함수의 기본적인 형태는 아래와 같다. 반환형과 전달받는 인자, 즉 매개 변수가 없는 경우도 있다.
/* 기본적인 형태
[반환형] [함수명] (매개 변수)
{
[호출 시 작동될 함수 내부 코드]
}
*/
#include <stdio.h>
void func1(void)
{
printf("반환할 필요도 없고, 인자도 받지 않는 void 함수입니다.\n");
}
void func2(int num)
{
printf("받은 인자는 %d 입니다.\n", num);
}
float func3(int num)
{
printf("인자의 형과 반환형을 맞춰줄 필요는 없습니다.\n");
return 3.14 * num;
}
int main()
{
float result;
func1();
func2(2);
result = func3(2);
printf("result : %f\n", result);
return 0;
}
함수를 선언할 때 위치를 주의해야 한다. C 언어는 절차 지향 언어이기 때문에 위에서 아래로 차례대로 소스 코드를 해석한다.
따라서 함수 선언이 main 함수 아래에 있다면 인식하지 못한다. 따라서 반드시 함수 정의와 선언을 main 함수 위에 해주거나,
함수의 원형을 main 함수 위에 선언해주어야 한다. 함수 원형은 반환형 함수 이름, 인자 목록을 의미한다.
#include <stdio.h>
int func1(void);
int main()
{
func1();
printf("함수 실행 완료\n");
return 0;
}
int func1(void)
{
printf("예시 함수입니다.\n");
return 0;
}
아래 코드는 배열의 합을 구하는 예제이다. 배열의 합을 구하기 위해 main 함수는arrayPlus라는 함수를 호출하고 arr과 length를
인자로 넘겨준다. 이처럼 함수를 호출할 때 넘겨주는 값을 전달 인자라고 한다. arrayPluse 입장에서는 이를 매개 변수라고 한다.
그런데 중요한 점은 전달 인자로 전달된 값은 매개 변수에 복사된 값이지 실재 값은 아니라는 것이다. 예를 들어, arryPlus에서
main의 length를 넘겨받은 후, 함수 내에서 length 값에 10을 더한다고 해도 main의 length 값은 변하지 않는다.
#include <stdio.h>
int arrayPlus(int arr[], int length)
{
int result = 0;
for(int i=0; i<length; i++)
{
result += arr[i];
}
return result;
}
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int result;
int length = sizeof(arr) / sizeof(int);
result = arrayPlus(arr, length);
printf("모든 배열의 합 : %d", result);
return 0;
}
지역 변수
지역 변수란 한 지역 내에서만 사용할 수 있는 변수를 의미한다. 여기서 지역이란, 중괄호에 의해 만들어지는 영역을 말한다.
main 함수 내의 변수들도 다 지역 변수이다. 따라서 main 함수 내의 변수들은 다른 함수 내에서 사용할 수 없다. main 함수에서
사용하던 변수를 다른 함수에도 사용하려면 전달 인자로 넘겨주거나, 전역 변수로 선언한 후 사용해야 한다. 다른 함수들도 마찬가지이다.
다른 함수에서 선언된 지역 변수를 main에서 사용하려면 변수를 return 한 후 main에서 따로 저장해두어야 한다.
전역 변수
전역 변수는 지역 변수와 반대로 어느 지역에서나 사용할 수 있는 변수를 의미한다. 괄호 안에 쓴 변수가 지역 변수였다면,
괄호 밖에 쓴 변수는 전역 변수이다. 전역 변수로 선언하면 main 함수 뿐만 아니라 여러 다른 함수에서 해당 변수의 사용이 가능하다.
이 전역 변수는 프로그램의 시작과 동시에 메모리 공간에 할당되어서 프로그램이 종료될 때까지 존재한다. 또한, 지역 변수와는
다르게 별도의 값으로 초기화 하지 않으면 0으로 초기화 된다.
#include <stdio.h>
// 전역 변수
int global = 10;
void globalTest()
{
// 지역 변수
global += 5;
printf("함수에서 전역 변수 : %d\n", global);
}
int main()
{
// 지역 변수
int result = 10;
printf("전역변수 : %d\n", global);
printf("지역변수 : %d\n", result);
globalTest();
return 0;
}
위와 같이 전역 변수는 main에서도 globalTest와 같은 함수에서도 접근과 사용이 가능하다. 코드가 길어지고 프로그램이 복잡해질수록
함수 또한 늘어나게 되는데, 전역 변수를 사용하면 어떤 함수에서 전역 변수의 값을 바꾸는지 알기 어려워 진다. 또한, 지역 변수와
전역 변수 중에 이름이 같은 변수가 있는 경우에 지역 변수를 우선적으로 접근한다. 만약 위 코드에서 global이라는 변수가 main에도
있다면 main에 있는 global을 사용한다는 뜻이다. 코드가 길어질수록 지역 변수와 전역 변수의 이름이 겹칠 가능성이 높아지는데,
의도하지 않았던 결과가 발생할 수 있다. 따라서 되도록이면 전역 변수를 줄이고 지역 변수를 사용하는 것이 좋다.