함수를 만드는 이유
여러 가지 기능을 하나에서 수행하는 단일 함수를 각 기능별로 수행하는 함수로 세분화하면 프로그램 문제 발생 및 소스코드 수정 등 수행할 때 변경 범위 및 작업시간 등을 줄여 효율성을 높일 수 있는 장점이 있습니다.
함수 정의시 함수 위치에 따라 에러가 발생할 수 있기에 함수 위치에 주의를 기울여서 정의해야합니다.
분류 | 함수를 호출하기 전 함수를 정의 | 함수를 호출한 뒤에 함수를 정의 |
코드 | #include<stdio.h> int num1(int n){ printf("%d", n); return n; } int main(void){ int num = 3; num = num1(num); return 0; } |
#include<stdio.h> int main(void){ int num = 3; num = num1(num); return 0; } int num1(int n){ printf("%d", n); return n; } |
출력 | 3 | Error 발생 |
함수를 사용하기 전에 먼저 함수를 정의해야 정상적으로 동작하게 됩니다. 에러가 발생한 오른쪽 코드를 정상적으로 동작할 수 있는 방법은 다음과 같습니다.
분류 | 원본 코드 | 수정 코드 |
코드 | #include<stdio.h> int main(void){ int num = 3; num = num1(num); return 0; } int num1(int n){ printf("%d", n); return n; } |
#include<stdio.h> int num1(int n); int main(void){ int num = 3; num = num1(num); return 0; } int num1(int n){ printf("%d", n); return n; } |
출력 | Error 발생 | 3 |
원 코드에서 함수를 호출하기 전에 int num1(int n); 함수를 선언하는 코드를 추가하여 정상 동작시킬 수 있습니다.
재귀함수
함수 내에서 자기 자신을 다시 호출하는 함수를 의미합니다.
분류 | num이 0일 때 재귀함수 종료 |
코드 | #include<stdio.h> int Recursive_call(int num){ if (num == 0) return 0; printf("Reverse_call %d\n", num); Recursive_call(num -1); return 0; } int main(void){ Recursive_call(5); return 0; } |
출력 | Reverse_call 5 Reverse_call 4 Reverse_call 3 Reverse_call 2 Reverse_call 1 |
재귀호출은 탈출 조건이 없으므로 탈출 조건을 추가하지 않으면 무한 루프가 되어버리므로 탈출 조건을 추가하여 탈출할 수 있도록 합니다.
지역변수
선언된 지역 내에 유효한 변수를 의미하며, 중괄호 내에 선언된 변수는 모두 지역변수입니다. 지역변수는 선언된 지역을 벗어나면 자동으로 소멸되고 선언된 지역 내에서 유효하기 때문에 선언된 지역이 다르면 변수 이름이 같아도 정상 동작하는 특징이 있습니다.
분류 | 각 함수에서 변수명 num 사용 |
코드 | #include<stdio.h> int num1(void){ int num = 10; printf("num1함수의 num변수 값 %d\n", num); return 0; } int num2(void){ int num = 20; printf("num2함수의 num변수 값 %d\n", num); return 0; } int main(void){ int num = 30; num1(); num2(); printf("main함수의 num변수 값 %d\n", num); return 0; } |
출력 | num1함수의 num변수 값 10 num2함수의 num변수 값 20 main함수의 num변수 값 30 |
지역변수는 반복문, 조건문에서도 선언이 가능합니다.
분류 | if문 안에 변수 num 선언 | if문 안에 변수 미선언 |
코드 | #include<stdio.h> int main(void){ int num = 1; if(num==1) { int num = 10; num+=10; printf("if문의 지역변수 %d\n", num); } printf("main함수문의 지역변수 %d\n", num); return 0; } |
#include<stdio.h> int main(void){ int num = 1; if(num==1) { num+=10; printf("if문의 지역변수 %d\n", num); } printf("main함수문의 지역변수 %d\n", num); return 0; } |
출력 | if문의 지역변수 20 main함수문의 지역변수 1 |
if문의 지역변수 11 main함수문의 지역변수 11 |
if문 안에 변수를 선언한 경우 if문의 num은 지역변수가 되어 main함수의 num과 다른 값을 가집니다.
if문 안에 변수를 선언하지 않을 경우 if의 num은 main함수의 num에 접근하게 되어 main함수의 num과 같은 값을 가집니다.
전역변수
어디서든 접근이 가능한 변수를 의미합니다. 전역변수는 지역변수와 다르게 프로그램 시작과 종료 시까지 변수가 메모리 공간에 할당되고, 중괄호 내에 선언되지 않으며 어디서든 접근이 가능, 별도의 값으로 초기화하지 않으면 0으로 초기화됩니다. 만약 전연변수가 선언되고 전역변수와 같은명으로 지역변수가 선언된다면 지역변수로 접근이 이루어집니다.
분류 | 전역변수를 초기화하지 않고 선언 |
코드 | #include<stdio.h> int num; int add(int a); int main(void){ printf("초기화하지 않은 전역변수 nun의 값: %d\n",num); add(5); printf("전역변수 nun의 값: %d\n",num); return 0; } int add(int a){ num += a; } |
출력 | 초기화하지 않은 전역변수 nun의 값: 0 전역변수 nun의 값: 5 |
전역변수는 어디서나 접근이 가능하지만 프로그램 구조를 복잡하게 만들 수 있기에 적절히 사용하는것이 중요합니다.
'Coding > C' 카테고리의 다른 글
포인터(pointer) (0) | 2021.09.12 |
---|---|
배열(array) (0) | 2021.07.24 |
성적 계산기(if ~ else, switch) (2) | 2021.06.13 |
구구단 출력하기 (while, for) (0) | 2021.06.12 |
반복문 제어(continue, break, goto) (0) | 2021.06.12 |