함수는 '마법 상자'라고 생각하면 된다.
어떠한 상자에 정보를 넣으면 우리가 원하는 결과가 나타나는 상자
ex) 값을 넣으면 10배가 되어서 나오는 상자가 곧 함수
함수를 사용하는 이유
함수를 사용하지 않으면 비슷한 일을 할 때도 매번 그 일을 수행하도록 프로그래밍해야 한다.
'1'을 넣고 10배 만들고 '3'을 넣고 10배 만들고를 반복해야 한다. 그래서 상자 한개를 만들고 원하는 숫자를 넣으면 자동으로 계산하게 해준다.
함수를 사용하면 입력이 달라지더라도 수행하는 일은 동일하므로 같은 코드를 재사용 할 수 있다.
함수 선언 형식
출력 데이터형 함수이름(입력 자료형과 변수, 입력 자료형과 변수, ...)
ex) int func10(int x);
매개변수
함수에 입력으로 전달되는 값을 받기 위해 사용되는 변수
ex) int x;
함수에 들어오는 입력이 하나가 아니라 두 개 일 때 콤마를 사용하여 나열
ex) func2(int x, int y);
문자형 변수 a, 정수형 변수 b, 실수형 변수 c
이렇게 세 개 입력으로 들어오는 함수는 func3는 다음과 같이 선언
ex) func(char a, int b, double c);
#include <stdio.h>
int func10(int x); ---------------->함수 선언
int main(void) {
int a = 1, b = 3;
int r_a = func10(a); ------------->함수 호출
int r_b = func10(b);
printf("10배가 된 값: %d\n", r_a);
printf("10배가 된 값: %d\n", r_b);
}
int func10(int x) ------------>함수 몸체
{
return x * 10;
}
func10()함수를 선언했고 main()함수 안에서 func10()함수를 호출
func10()함수가 호출되면 func10()함수 몸체를 찾아가서 함수를 실행
func10()함수의 몸체를 보면 return이라는 키워드가 있다.
이 키워드는 함수를 호출한 프로그램에 호출된 함수의 실행 결과값을 돌려줄 때 사용
x와 10을 곱한 값을 돌려받은 main()함수는 그 값을 r에 저장
다른 예시
#void
함수를 선언할 때 void라는 키워드를 사용
c언어에서 함수의 입력 or 출력이 없을 때 void라는 키워드를 사용하기도 하고
아무것도 적지 않기도 한다.
void: '빈', '아무것도 없는'이라는 뜻
입력으로 들어오는 것이 아무것도 없으면
출력으로 정수 값이 나가는 test1이라는 이름의 함수를 사용하겠다는 의미
실제로 test1()함수의 몸체를 보면 test1을 호출한 main()함수로 정수 값10을 전달하지만,
main()함수로부터 어떤 정보도 입력 받지 않는다.
void는 함수에서 출력이 없을 때도 사용
test2()함수는 main()함수에서 3을 전달 받아
test2()함수 안에 있는 변수 x에 저장하고 변수x의 값을 출력하지만
main()함수로 어떠한 값도 돌려 주지 않는다.
그러므로 test2()함수 이름 앞에 void라고 명시하거나 생략할 수 있다.
test3()함수는 호출되어도 값을 전달하지 않고
main()함수는 호출이 완료 되어도 값을 돌려 받지 않는다.
이 프로그램은 단지 main()함수가 test3()함수를 호출할 때마다 화면에 "hello"라고 출력할 뿐이다.
#return 0
return 0에 대해 자세히 알아보자
main()함수를 호출한 프로그램으로 0을 돌려준다.
main()함수는 c프로그래밍의 최상위 단계로
그 위에 운영체제 (컴퓨터 동작을 운영하는 시스템)이 있다.
main()함수에 return 0이라고 지정하면,
c프로그래밍이 종료되면서 운영체제에 0을 전달하여 c프로그래밍이 정상적으로 종료되었음을 알려준다.
c프로그램에서 0은 정상종료, 1은 비정상 종료를 의미한다.
일반적으로 비쥬얼 스튜디오에서는 c프로그램이 종료되면 자동으로
시스템에 0을 반환한다. 따라서 main()함수에 return 0을 쓰지 않아도 된다.
#정적변수
정적변수란 함수 실행이 끝나더라도 사라지지 않고 계속 유지되는 변수를 말한다.
main()함수에서 처음으로 bell()함수를 호출하여 bell()함수가 실행된다.
그 뒤 bell()함수가 실행되고 bell()함수에서 orde라는 정수형 변수를 선언한 뒤 값을 0으로 초기화하면서 int 앞에 static이라는 키워드를 넣었다.
정적 정수형 변수 order를 선언
정적변수 order가 0으로 초기화 되어 저장되는 것까지는 일반적인 변수와 동일
하지만 함수 호출 후 실행이 끝나도 정적 변수의 메모리는 시스템에 반환되지 않고 그대로 남아 있다는 점에서 다르다.
따라서 bell()함수의 실행이 끝나고 main()함수로 제어가 넘어가더라도 order변수는 사라지지 않는다.
main()함수에서 두 번째 bell()함수가 호출되어 bell()함수로 제어가 넘어가면 정적 변수 order를 선언하고 명령문을 다시 만나지만, 정적 변수는 단 한 번만 생성되고 초기화된다는 특징이 있다.
그래서 두번째 bell()함수 호출에서는 'static int order = 0; 수행하지 않고 넘어간다.
그 다음 줄에서 바로 order값이 하나 증가하고 마찬가지로 order변수의 메모리를 반환하지 않은 채 다시 main()함수로 제어가 넘어간다.
그러므로 코드 작성한 것과 같이
bell()함수를 호출할 때마다 main()함수에 있는 bell()함수가 차례대로 출력된다.
정적변수의 특징
1. static이라는 키워드를 사용하여 정적변수를 선언
2. 함수가 호출되어 함수 실행이 끝나도 정적변수는 사라지지 않는다.
3. 정적 변수는 프로그램 실행 중 딱 한번만 생성되고 초기화된다.
키워드란?
프로그래밍 언어에서 미리 정의된 단어로,
특정하나 목적을 가지고 있으며 언어의 문법에 따라 사용되어야 하는 단어들이다.
키워드를 "예약어"라고 이해하면 쉽다.
전역변수
1. 함수 밖에서 선언
2. 어떤 함수에서도 접근 가능하고 사용가능
3. 프로그램이 끝날 때까지 살아있는 변수
#지역변수
지역변수
1. 함수 안에서 선언
2. 변수가 선언된 함수 안에서만 사용가능
3. 함수가 끝남면 사라지는 변수(변수가 사용한 메모리를 반환)
#include <stdio.h>
int a = 1;
int main(void){
int a = 2;
printf("a값은 %d이다.\n", a);
}
전역변수 a를 생성하고 1로 초기화
main()함수에서 지역변수 a를 선언하고 2로 초기화
main()함수 안에서 변수 a의 값을 출력하고자 할 때
같은 이름의 전역변수와 지역변수가 존재한다면 지역변수가 우선이다.
그래서 위의 코드는 'a의 값은 2이다.'가 출력된다.
#정적변수와 지역변수 이해하기
b가 에러가 뜨는 이유는 b는 지역변수이기 때문이다.
'C언어' 카테고리의 다른 글
C언어 <포인터> (0) | 2023.07.25 |
---|---|
C언어 <배열> (0) | 2023.07.24 |
C언어 <반복문> 13~19 문제 풀이 (0) | 2023.07.21 |
C언어 난수를 활용한 게임 (0) | 2023.07.21 |
C언어 <난수> 1,2 문제 풀이 (0) | 2023.07.18 |