53. 함수(Function)
1. 키워드
- 함수(Function)
- 지역 변수(Local Variable)
- 함수 원형(Function prototype)
2. 함수 사용하기
- C에서는 함수라는 기능을 제공하는데 특정 용도의 코드들을 한 곳에 모아놓은 것을 뜻한다.
3. "Hello, world!"
출력 함수 만들기
- 함수를 정의하는 방법은 다음과 같이 반환값 자료형, 함수 이름,
()
(괄호) 순으로 적어준 뒤{}
(중괄호) 안에 원하는 코드를 작성하면 된다.
#include <stdio.h>
void hello() // 반환값이 없는 hello 함수 정의
{
printf("Hello, world!\n"); // "Hello, world!" 출력
}
void main()
{
hello(); // hello 함수 호출
return 0;
}
// Hello, world!
- 이제 함수를 만들려면
main
함수 바깥에서 작성해야 한다. - 다음과 같이
main
함수 위에서 반환값의 자료형은void
타입, 이름은hello
인 함수를 정의했다. - 그리고
{}
안에서printf
로"Hello, world!"
문자열을 출력했다.
- 여기서 함수의 반환값 부분에
void
타입을 적어주면 함수의 반환값이 없다는 뜻이 된다. - 즉,
void
타입은 함수의 반환값이 없음을 나타낼 때와 포인터로 사용할 때의 의미가 다르다.
main
함수 안에서hello();
와 같이 함수 이름과()
를 적어준 뒤;
(세미콜론)을 붙이면 함수를 사용할 수 있다.
- 다음은
main
함수와hello
함수의 실행 순서이다.
1] main
함수 실행
2] hello
함수 호출
3] hello
함수 실행
4] printf
함수 실행 및 "Hello, world!"
출력
5] hello
함수 종료
6] 0
반환 및 main
함수 종료
지역 변수
- 함수 안에 선언된 변수를 지역 변수라고 부르는데, 이 지역 변수의 특징은 함수가 끝나면 사라진다는 점이다.
#include <stdio.h>
void hello()
{
int num1 = 10; // 지역 변수. hello 함수가 끝나면 사라짐
printf("Hello, %d", num1);
}
int main()
{
hello();
printf("%d", num1); // 컴파일 에러. hello 함수의 지역 변수 num1은
// 함수 hello 안에서만 사용할 수 있음
return 0;
}
hello
함수 안에 선언된 지역 변수num1
은hello
함수 안에서만 사용할 수 있고, 함수 바깥에서는 사용할 수 없다.
4. 함수 선언과 정의 분리하기
- 다음과 같이
hello
함수를main
함수 아래에 작성해 보자.
#include <stdio.h>
int main()
{
hello(); // hello 함수를 찾을 수 없음. 컴파일 에러
return 0;
}
void hello() // 반환값이 없는 hello 함수 선언 및 정의
{
printf("Hello, world!\n"); // "Hello, world!" 출력
}
hello
함수가 정의되지 않았다는 컴파일 경고와 에러가 발생한다.- 왜냐하면 C 컴파일러는 소스 코드를 위에서부터 아래로 해석하는데,
main
함수 부분에서hello
함수에 대한 정보가 없기 때문이다.
- 어떤 함수가 있다는 사실을 알려주려면 함수 선언을 해줘야 한다.
- 함수 선언은 다음과 같이 반환값 자료형, 함수 이름,
()
순으로 적어주고;
을 붙인다. - 특히 여기서는 함수를 정의할 때와는 달리
{}
를 사용하지 않는다.
- 즉, 함수 형태만 선언하기에 이를 함수 원형이라 부른다.
#include <stdio.h>
void hello(); // 반환값이 없는 hello 함수 원형 선언
int main()
{
hello(); // hello 함수를 찾을 수 없음. 컴파일 에러
return 0;
}
void hello() // 반환값이 없는 hello 함수 선언 및 정의
{
printf("Hello, world!\n"); // "Hello, world!" 출력
}
// Hello, world!
main
함수 위에서void hello();
와 같이 반환값 자료형, 함수 이름,()
을 적어준 뒤;
을 붙이면hello
함수가 있다는 것을 알려줄 수 있다.- 이때 만약 함수 선언만 있고 정의가 없다면 링크 에러가 발생한다.
함수 원형과 함수 본체
- 함수 선언과 정의가 분리된 상태에서는 함수 선언 부분을 함수 원형, 함수 정의 부분을 함수 헤더(Function Header)와 함수 본체(Function Body)라고 부른다.
#include <stdio.h>
void hello(); // ← 함수 원형
int main()
{
hello(); // hello 함수 호출
return 0;
}
void hello() // ← 함수 헤더
{
printf("Hello, world!\n");
}
// ↑ 함수 본체
- 함수를 호출하는 부분 위에 함수가 정의되어 있고, 따로 함수가 없을 때는 함수 정의와 선언이 동시에 이루어진다.