/********************************************************************************
제작자: 신대용
제작일: 1월 18일 화요일
제작시작시간: 20시 36분
여기까지 제작시간: 1월 20일목요일 11시 35분(도중에 이런저런일이;;)
********************************************************************************/
1)함수의 형식
많은 분들이 함수를 어렵다고 하시는데 그건 함수의 형식을 외우지 않아서입니다.
C언어는 '언어'입니다. 따라서 문법이 있습니다. 이것을 지키지 않으면 안되는 것이죠^^
함수의 형식을 볼까요?
|
리턴 타입 함수이름( 인수들 ){
함수의 내부
}
|
함수의 이름 (Name):
함수의 이름은 보통 그 함수가 하는일과 관련지어 정합니다. 그렇게 함으로써 함수가 하는일을 쉽게
알수있고 그 함수속에서 무슨일을 하는지 몰라도 되는 이점이 있습니다.함수의 이름역시 이름 명명법을 따릅니다. 첫글자는 영문으로
시작하며 특수문자는 사용할 수 없습니다. 빈칸도 안된답니다.
함수의 인수(Parameters,인자) :
간단히 설명하면 함수가 외부로부터 받아들이는 값을 인수, 혹은 인자라고 부릅니다. 외부에서
받아들이는 값이 없으면 void라고 써놓거나 비워 두세요, 인수로 들어온값은 변수에 대입되어 함수이 내부에서 사용되게 됩니다.
이부분을 상당히 어려워 하시는 분이 많아 이후에 좀더 자세하게 다루겠습니다.
리턴 타입(Return type) :
함수는 return 문을 이용하여 어떤 값(return value)을 함수를 부른 대상에게
알려줄 수 있습니다. return type은 결과값의 type과 동일 해야합니다. 만약 결과(return value)가
int라면 리턴타입도 int이어야 하고 반대로 리턴타입이 int라면 결과(return value)도 int이어야 합니다.
리턴타입을 명시해주지 않으면 일반적으로 int가 리턴타입으로 적용이 됩니다만 타입을 명시해 주지 않는 것은 좋은 프로그래밍
습관이 아닙니다.
*리턴값==결과값?!
"함수는 return 문을 이용하여 어떤 값(return value)을 함수를 부른 대상에게
알려줄 수 있습니다." 라고 말했습니다. 보통 입문서에서는 이 return 값을 결과값이라고도 합니다. 하지만 엄연히
결과값이라기 보다는 return value,리턴값이라고 말하는 것이 좋습니다.^^ 그차이는 많은 예제를 통해서 보여드리겠습니다.
형식에 맞는 함수의 예
|
예1)
int triple(int number){
return number*3;
}
|
예2)
triple(int number){
return number*3;
}
|
예3)
int multiple(int n1, int n2){
return n1 * n2;
}
|
|
예4)
float div(float n1, float n2){
return n1 / n2;
}
|
예5)
void print_hello(void){
printf("Hello World!");
}
|
예6)
int print_hello(void){
printf("Hello World!");
}
|
형식이 틀린 함수의 예
|
예7)
int 1tri ple(int number){
return number*3;
}
|
예8)
babo라는 형식이 없을경우
babo triple(int number){
return number*3;
}
|
예9)
void triple(int number){
return number*3;
}
|
예제 설명
예1)
이름 triple, 인수는 하나 int 형식의 값을 number라는 변수에 넣어서 사용한다. return 문을 이용해서 number에다가 3을 곱한 값을 결과로 반환한다. 리턴 타입은 int 이다.
예2)
예1과 같지만 함수앞에 리턴타입 int를 명시하지 않았다. 형식에는 맞지만 매우 안좋은 스타일이다. 절대로 이렇게 하지 말기를 권장하며 상황에 따라 문법에 맞지 않다고 할 수 있다.
예3)
이름 multiple, 인수는 두 개 콤마( , )를 이용해서 구분한다. , int 형식의 값
2개를 받는다. 만약 호출할 때 하나라도 없으면 에러를 낼 수 있다. return 문을 이용하여 두값을 곱해서 결과로
반환한다.리턴 타입은 int이다.
예4)
이름 div, 인수는 두 개 , float형식이다. 두수(정수든 실수든)의 나눗셈의 결과는 float이므로 리턴타입으로 float를 사용하였다. rerurn type을 int로 하면 에러나 경고가 발생한다.
예5)
이름 hello_print, 인수는 없다. 인수가 없다는 것을 인수 부분에 void라고 써서
나타낸다. return type역시 어떤 형태의 결과 값도 나타내지 않는 다는 것을 나타내기 위해 void를 사용한다.
내부에서는 화면에 글자를 출력하는 pritnf문을 이용하여 화면에 문구를 출력한다.
주의 할 것은 여기서 말하는 return type, return value(리턴타입,리턴값)이
함수가 종료하면서 자신을 호출한 상대에게 알려주는 값이지(그래서 결과값이라 안하고 리턴값이라한다) 함수가 어떤일을 하고 나타내는
결과의 전부는 아니라는 것이다. 함수는 자신을 호출한 대상에게 리턴값을 알려줄 수도 있고 화면에 글을 출력할 수도있는등 많은
일을 할 수 있다.
예6)
예5와 같지만 리턴타입을 int로 썼다. 이 예제가 보여주는 것은 return value 가
없으면 return type은 의미가 없어진다는 것이다. 하지만 return value가 없을 때(return 문을 값없이
사용하는 경우는 함수를 종료한다는 의미로 쓴다 이럴 경웨 return value는 없지만 return 문은 존재 하게 된다)
void라고 명시해주는 것이 발생할지도 모르는 문제들을 막을 수 있다. return type이라는 것은 소스를 실행파일로
만들어주는 컴파일러,프로그래멍게 이 함수의return value 가 존재하는지 존재한다면 어떤 type을 가지는지 알려주는
기능을 하기 때문이다. 적어도 자신이 만든 함수를 다른 프로그래머가 이용할 때 혼란을 주어서는 안되겠죠?
예7)
함수의 이름이 잘못되었습니다. 함수의 이름에는 빈칸도, 앞에 숫자가 와서도 안돼겠죠?
예8)
함수의 리턴타입으로 없는 자료형(type)을 지정해주어서는 안됩니다. 물론 babo라는 type이 있으며, 동시에 return value가 babo type이면 지정해 주어도 됩니다.
예9)
return value가 있는데도 return type으로 void를 써주어서는 안됩니다.
여기까지 기초적인 형식의 문제였습니다. 그럼 계속해서 함수를 어떻게 사용하는지 알아보겠습니다.
2)함수의 사용
우선 함수를 사용한 예를 보겠습니다.
예10)
|
#include <stdio.h>
int main(void){
printf("Hello World!");
return 0;
}
|
결과:
해설:
1번 예제는 많은 프로그래밍 책에 있는 Hello World!출력 예제이고
'#include <stdio.h>'라는 것은 stdio.h라는 파일에들어 있는 함수들을 사용하겠다는 말입니다.
C언어는 main이라는 함수에서 부터 시작을 합니다.
printf라는 것은 화면에 글자를 출력하는 함수고 "Hello World!"라는 문구를 출력하라는 말입니다.
함수를 호출 하는 방법은 이렇듯 함수의 이름과 함수의 인자를 넣어주면 되는 것입니다.
함수이름(인자들)
return문은 함수를 종료 시키면서 함수의 결과값을 함수를 부른 대상에게 알려줍니다. return 문은 다음예제에서 살펴 보겠습니다.
예11)
|
#include <stdio.h>
int triple(int number){
return number * 3;
}
int main(void){
int result;
result=triple(4);
printf("%d\n",result);
result= triple( triple(3) );
prtinf("%d\n", result);
return 0;
}
|
결과:
해설:
이번에는 새로운 함수를 만들었습니다.
triple이란 함수인데요 함수의 프로토 타입부분을 봅시다.(프로토 타입을 보면 함수가 무슨일을 하는지 알 수 있겠죠?)
int triple(int number)
|
함수의 이름
|
triple ,곱하기 3을 하는 함수라서 이런 이름을 붙였습니다.
|
|
이 함수의 결과값
|
int형태
|
|
이 함수를 호출할 때 넣어주어야하는 값
|
int형태, 함수내부에서 이 값을 number라는 변수에 넣어서 처리
|
triple 함수의 내부:
return number * 3;
return 문을 이용해서 number에다가 3을 곱한다음에 그 값을 결과값으로 넘깁니다.
Main 함수의 내부:
result = triple(4);
라는 부분이 있는데 이부분이 이 함수를 호출 하는 부분입니다. triple(4)의 결과를 result라는 변수에다가 넣으라는 말입니다.
"triple(4)" 이부분이 리턴값 12로 바뀐다고 생각하면 됩니다.
그 다음줄의 printf문은 result를 출력하라는 말입니다.(printf문의 사용법은 여기서 다루지 않겠습니다)
result= triple( triple(3) );
이 부분은 가장 안쪽에 있는 triple(3)부터 실행이 됩니다. triple(3)의 결과는 9가 됩니다. 9라는 결과 값이 다시 그 다음에 있는 triple함수의 인수로 들어갑니다.
triple( 9 )의 결과는 27, 이 값이 result에 들어갑니다.
result= triple( triple(3) ); ====> result= triple( 9 ); ====> result= 9;
이렇게 생각하면 좀 쉽게 느껴지시나요?
함수의 리턴값(결과값)은 이렇듯 함수를 호출한 대상에게 넘어갑니다. 함수의 return type이라는 것은 이 결과값의 type,즉 정수형이냐(int) 실수형이냐(float)라는 것을 써 놓는 것입니다.