본문 바로가기
Unreal/C

[C언어 01.13] 함수 선언, 호출, 반환, 여러가지 함수 유형

by 우타미 2025. 1. 13.
728x90

아마 c언어를 배우다 처음 머리가 깨질 듯 힘든 부분은 함수가 아닐까 생각해 본다.
왜냐면 내가 for문 if문 공부하고 후.. 이제 좀 괜찮겠지?라는 생각으로 함수 들어왔다가 과다 출혈로 죽을 맛을 보았기 때문이다.

1. 함수

함수란 무엇일까? 우리가 중학생 때 배웠던 그 함수 f(x) 

이렇게 생긴 함수를 생각하면 될 것 같다. 
c언어에서의 함수는 기능을 수행하는 코드 단위라고 한다. 예를 들면 printf, scanf처럼 특정 기능을 미리 만들어두고 불러내 바로 사용하는 것이다.

c언어에서의 함수 선언이란 
우리가 처음 stdio.h 표준 라이브 러리 함수를 선언하고 그 뒤에 메인함수를 작성하면서 함수들을 부르는 행위는 이미 해왔다는 소리이다! 직관적으로 보기 위해 그려본 나의 손그림

c에서 함수를 정의할 때

반환형 함수형 (매개변수, 매개변수 2)

{

함수가 수행하는 코드, 돌려보내기
}

예제코드를 확인해 보자

int sum(int a, int b)
{
	int temp;

	temp = a + b;
	return temp;
}

더하기를 위해 함수이름을 sum으로 정의했다. 반환형은 정수타입 int 매개변수도 int로 받기로 했다.

함수가 수행하는 코드는 매개변수 int a, int b를 받아 더해 temp에 저장한 후 돌려보낸다.

함수 작성은 끝냈다. 그럼 어떻게 사용하는 걸까?

우리가 코드 짜기 전 #include <stdio.h>를 쓴 것처럼 함수를 쓸 거라고 먼저 선언을 해줘야 한다.

전체 코드를 보며 이해해 보자

#include <stdio.h>

int sum(int a, int b); // 함수 선언

int main(void) // 메인함수
{
	int x = 3;
	int y = 2;
	int result;

	result = sum(x, y); // 함수 호출
	printf("%d", result); 

	return 0;
}

int sum(int a, int b) //함수 정의
{
	int temp;

	temp = a + b;
	return temp;
}

1. 컴파일러가 함수를 인식할 수 있도록 선언을 해준다. 함수 선언!

int sum (ina a, int b); 

매개변수의 이름은 생략할 수 있다.  int sum (ina , int ); 

 

2. 함수를 정의해 준다. 제일 위의 코드처럼 우리가 수행할 코드를 넣어주면 된다.

3. 만든 함수를 불러줘야 한다. 이를 함수 호출이라 하는데 이때는 함수 수행을 위한 데이터를 꼭 넣어줘야 한다.

함수명(a, b) <- 여기서 a와 b는 인수라고 부른다.

 

*함수 선언이 없으면 함수정의는 항상 함수 호출 앞에 있어야 한다!!

 

구분 설명
함수 선언 int sum(int x, int y); 함수의 형태를 알린다.
함수 원형에 세미콜론을 붙인다.
함수 정의 int sum(int x, int y)
{
return x+y;
}
함수를 만든다.
반환값의 형태, 이름, 매개변수를 표시하고
블록 안에 기능을 구현한다.
함수 호출 sum (10, 20,); 함수를 사용한다.
함수에 필요한 값을 인수로 준다.

이 표의 출처는 혼공C에서 들고 왔다. 마무리 정리가 잘 되어 있어서

 

https://product.kyobobook.co.kr/detail/S000202252289

 

혼자 공부하는 C 언어 | 서현우 - 교보문고

혼자 공부하는 C 언어 | 혼자 해도 충분하다! 1:1 과외하듯 배우는 C 프로그래밍 자습서『혼자 공부하는 C 언어』가 더욱 흥미 있고 알찬 내용으로 돌아왔습니다. 혼자 공부하더라도 막히는 부분

product.kyobobook.co.kr

나처럼 코딩찌질이가 보기 편하게 쉽게 풀어놓아서 좋은 교재 같다.

 

2. 매개변수가 없는 함수

앞의 함수에서는 메인 함수에서 a와 b의 인수를 함수 안에 넣어줬다. 하지만 넣을 필요가 없다면?

바로 예시의 코드를 보자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int sum(void); // 함수 선언

int main(void) // 메인함수
{
	int result;

	result = sum(); // 함수 호출
	printf("%d", result);

	return 0;
}
int sum(void) //함수 정의
{
	int a, b;
	int temp;
	scanf("%d%d", &a, &b);

	temp = a + b;

	return temp;
}

sum 함수 내에서 a와 b를 scanf를 통해 받아 합한 값을 int로 반환하는 과정이다. 인수가 없으니 매개변수가 들어가는 칸을 비워둔다. 

3. 반환값이 없는 함수

만약 값을 출력만 하는 기능만 필요하다면 반환을 할 필요가 있을까?
물론 반환해서 출력해도 되긴 하지만 그럴 필요가 없다는 것

예시코드를 보자

#include <stdio.h>

void sum(int a, int b); // 함수 선언

int main(void) // 메인함수
{
	int x = 3;
	int y = 2;

    sum(x, y); // 함수 호출

	return 0;
}

void sum(int a, int b) //함수 정의
{
	int temp;

	temp = a + b;
	printf("%d", temp);
}

인수를 받아 바로 출력만 하는 기능이라면 반환할 필요를 느끼지 못할 것이다. 정의한 함수 내에서 바로 printf로 값을 출력가능하다는 것 을 볼 수 있다.

 

4. 매개변수와 반환값이 모두 없는 함수

어? 그럼 이론상 scanf로 입력받고 바로 출력하는 거면 매개변수도 필요 없고 반환값도 필요 없는 거 아닌가요?

그렇다. 바로 코드를 확인해 보자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void sum(void); // 함수 선언

int main(void) // 메인함수
{
	sum(); // 함수 호출
	
	return 0;
}

void sum(void) //함수 정의
{
	int a, b;
	int temp;
	scanf("%d%d", &a, &b);

	temp = a + b;
	printf("%d", temp);

	return temp;
}

입력받자마자 바로 출력하는 함수를 만들어 보았다. 

이렇게 상황에 따라 적재적소 함수를 작성할 수 있다면 얼마나 좋을까
이상 우타미의 함수 복습이었다.

728x90