[C언어-막코딩] 22장 사용자 정의 함수

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@codingman·
0.000 HBD
[C언어-막코딩] 22장 사용자 정의 함수
# [C언어-막코딩] 22장 사용자 정의 함수
-----
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php

-----
지난시간까지 포인트 변수에 대해 초급편으로 간단히 사용 방법에 대해 설명했습니다.  계속 포인트 개념을 다뤄야 하지만 그러면 너무 재미가 없고 오히려 C언어에 대한 거부감이 생길 수 있기 때문에 여기서 멈춥니다. 오늘 다룰 내용은 사용자 정의 함수에 대해 이야기 하고자 합니다. 딱 한마디로 정의하자면 프로그래머가 직접 만든 함수를 말한다.

그럼 시작해 봅시다.

## 1. 사용자 정의 함수
-----
<center>
![a1.jpg](https://cdn.steemitimages.com/DQmNiCDRDvN7gnd5Ehf3Qp1ZjZdQqycwkpgvHb2oJ1ivw4o/a1.jpg)
</center>

위 그림에서 보는 것처럼 사용자 정의 함수에는 외부로부터 인자(값)는 받을 때는 함수안에 인자표시 합니다. 반환 할 때는 그 값을 반환하는 데이터 형으로 함수명 앞에 붙여 줍니다.

### 함수의 형태
-----
데이터형과 인자(전달값)를 기준으로 함수의 형태가 나뉘는데 몇가지 형태로 정의하도록 하죠. 참고로 데이터형이 없는 형태에서는 void라는 키워드를 붙입니다.

**반환값이 없고 인자가 없는 함수 :**
```
void output(){   
    printf("hello \n");
}
```
**반환값이 있고 인자가 없는 함수 :**
```
int  add(){
   int a=1;
   int b=2;
  
  return a+b;
}
```
**반환값이 없고 인자가 있는 함수 :**
```
void add(int a, int b){
	int sum=0;	
	sum = a+b;	
	printf("%d+%d=%d \n",a,b,sum);
}
```

**반환값이 있고 인자가 있는 함수 :**
```
int add(int a, int b){
	int sum=0;	
	sum = a+b;	
	return sum;
}
```
인자나 데이터형이 있는 경우에는 그대로 자료형과 변수명을 기입하시면 됩니다. 그외에 없는 경우는 void를 붙여주어 명확하게 정의를 내립니다. 그리고 return 키워드는 단어 뜻 그대로 반환 되는 값을 말합니다. return 키워드는 함수명 앞에 데이터형이 있고 그 데이터형이 반환되는 값의 자료형으로 보시면 됩니다. 

나중에 사용자 정의 함수를 복잡하게 수십줄 이상 코딩하다 보면  반환값이 있는지 없는지 어떤 값이 반환되는지를 식별하는게 바로 함수명 앞에 붙어 있는 데이터형입니다. 함수명 앞에 데이터형이 정의되어 있으면 이 사용자 정의 함수는 반환값이 있고 어떤 데이터형인지 바로 알 수 있게 됩니다.

## 2. 사용자 정의 함수 표현
-----
두가지 형태가 있습니다.

```
#include <stdio.h>

void aaa();

int main(int argc, char *argv[]) {
	aaa();	
	return 0;
}	

int aaa(){
	처리문
	return 값;
}
```
위와 같이 main()함수 앞에 사용자 정의 함수만 선언하고 main()뒤에 사용자 정의 함수의 실제 코딩 부분을 코딩하는 형태가 있습니다.

다음 형태는 아래와 같습니다.
```
#include <stdio.h>

int aaa(){
	처리문
	return 값;
}

int main(int argc, char *argv[]) {
	aaa();	
	return 0;
}	
```
이렇게 아애 main()함수 앞에다 사용자 정의 함수의 코딩 부분을 전체 표현하는 방식입니다. 

이 두 가지 방식은 차이라면 가독성에 있습니다. 앞에다가 사용자정의 함수만 선언 해 놓고 main()함수의 코딩을 편하게 하고 사용자 정의 함수들의 한수명에 따라 main()함수의 코딩 해독은 물론 코딩하는데 가독성이 높일 수 있습니다. 그래서 첫번째 방식을 추천 드립니다. 사용자 정의 함수명만으로도 해당 함수가 어떤 동작을 하는지 쉽게 이해할 수 있기 때문입니다.
두번째 경우는 사실 main()앞에서 사용자 정의 함수를 쭉 나열해도 상관 없지만 사실 사용자 정의 함수의 가독성이 떨어지고 후반부에서 main()함수가 각 사용자 정의 함수들을 찾아서 코딩의 의미를 이해야 하기 때문에 수십 수백줄의 코딩에서는 가독성이 떨어집니다.

그냥 두 가지 경우가 있는데 첫번째 경우를 추천드립니다.

## 3. 코딩
-----
그러면 위 사용자 정의 함수들을 실제로 코딩해서 실행해 봐야 겠죠. 실제 결과를 봐야 더 이해가 빠를 거라 생각 됩니다.

**[소스]**
```
#include <stdio.h>

void add1(); // 반환값이 없고 인자가 없는 함수
int add2(); // 반환값이 있고 인자가 없는 함수
void add3(int a, int b); // 반환값이 없고 인자가 있는 함수
int add4(int a, int b); // 반환값이 있고 인자가 있는 함수

int main(int argc, char *argv[]) {
	int sum=0;
	
	add1();
	sum= add2();
	printf("sum=%d \n",sum);
	add3(1,2);
	
	sum= add4(1,2);
	printf("sum=%d \n",sum);
	
		

	return 0;
}	

void add1(){
	int a=1, b=2;
	int sum=0;
	sum = a+b;	
	printf("%d+%d=%d \n",a,b,sum);
}


int add2(){
	int a=1,b=2;
	int sum=0;
	sum = a+b;	
	return sum;
}
void add3(int a, int b){
	int sum=0;	
	sum = a+b;	
	printf("%d+%d=%d \n",a,b,sum);
}
int add4(int a, int b){
	return a+b;
}
```
코딩이 좀 길어 졌네요. 쪼개서 각각의 사용자 정의 함수들의 결과를 잘 읽어보시면 어렵지 않을 거에요.

**[결과]**
![a2.jpg](https://cdn.steemitimages.com/DQma7eUEYfK2y46xsWtTcBccvBCkkLhvAU4Yf8oGSm9gLXa/a2.jpg)


## 마무리
-----
사용자 정의 함수는 왜! 쓰는 걸까요. 한마디로 말하면 main()함수의 코딩을 간결하게 하기 위해서 입니다. 만약 main()함수 안에다 전체 코딩을 다 한다면 너무 길어지가 각 명령어의 처리 동작을 나중에 구분할 때 가독성이 떨어집니다 코딩을 수정하고자 할 때가 수정한 한줄로 인해 전체 소스가 영향을 미칠 수 있습니다. 그 오류를 줄이기 위해 각 동작 명령들을 각각 나누어 사용자 정의 함수로 만들어서 외부로 빼놓으면 어떤 특정한 동작을 수행하고자 할 때 해당 동작을 수행한 사용자 정의 함수만 수정하면 되기 때문에 오류률을 줄일 수 있습니다.

쉽게 말해서 자동차를 만드는데 자동차 전체를 main()함수에 넣어 놓으면 나중에 바퀴를 바꿀 때 바퀴가 어디서 부터 어디 인지 자동차에 맞는 사이즈 인지 확인하는데 오래 걸리고 어디서 부터 바퀴를 분해와 조립을 해야하는지 main()함수 전체를 봐야 확인하고 수정해야 알 수 있습니다. 하지만 외부 함수로 각각 핸들이면 핸들 바퀴면 바퀴 이렇게 분리해 놓으면 해당 부품만 따로 교체하면 되기 때문에 main()함수 전체를 일일히 체크할 필요가 없어집니다. 이 설명은 원래 나중에 클래스 개념에서 설명할 때 비유하는 내용인데 사용자 정의 함수에 대해 설명할 때 비유로서 적당하니 이렇게 이해해 주시면 됩니다. 나중에 C++을 배울 때 클래스 객체에 대한 개념도 확장된 개념을 이해 하시면 됩니다. 클래스는 변수와 함수들을 하나의 객체로 묶어 놓은 틀로 보시면 되는데 이 부분은 나중에 기회가 되면 이야기 하겠습니다.

지금은 사용자 정의 함수가 어떻게 표현되고 사용하는지만 위 예제를 보시고 간단히 이해 하시면 됩니다.  main()함 안에서 뭔가 특정한 동작들을 코딩할 때 그 동작을 하나의 묶음 이름으로 표현 할 수 있으면 사용자정의 함수로 만들어서 사용하시면 main()함수가 간결해진다는 개념만 잡아 놓으시면 됩니다. 즉, main()함수에서 로또 프로그램을 만들 때 여러 동작 중 특정 하나의 동작으로 6개의 로또 번호를 얻는 명령을 수행하고자 한다면 lotto()함수로 만들어서 6개의 로또 번호를 추출 동작을 수행하게 하면 나중에 main()함수에서는 이 한줄로 뭔가 로또 동작을 수행시키고 main()함수 내에 코딩된 다른 코딩들과 구분하여 쉽게 이해 할 수 있습니다. 무슨 의미인지 아시겠지요.

---

#####  <sub> **Sponsored ( Powered by [dclick](https://www.dclick.io) )** </sub>
[![dclick-imagead](https://s3.ap-northeast-2.amazonaws.com/dclick/image/dclick/1552477485946.png)](https://api.dclick.io/v1/c?x=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjIjoiY29kaW5nbWFuIiwicyI6ImMtMjItLTE1NTU2MzIzMjYzNDkiLCJhIjpbImktMTk1Il0sInVybCI6Imh0dHBzOi8vd3d3LmRjbGljay5pby9tb25ldGl6ZSIsImlhdCI6MTU1NTYzMjMyNiwiZXhwIjoxODcwOTkyMzI2fQ.RW3XzFKS57LdlBDsaxKaXbGG9ckDvF-O0XTzGAl8Wx4)
👍 , , , , , , , , , , , , , , , , , , , , , , , , , ,