C 언어 - 함수

컴퓨터/C

728x90
반응형

함수란 무엇인가?

C언어에서 함수는 작성된 소스코드를 묶어서 하나의 기능으로 만들어주는 역할을 합니다. 

프로그램에서 함수는 프로그램을 실행하는 하나의 단위가 됩니다. 

아래의 예제로 함수 단위로 설명을 해보겠습니다.

#include <stdio.h>
int main()
{
	int number = 10;
	printf("함수에 대하여 알아봅시다\n");
    
    return 0;
}
  • main 함수에는 int형 변수 하나가 선언되어 있고 printf함수를 실행시킨다. 
  • main 함수가 실행된다 ( main 함수 안에 작성된 소스코드가 실행된다.)
  • int 형 변수 number에 10을 넣는다.
  • printf 함수가 실행된다 ( printf 함수 안에 작성된 소스코드가 실행된다.)
  • 함수의 실행을 한다 = 함수 안의 소스코드를 실행한다. 
  • main 함수를 실행을 한다 = int형 변수 선언 / printf 함수 실행
  • printf 함수를 실행을 한다 = 그 안에 있는 소스코드를 실행한다.

결국 함수를 실행하는 것은 소스코드 묶음을 실행하는 개념입니다. 함수를 사용하면 다음과 같은 장점을 얻을 수 있습니다.

  • 중복되는 코드를 줄일 수 있다.
  • 재사용성이 증가된다.
  • 유지보수가 용이하다.

 

함수의 종류

함수는 크게 2가지 종류로 구분될 수 있습니다.

  • 라이브러리 함수
    • 누군가 이미 만들어 놓은 함수
    • 함수 안의 소스코드는 이미 기계 어화 되어 있다. 
    • 함수를 사용하기 위해 함수의 이름과 정보가 있는 헤더 파일이 필요하다.
    • 지금 우리가 사용하는 표준 입출력 라이브러리 또한 이러한 구조로 되어있다.
  • 사용자 정의 함수
    • 사용자가 직접 만들어 사용하는 함수
    • 소스코드의 내용 또한 볼 수 있다.

결국 두 함수 모두 소스코드를 함수화 시켜 사용자가 조금 더 편리하게 사용할 수 있게 만든 개념입니다. 

본문에서는 사용자 정의 함수를 만들어보고 활용해 보는 것에 중점을 두도록 하겠습니다. 

라이브러리 함수의 경우 추후에 좀 더 자세히 다뤄보도록 하겠습니다.

 

 

함수의 선언과 정의

사실 지금까지 우리는 항상 main함수를 선언과 정의해서 프로그램을 만들어 봤습니다. 

이제 사용자 정의 함수를 선언과 정의해서 함수를 만들어 보도록 합시다.

함수의자료형 함수의이름(매개변수의자료형 매개변수의 이름, ....)
{
    소스코드 ~~~;
    return 리턴항목;
}
  • 함수를 선언을 하기 위해서 함수의 자료형과 함수의 이름이 필요합니다.
    • 함수의 자료형은 함수가 끝남을 알리는 return 이후에 결괏값을 제출할 형태를 구분합니다.
    • 함수의 이름은 함수를 호출(실행) 하기 위한 이름을 정의합니다.
  • 함수의 이름과 자료형을 정하였으면 괄호()를 이용하여 매개변수를 추가할 수 있습니다.
    • 매개변수는 함수를 시작하기 전에 받을 정보들을 의미합니다.
    • 변수의 선언과 마찬가지의 형태로 받을 정보들의 형태를 정의해 줍니다.
    • 매개변수는 개수에 제한은 없습니다.
  • 중괄호{}를 이용하여 함수의 범위를 나타내며 함수 안의 소스코드를  작성하고 끝을 알리는 return을 써 줍니다.
    • 소스코드는 함수가 실행되면서 작동할 소스코드를 의미합니다. 
    • 이 안에서 매개변수로 들어온 값 또한  자유롭게  사용 가능합니다. 
    • return으로 함수의 마지막을 알리며 제어할 수 있고, 함수의 자료형과 동일한 형태의 값을 반환할 수 있습니다.

함수의 자료형

함수의 자료형은 기본자료형과 사용자 정의 자료형 모두 사용할 수 있습니다. 함수가 끝나면서 제공할 값의 데이터 타입을 정의 내립니다.

2가지 정도 기본 자료형을 가지고 함수 선언을 해보도록 하겠습니다.

#include<stdio.h>

void func_void()
{
	printf("아무것도 반환하지 않는 함수의 자료형 입니다.\n");
	return ;
}

int func_int()
{
	printf("이 함수는 int 타입의 데이터를 반환 합니다.\n");
	return 1;
}

void 타입의 자료형을 이용하면 해당 함수는 종료 시 아무 반환이 없는 형태의 함수가 됩니다.

int 타입의 자료형을 이용하면 해당 함수는 종료 시 return 뒤에 있는 값을 반환을 합니다.

 

함수의 매개변수

함수의 매개변수는 처음 함수를 실행 할기 전 기초 정보가 됩니다. 매개변수는 개수는 제한이 없지만 해당 함수 안에서 선언되는 변수들의 이름과 혼동이 되지 않게 해야 됩니다.

#include<stdio.h>

void func_voidplus(int a, int b)
{
    printf("아무것도 반환하지 않는 함수의 자료형 입니다.\n");
    printf("%d + %d = %d 입니다.\n",a,b,a*b);
	return ;
}

int func_intplus(int a, int b)
{
    printf("이 함수는 int 타입의 데이터를 반환 합니다.\n");	
    printf("%d + %d = %d 입니다.\n",a,b,a*b);
	return a*b;
}

두 함수 다 초기 매개변수 a와 b를 받고 함수 안에서 이용할 수 있습니다.

 

함수의 호출

함수를 선언하고 정의가 완료되면 그 함수를 main함수든 어떤 다른 곳에서든 실행을 시킬 것입니다. 이런 실행시키는 행위를 함수의 호출이라고 합니다. 함수를 호출하기 위해서는 정의된 함수에 정확한 매개변수를 전달해야 됩니다. 

#include<stdio.h>

void func_voidplus(int a, int b)
{
    printf("아무것도 반환하지 않는 함수의 자료형 입니다.\n");
    printf("%d + %d = %d 입니다.\n",a,b,a*b);
	return ;
}

int func_intplus(int a, int b)
{
    printf("이 함수는 int 타입의 데이터를 반환 합니다.\n");	
    printf("%d + %d = %d 입니다.\n",a,b,a*b);
	return a*b;
}

int main()
{
    int a = 10;
    int b = 20;
    float c = 0.5;
    
    func_voidplus(a,b);
    func_voidplus(b,c); // 에러 발생 선언된 자료형과 다름 !
    return 0;
}

함수의 4가지 형태

함수는 본문에서 설명한 것과 같이 다양한 형태로 정의 내리고 사용할 수 있습니다. 크게 4가지 형태로 구분 지을 수 있습니다.

  • void 함수명()
    • 매개변수 X 
    • 반환 X

  • void 함수명(매개변수..)
    • 매개변수 O
    • 반환 X

  • 자료형 함수명()
    • 매개변수 X 
    • 반환 O

  • 자료형 함수명(매개변수)
    • 매개변수 O
    • 반환 O

함수 활용해보기

예제 1) void 함수명() 

#include <stdio.h>

void menu_print()
{
	printf("게임을 시작합니다.");
	printf("1. 공격");
	printf("2. 방어");
	return;
}

int main()
{
	menu_print();
	return;
}
  • 항상 프로그램의 시작은 메인 함수부터 진행을 합니다.
  • 메인 함수에서 menu_print();함수를 호출합니다.
  • menu_print함수의 소스코드가 실행됩니다. 
  • menu_print안의 return을 만나 menu_print함수는 종료되며 다시 main문의 menu_print아래의 소스코드를 진행합니다.

예제 2) void 함수명() - 함수 안에 함수 써보기

#include <stdio.h>

void endline()
{
	printf("\n");
	return;
}

void menu_print()
{
	printf("게임을 시작합니다.");
	endline();
	printf("1. 공격");
	endline();
	printf("2. 방어");
	endline();
	return;
}

int main()
{
	menu_print();
	return;
}
  • 예제 1의 경우 줄 넘김을 printf에 넣지 않았습니다. endline라는 함수를 만들어서 menu_print함수에 안에 넣어 봤습니다.
  • main 함수 호출 
  • menu_print함수 호출
    • 게임을 시작합니다 출력
    • endline 함수 호출
      • 줄넘김 실행 및 함수 종료
    • 1. 공격 출력
    • endline 함수 호출...
    • 함수가 종료될 때까지 계속 순차적 진행
  • main함수의 return문을 만나 종료

예제 3) void 함수명(매개변수) 

#include <stdio.h>

void endline(int count)
{
	for (int i = 0; i < count; i++)
	{
		printf("\n");
	}
	return;
}

void menu_print()
{
	printf("게임을 시작합니다.");
	endline(2);
	printf("1. 공격");
	endline(1);
	printf("2. 방어");
	endline(1);
	return;
}

int main()
{
	menu_print();
	return;
}
  • 줄 넘김을 하는 endline 함수에 매개변수 int count를 넣었습니다. 그리고 count값을 받은 함수는 for문을 통해 줄 넘김의 횟수를 제어할 수 있게 만들 수 있습니다.

예제 4) 자료형 함수명() 예제

#include <stdio.h>

void endline(int count)
{
	for (int i = 0; i < count; i++)
	{
		printf("\n");
	}
	return;
}

void menu_print()
{
	printf("게임을 시작합니다.");
	endline(2);
	printf("1. 공격");
	endline(1);
	printf("2. 방어");
	endline(1);
	printf("원하는 명령을 입력하세요 : ");
	return;
}

int input_command()
{
	int num;
	scanf_s("%d", &num);
	return num;
}

int main()
{
	int menu_number;

	menu_print();
	menu_number = input_command();
	return;
}
  • int input_command() 함수를 정의했습니다. 함수 안에서 num이라는 변수에 값을 입력받고 함수가 종료될 때 num에 담긴 값을 반환해 줍니다.
  • main 함수에서 menu_number의 변수에 input_command 함수를 호출했습니다. 함수가 종료되며 반환되는 값을 받아 menu_number에 저장합니다.

예제 5) 자료형 함수명(매개변수)

#include <stdio.h>

void endline(int count)
{
	for (int i = 0; i < count; i++)
	{
		printf("\n");
	}
	return;
}

void menu_print()
{
	printf("게임을 시작합니다.");
	endline(2);
	printf("1. 공격");
	endline(1);
	printf("2. 방어");
	endline(1);
	printf("원하는 명령을 입력하세요 : ");
	return;
}

int input_command()
{
	int number;
	scanf_s("%d", &number);
	return number;
}

int Att(int userAtt, int comHP)
{
	printf("공격합니다 ! \n");
	printf("적의 남은 체력은 %d 입니다!\n", comHP - userAtt);
	return comHP - userAtt;
}

int Def(int comAtt, int userHP)
{
	printf("방어합니다 ! \n");
	printf("나의 남은 체력은 %d 입니다!\n", userHP - comAtt);
	return userHP - comAtt;
}

int main()
{
	int menu_number;
	int userHP = 100;
	int userAtt = 10;

	int comHP = 50;
	int comAtt = 5;

	menu_print();
	menu_number = input_command();

	if (menu_number == 1)
	{
		comHP = Att(userAtt, comHP);
	}
	else if (menu_number == 2)
	{
		userHP = Def(comAtt, userHP);
	}
	else
	{
		printf("잘못된 값을 입력했습니다.");
	}
	return;
}
  • Att와 Def 함수를 만들었습니다.
  • 그리고 유저의 공격력과 체력 / 컴퓨터의 공격력과 체력을 변수로 선언을 했습니다.
  • input_comand함수의 호출 후 menu_number의 값에 따라 if else if를 이용해 각각 공격과 방어 함수를 호출합니다.
  • 호출된 함수에서는 유저와 컴퓨터가 전투를 하여 남은 체력을 반환하여 줍니다.
  • 이 반환한 체력 값을 설정된 컴퓨터와 유저의 체력에 각각 적용시켜 줍니다.

이처럼 함수의 형태를 자유롭게 이용하여 사용해보고 적용해 보세요.

이런 함수들을 잘 사용한다면 공격을 100번 하기 위해선 100번의 함수 이름만 적으면 됩니다(재사용성)

공격을 수정하기 위해선 100번의 수정이 아닌 함수가 정의된 부분의 수정만 하면 됩니다(모듈화)등 장점이 많으니 다양한 형태의 함수를 자유롭게 사용할 수 있도록 해봅시다.

 

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - 지역변수와 전역변수  (0) 2021.06.08
C 언어 - 용어 알아보기  (0) 2021.06.08
C 언어 - 제어문 break / continue / return  (0) 2021.06.05
C 언어 - 반복문 do while문  (0) 2021.06.05
C 언어 - 반복문 for  (0) 2021.06.04

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :