[C언어 강좌] #10 함수(Function)


 

 

안녕하세요 파일입니다. 오늘은 반복 작업을 편하게 해주는 함수에 대해 알아보겠습니다.

시작에 앞서 강의가 벌써 10강까지 제작되었습니다. 끝까지 열심히 따라 해 봅시다.

메인 함수

#include <stdio.h>

int main(){ //main 함수 정의 
	printf("Hello C World");
	return 0;
}

#2강에서 main() 함수에 대해 소개한 적이 있습니다. 기억나시나요 ^^

항상 프로그램 작성할 때마다 int main() 요건 습관처럼 써줬습니다

main 함수는 이름 그대로 프로그램이 실행될 때 가장 먼저 실행되는 "함수"입니다.

 

그럼 이제 다른 함수를 만들어보겠습니다

 

함수의 정의

함수는 왜 필요할까요? 아래 코드를 한번 봅시다.

#include <stdio.h>

int main(){ //main 함수 정의 
	int sum = 0;
	for (int i=1; i<=100; i++) sum += i;
	printf("%d \n", sum);

	sum = 0;
	for (int i=1; i<=100; i++) sum += i;
	printf("%d \n", sum);
	
	sum = 0;
	for (int i=1; i<=100; i++) sum += i;
	printf("%d \n", sum);
	
	return 0;
}

다음은 1부터 100까지의 자연수의 합을 for문으로 구현한 코드입니다.

뭐 지금이야 값도 똑같고 1부터 100까지 더하는걸 위에선 3번 했지만

그 값이 100이 아니라 매번 달라지고 그런걸 100번 하라고 시켰다 해보세요.

 

지금은 짧아 보이지만 소스코드가 기하급수적으로 늘어나고 저 i 조건을 맨날 바꿔야 하기 때문에

편의성 부분에서도 매우 불편할 겁니다.

 

반복되는 부분을 찾아 함수로 일반화를 시키면 이를 매우 간편하며, 가독성 있게 처리할 수 있습니다.

 

 

http://tcpschool.com/c/c_function_basic

 

 

함수의 선언 방법입니다. 앞에선 반환 자료형을, 중간엔 이름을, 맨 마지막엔 매개변수(Arguments)를 적어주면 됩니다.

설명만 들어선 감이 잘 안 오시죠? 예제로 보겠습니다.

 

함수의 사용

int sum(int a, int b)
{
	int result;
	result = a+b;
	return result;
}

다음은 a, b를 매개변수로 받고 합을 출력하는 함수입니다.

매개변수란 사용자가 넣어줄 값들을 의미합니다.

수학에서도 $y=3x+4$ 라는 그래프에 3을 넣으면 13이라는 값이 반환되듯이 동일합니다.

여기서는 a, b라는 정수를 받습니다.

 

a, b를 입력으로 받아서 result라는 변수에 a, b의 합을 저장하고 그 값을 return(반환) 합니다.

이 함수의 출력 형태는 int형으로 정했기 때문에 반드시 int형 을 반환해야 하며, 값을 반환 안 해서도 안됩니다.

 

그럼 이것을 main() 함수 밖에 넣고 실행해봅시다.

 

#include <stdio.h>

int sum(int a, int b)
{
	int result;
	result = a+b;
	return result;
}

int main(){ //main 함수 정의 
	sum(10,40);  //sum 함수 호출
	return 0;
}

혹시 아무것도 출력이 안돼서 이상함을 느끼셨나요? return 은 단순히 값을 반환하는 것이지 출력과는 관계가 없습니다.

이 반환된 값을 변수에 저장하여 출력하거나 printf로 출력해줘야 합니다.

 

#include <stdio.h>

int sum(int a, int b)
{
	int result;
	result = a+b;
	return result;
}

int main(){ //main 함수 정의 
	int a = sum(10,40); //a라는 변수에 10과 40의 합저장
	printf("%d", a);
	return 0;
}

50
--------------------------------
Process exited after 0.03029 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

원하는 대로 출력이 잘되었네요! 그런데 sum 부분에서도 int a 가 선언되었고 main 함수에서도 int a가 선언되었습니다

변수의 중복 선언이 아닐까 라는 생각이 들지만 실제로 sum에서 작동하는 매개변수, 중괄호 내부 변수와

main 함수 내의 변수는 서로 영향을 끼치지 않습니다. 

 

이건 지역변수, 전역 변수 부분에서 설명하겠습니다 ^^

 

#include <stdio.h>



int main(){ //main 함수 정의 
	int a = sum(10,40); //에러발생
	printf("%d", a);
	return 0;
}

int sum(int a, int b)
{
	int result;
	result = a+b;
	return result;
}

가독성을 위해 main( ) 함수를 맨 위로 올려봤습니다. 오류가 발생할 것입니다.

이유는 C언어가 절차 지향 언어이기 때문에 main 함수가 실행된 후 sum ( ) 함수를 호출하는 동작을 시행하는데

main() 함수 위에서부터 sum ()을  찾게 됩니다. 하지만 sum은 main 함수 이후에 선언되기 때문에

찾을 수가 없어서 오류가 발생합니다. 이럴 땐 함수의 원형 선언을 해주시면 됩니다.

 

#include <stdio.h>
int sum(int a, int b); //함수의 원형선언 


int main(){ //main 함수 정의 
	int a = sum(10,40); //a라는 변수에 10과 40의 합저장 
	printf("%d", a);
	return 0;
}

int sum(int a, int b)
{
	int result;
	result = a+b;
	return result;
}

코드의 차이가 보이시나요? 맨 윗줄에 함수의 선언부를 그대로 똑같이 적었습니다.

이렇게 적게 되면 sum()이 main() 아래에 있어도 원형을 보고 sum이 호출되어서 코드가 정상적으로 실행됩니다.

 

#include <stdio.h>

int main(){ //main 함수 정의 
	int sum = 0;
	for (int i=1; i<=100; i++) sum += i;
	printf("%d \n", sum);

	sum = 0;
	for (int i=1; i<=100; i++) sum += i;
	printf("%d \n", sum);
	
	sum = 0;
	for (int i=1; i<=100; i++) sum += i;
	printf("%d \n", sum);
	
	return 0;
}

그럼 처음으로 돌아와서 아까 이 코드를 함수로 간편화 해봅시다.

함수로 만들 땐 반복되는 부분을 치환하는 느낌으로 만드시면 됩니다.

 

일단 이 소스 자체는 1~100까지의 합 밖에 못 구하니 1~n까지로 일반화를 하여 함수를 만들면 됩니다.

 

#include <stdio.h>
void all_sum(int n); //함수의 원형선언 


int main(){ //main 함수 정의 
	all_sum(100);
	all_sum(100);
	all_sum(100);
	return 0;
}

void all_sum(int n)
{
	int result = 0;
	for (int i=1; i<=n; i++) result += i;
	printf("%d \n", result);
}

어떤가요? 함수를 통해 구현하니 코드가 훨씬 간결해졌습니다.

그리고 반복 작업도 수월해졌고 저 100이라는 값만 바꿔주면

얼마든지 1부터 그 숫자까지의 총합을 구할 수 있게 된 것입니다.

 

위에서 구현해본 sum 함수와 다른 점은 출력 형태가 void(없음) 이기 때문에 return으로 값을 출력할 필요가 없습니다.

그래서 함수 내에서 printf로 바로 출력해줬습니다.

 

함수의 4형태

함수의 출력형태가 있음/없음 1 / 0
함수의 입력형태가 있음/없음 1 / 0

C언어에서 함수의 형태는 4가지로 구분할 수 있습니다.

 

11 형태 (출력형태 o 입력형태 o)

int sum(int a, int b){
	return a+b;
}

 

10 형태(출력형태 o 입력형태 x)

int spit(void){
	return 100;
}

 

01 형태(출력형태 x 입력형태 o)

void print(int a){
	printf("%d", a);
}

 

00 형태 (출력형태 x 입력형태 x)

void print(){
	printf("0 0 function!");
}

 

 


오늘 강의는 여기까지 입니다. 어떤 부분을 함수로 구현하면 편할지는 프로그래밍하다 보면 감이 옵니다.

감이 빠르신 분들이라면 앞 강의의 예제를 전부 함수화 하실 수 있을겁니다.

글을 제대로 정독했다면 #2편의 main 함수 설명이 이해가 되실거구요..

 

다음 편에선 전역 변수, 지역변수, 외부 변수에 대해 알아보겠습니다. 감사합니다 ^^

COMMENT WRITE