일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- directx
- 수광 소자
- 아두이노 컴파일러
- arduino compiler
- Stack
- 시스템프로그래밍
- 라인트레이서
- 자료구조
- Array
- 컴퓨터 그래픽스
- WinAPI
- LineTracer
- Algorithm
- Arduino
- map
- vector
- list
- priority_queue
- stl
- 통계학
- c++
- set
- Deque
- 아두이노
- C언어
- Visual Micro
- queue
- 운영체제
- 아두이노 소스
- html
- Today
- Total
Kim's Programming
C언어 - 함수(function)(1/4) 본문
C언어를 흔히 함수 위주의 언어라고 하는데 이의 의미를 알아보겠습니다. 프로그램은 함수들로 구성되고 함수들이 순서대로 실행 됨으로써 프로그램이 제 기능을 발휘하게 됩니다. 함수는 프로그램을 구성 하는 단위로 부품과 같은 역할을 합니다. 또한 컴퓨터에서 cpu의 명령에 따라서 다른 기계들이 움직이듯이 프로그래밍에서는 main함수를 기준으로 함수들이 움직이게 됩니다. 이렇게 구성된 프로그래밍은 컴퓨터 처럼 한 부품이 고장나면 오작동을 하듯이 함수 하나가 잘못 작성하게 되면 제대로 동작을 하지 않게 됩니다. C++언어에서는 부품같은 함수의 역할을 하게 됩니다.
함수는 크게 사용자 지정 함수와 표준함수로 나누어지게됩니다. 사용자 지정 함수는 사용자가 직접 만들어서 사용하는 함수이며 표준함수는 C언어와 함께 작성되어 제공되며 컴파일러와 함께 배포되는 함수이며 printf 따위의 함수가 표준합수입니다. 표준함수의 특징으로는 함수의 기능에 따라 호출방법과 기능만 알면 언제든지 사용할 수 있는 것이 특징입니다. 사용자 지정 함수의 특징은 모든 기능이 표준함수에 들어가있을 수 없기 때문에 편의에 따라 직접 제작한는 함수라는 겁니다. 두 함수는 누가 만들었냐? 에 따라서 정해지는 것이지 특별한 차이는 존재하지 않습니다. 우선 함수의 기본 형식 알아보면서 가겠습니다.
Type name(인수 목록)
{
함수 내용
}
함수는 항상 다음과 같은 형식을 띄게 됩니다. 우선 각 내용들을 알아 보겠습니다.
- name : 함수의 이름입니다. 또한 이 이름을 이용하여 함수를 호출하게 됩니다. 함수의 이름도 명칭(Identifier)이므로 명칭을 만들때는 구별하기 쉽고 한눈에 파악하기 좋은 이름으로 하는것이 좋습니다. 함수의 이름엔 띄어쓰기가 불가하며 sum function 이라는 함수를 이름을 만들고 싶으면 _를 이용하여 sum_function이런 식으로 해야 합니다. 또한 파악하기 좋은 이름이란 만약 점수 출력을 위한 함수일 경우 printf_score와 같이 한눈에 파악하기 좋은 이름으로 지정하는 것이 좋습니다.
- 인수 목록 : 함수가 해야 할 일의 세부 사항을 지정하는 부분입니다. 인수에서는 함수가 필요한것을 받아 들이기 위한 경로입니다. 만약에 평균을 구하는 함수라고 하면은 함수를 받아들여서 계산을 해야하는데 그에 받아들이는 위치가 인수입니다. 인수는 함수에 필요한 갯수만큼 들어갈 수 도 있고 아예 없을 수도 있습니다.
- type : 함수가 리턴하는 값의 데이터형을 지정해 주는 부분입니다. 함수가 작업을 실행하고 나서 그 결과를 호출원에게 다시 돌려줍니다. 만약 평균 계산하는 함수를 짰으면 자신이 구한 평균을 호출원에게 보고를 하고 이때 돌려주는 값의 형식이 함수의 타입을 의미하게 됩니다. 소수점이 필요하면 double 소수점 생략해도 상관없는경우 int등을 써서 타입을 알맞게 지정해주면 됩니다.
- 함수의 본체 : 함수의 본체에는 함수가 실행하는 실제 코드가 들어가는 위치입니다. 평균을 구하는 식이 여기에 들어가면 평균을 구하는 함수가 되는 것입니다.
함수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int MAX_function(int a, int b)
{
if (a > b)
{
return a;
}
if (a < b)
{
return b;
}
}
void main()
{
int num_1 = 0, num_2 = 0, MAX = 0;
printf("숫자 2개를 입력하세요", num_1, num_2);
scanf("%d %d", &num_1, &num_2);
MAX = MAX_function(num_1, num_2);
printf("입력 한 수중 큰수는 다음과 같습니다 = %d", MAX);
} |
cs |
다음의 코드는 두 수를 입력받아서 최대 값을 출력시켜 주는 코드입니다. 우선 위에서 보았던 함수의 형태를 가지며 인수를 2개를 가지고 있는 MAX_function 이라는 이름을 가진 함수가 있고 조건이 들어감에 따라 return 이라는 것도 보입니다. 각각이 무슨 의미일까요? 차례 차례 알아보겠습니다. 우선 함수는 main함수를 기준으로 통제되고 움직이므로 main 함수를 기준으로 보겠습니다. 18번째 줄에 선언된 변수에 20번째 줄에서 변수 2개가 입력이 되는게 보이나요? 그리고 21번째 줄을 보면 이상한 내용이 있습니다. MAX 라는 변수에다가 함수를? 이라는 생각이 듭니다. 하지만 어떻게 되는 의미일까요? 인수 2개를 받았다고 a = 10, b= 5 를 받았다고 생각하고 위의 MAX_function이라는 함수에서 어떻게 작동하는지 알아보겠습니다. 우선 함수에 들어간 두 변수는 if 문들에 의해서 판단을 하게 됩니다. 만족하는 조건문은 if(a>b)인 조건이네요. 그런데 이 안에 return 이라는 것은 또 무엇일까요? 위에서 type이라는 글을 읽을때 리턴하는 값의 데이터형을 지정해 준다고 하였습니다. 인수 2개를 받아서 내부에 있는 조건문에 따라 비교를 한뒤 a가 더 큰경우 a라는 값을 int의 형태로 리턴을 한다. 즉 21번째 줄에서 우항은 a를 리턴했기 때문에 10이라는 값을 가지게 되고 MAX라는 변수도 int 형으로 선언이 되어 있으므로 10이라는 값을 가지게 됩니다. 따라서 최종적으로 이 코드는 큰수를 10이라고 출력하게 되는 것입니다.
하지만 왜 함수를 사용할까요? main 함수에서 일일이 넣어서 구성할 수 도 있을텐데요. 다음과 같은 함수는 2개의 값만 비교하는건데 예를 들어서 더 복잡한 여러가지 연산을 한다고 했을때 main 함수에 다 넣어두면 줄도 길고 변수도 많고 복잡하기만 할것입니다. 하지만 함수를 나누어서 main 함수와 분리를 시켜버리면 연산에 따른 함수들을 나누어서 알아보기도 좋고 main함수도 간단해 져서 보기 좋을 것 입니다. 또한 특정 기능이 필요할 때 한번 만들어 놓은 함수를 언제 어디서든 계속 호출만 하면 되기 때문에 쓸데없는 코드의 반복을 줄일 수도 있습니다. 이런 특징으로 함수를 부품이라고 말을 할 수 있습니다. 추가로 함수에 리턴값이 없는 경우에는 int 라는 반환형을 쓰는 대신에 void 라는 반환이 없다는 형태를 이용하여 선언하면 됩니다. (예를 들자면 void print()) void 형은 따로 뒤에서 더 설명하겠습니다.
인수
인수(Parameter)는 호출원에서 함수에게 넘겨주는 작업 대상입니다. 두 함수 사이의 정보 교환에 사용하므로 다른말로 매개변수(Argument)라고도 합니다. MAX_function함수에서는 함수에서 2개의 정수를 비교 큰수를 리턴하는 기능을 하므로 비교할 2개의 정수를 입력받아야 하기에 인수로 int a, int b를 인수목록에 지정해 주었습니다. 예를 들어서 math헤더의 제곱근을 구하는 sqr()함수는 다음과 같은 인수를 가지고 있습니다. sqr(double x) 다음과 같이 필요한 갯수에 따라서 함수를 가지게 됩니다.(제곱근은 한 수에대해서만 구하기 때문에 인수는 한개!) 물론 작업 대상에 함수가 필요가 없는 경우라면 인수는 사용하지 않는 경우도 있습니다. 예를들어 conio헤더에 들어있는 콘솔의 화면을 지우는 clrscr()이라는 함수는 인수를 받는 다기 보단 화면을 지우는 행위가 지정된 함수이기 때문에 따로 인수가 들어가있지 않습니다. 예를 들어 clrscr()라고 그냥 써도 되며 인수가 없다는 의미로 clrscr(void)라고 작성도 가능합니다. 인수라고 하는 것은 형식인수와 실인수로 구분이 됩니다. 영어로 할때는 형식인수를 Parameter 실인수를 Argument 라고 구분을 합니다. 위에서 사용했던 코드에서 확인을 하면 4번째 줄에 들어간 인수들을 Parameter(형식인수)라고 하며 21번째 줄에 들어간 인수들을 Argument(실인수)라고 칭하게 됩니다. 형식인수와 실인수는 이름이 같을 필요는 없지만 형태는 같아야 합니다. 또한 실인수엔 상수를 넣어서 최대값을 구하는 것도 가능합니다.(예를 들어 Max_function(3,4) 등으로) 또 형식 인수는 전달한 실인수의 임시 저장 장소정도의 역할을 한다고 보면 됩니다.
return
함수에서 최종 함수값을 리턴 시킬때는 return문을 사용 하는것은 위의 코드를 보면서도 알 수 있었습니다. return문의 기능은 다음과 같습니다. 가장 일반적으로는 함수의 결과값을 호출원으로 돌려주는 기능입니다. 위의 코드에서는 비교뒤 큰값을 리턴 시키도록 만들었습니다. 또 호출원에서는 타입만 일치한다면 함수가 리턴하는 값을 곧바로 사용 가능합니다. 예를 들면 위의 코드에서 나오는 리턴값을 바로 출력시키기 위해서 %d에 대응하는 인수로써 함수를 사용할 수 도 있습니다. 또 다른 기능으로는 함수를 강제로 종료시키는 기능을 하기도 합니다. 함수를 강제로 다음과 같이 작성하게 되어 함수를 강제로 종료 시킵니다. 이 기능은 따로 코드를 통해서 알아보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int function(int a, int b)
{
if (b==0)
{
return 0;
}
else
{
return a/b;
}
}
void main()
{
int num_1 = 0, num_2 = 0, end = 0;
printf("두 수를 입력하세요");
scanf("%d %d", &num_1, &num_2);
end = function(num_1, num_2);
printf("최종결과 = %d\n", end);
} |
cs |
함수를 실행중에 return 0;를 만나면 함수의 뒷부분에 어떤것이 있든 무시되고 함수를 종료시켜버림과 동시에 호출원으로 돌아가는 역할을 하게 됩니다. return문의 함수 강제 종료 기능은 대부분 인수의 유효성을 검사할 때 많이 이용됩니다. 예를 들면 0으로 나눈다거나 오류가 발생할 수 밖에 없는 경우를 예외삼기 위해서 만들게됩니다. 위의 코드의 경우도 분모가 0이 되는 경우엔 함수를 종료 시켜 버리도록 해놨습니다. 이런식으로 치명적인 오류를 미연에 방지할 수 있는 것입니다. 함수에서 return 0가 함수의 끝을 의미하게 된다면 main함수에서 쓰이게 되면 어떻게 될까요? 메인 함수는 프로그램의 주축이기 때문에 프로그램이 종료되게 됩니다. 그렇기 때문에 이는 stdlib 함수의 exit(0)함수와 같은 효과를 가지게 됩니다.
void형 함수
함수는 리턴값을 돌려줄 수 있지만 모든 함수가 리턴값을 돌려주지는 않습니다. 위에서도 미리 조금 소개했듯이 리턴값이 없는 함수의 경우를 void 형 함수라고 합니다.void 라는 단어의 뜻 비어있다는 말 처럼 아무런 값도 리턴하지 않는 함수를 의미하게 됩니다. 예를 들면 단순 텍스트 출력을 하거나 효과음을 낸다던지 그냥 계산 결과를 리턴할 필요가 없는 경우에는 void 형태의 함수를 사용하면 됩니다. void형은 반환값이 없기 떄문에 리턴값을 쓰지 말아야 합니다. 다음 예시를 이용해서 설명을 잇겠습니다.
1
2
3
4
5
6
7
8
9
10
11 |
#include<stdio.h>
void print()
{
printf("출력을 위한 함수입니다 \n");
}
void main()
{
print();
printf("출력은 잘 됐나요?\n");
} |
cs |
다음함수는 void 형태의 사용자지정 함수를 가지고 있습니다. 단순히 출력하는 경우는 특별히 리턴값을 돌려줄 필요가 없기 떄문에 다음과 같이 void 형태로 선언을 하게되었습니다. 다음 코드의 결과는 다음과 같이 나옵니다.
리턴 값으로 출력이 되는 것이기 떄문에 다음 함수의 출력은 문제없이 되게 됩니다.
function! 함수라고 하는 뜻 뿐만아니라 기능, 작용, 직무, 함수, 행사 등등의 다양한 뜻이 있는데 함수라고 번역하게 된 이유가 수학자들이 주로 컴퓨터를 사용했기 때문이라고 합니다. 수학적인 의미의 함수는 계싼을 통해 단 하나의 출력값을 만들어내는 수식을 의미합니다. 하지만 C언어의 함수는 단순하게 계산이나 수학적으로 대응 되는 값을 출력하는거보다도 훨씬더 많은 동작을 할 수 있어서 function을 함수라고 하는 것은 올바르지 않다고는 합니다. 다음으로는 C언어의 다른 언어들과 다른 함수의 특징에 대해서 알아보도록 하겠습니다.
- 함수끼리는 서로 평등한 관계에 있으며 상호 수평적입니다. 즉 함수끼리 언제나 호출이 가능하다는 뜻이며 한 함수가 다른함수에 예속되지 않습니다. 반면 파스칼은 함수 내부에 지역함수를 정의할 수 있어 함수 끼리 수직적인 계층을 이룰 수 있습니다.
- 함수 중에서 가장 기본이 되는 함수를 main이라고 하며 프로그램의 시작점이 됩니다. 하지만 main함수가 다른 함수들과 특별하게 다르지는 않으며 단지 프로그램의 시작이라는 것에서 특별함을 가지게 됩니다.
- 리턴값을 존재할 수도 없을 수도 있습니다. 리턴값이 있는 함수는 반환 타입을 가지게 되며 그렇지 않은 함수는 void형으로 선언하면 됩니다.
- 항상 단독으로 문장을 구성할 수 있습니다. 리턴 값이 없는 함수는 단독으로 사용 할 수도있고 리턴 값이 없는 함수는 수식내에서 쓸수도 있고 단독으로도 사용이 가능합니다. 값을 리턴하는 함수라고 해서 반드시 리턴값을 반환할 필요도 없으며 버릴수도 있습니다.
- 값에 대한 호출방식을 사용합니다. 실인수가 형식인수에 대입될 떄 항상 값이 대입된다는 뜻입니다.
'Programming > C' 카테고리의 다른 글
C언어 - 함수(function)(3/4) (0) | 2015.08.05 |
---|---|
C언어 - 함수(function)(2/4) (0) | 2015.07.31 |
C언어 - 연산자(2/2) (1) | 2015.07.22 |
C언어 - 연산자(1/2) (0) | 2015.07.20 |
C언어 - 제어문! 소스 일부를 통제한다!(2/2) (0) | 2015.07.15 |