함수
함수(function)는 앞전에 사용했던 printf()부터 switch()까지 모든 걸 함수라 하고, 간단하게 생각해서 '값을 입력받아 어떤 작업을 한 후 그 결과를 출력하는 것'이 함수입니다.
함수 선언
프로그램에서 함수를 사용하려면 컴파일러에 알려줘야 하는데, 이를 '함수 선언'이라고 하고 main() 함수 위쪽에 작성합니다.
함수 선언을 할 때는 반환형과 함수명을 적은 뒤, 소괄호 안에는 어떤 값을 전달받을지 적어주고 세미클론으로 문장을 종료합니다.
함수 정의
'함수 선언'을 하면, 함수가 어떤 일을 수행할지 정의해야 되며, 이는 main() 함수 아래쪽에 작성하고 이를 '함수 정의'라고 합니다.
'함수 정의'는 '함수 선언'과 거의 비슷하게 작성되지만 차이점은 세미클론으로 문장을 종료하지 않고, 중괄호({})를 작성하고 중괄호 안에 수행할 문장을 적습니다.
함수 호출
함수를 선언하고 정의했으니 이제 함수를 호출할 차례입니다.
'함수 호출'은 main() 함수에 함수를 사용하는데, 여기서 함수를 사용한다는 것은 위에서 간단하게 설명되어 있는 '함수에 어떤 값을 전달해 어떤 작업을 하라'는 것입니다.
'함수 호출'을 사용할 때는 함수명을 적은 뒤 소괄호에 전달할 값을 넣어주고 세미클론으로 문장을 종료하면 됩니다.
위에 설명을 아래와 같이 예시코드로 보겠습니다.
#include <stdio.h>
int sub(int num1, int num2); //함수 선언
void answer(int answer); //함수 선언
int main(void) {
int num = 5;
answer(sub(num, 7)); //함수 호출
return 0;
}
int sub(int num1, int num,2) { //함수 정의
return num1 + num2
}
void answer(int answer) { //함수 정의
printf("answer : %d\n", answer);
}
output
answer : 12
함수를 사용하는 이유
-- 첫째, 코드 중복을 방지하고 효율적으로 프로그래밍할 수 있습니다.
같은 작업을 하는 코드를 여러 곳에 중복해 작성하면 코드는 수십만 줄로 수정해야 할 때 일이이 찾아서 모두 수정해야 되는 수고로움이나 혹은, 찾지못하는 경우가 발생하지만 함수로 만들어 놓으면 관련 함수만 수정하면 됩니다.
-- 둘째, 다른 프로젝트에 재사용할 수 있습니다.
함수를 잘 만들어 두면 새로운 프로젝트에서 동일한 기능이 필요할 때 기존 코드에서 필요한 함수를 적용해 사용할 수 있습니다.
함수는 크게 '표준 함수'와 '사용자 정의 함수'가 있습니다.
-- '표준 함수'는 C언어에 이미 만들어져 있어서 프로그램을 작설할 때 형식에 맞춰 가져다 쓰기만 하면 됩니다.
앞에서 사용한 printf(), scanf(), rand() 등이 대표적인 표준 함수입니다.
표준 함수는 표준 라이브러리 함수, 내장 함수, 시스템 제공 함수라고도 합니다.
-- '사용자 정의 함수'는 사용자가 직접 정의한 즉, 직접 만드는 함수를 의미합니다
함수의 종류
함수는 전달값과 반환값이 있느냐 없느냐에 따라 5가지로 나눌 수 있습니다.
반환값이 없는 함수
반환값이 없는 함수는 반환형을 void로 선언한 함수를 말합니다.
반환값이 없는 함수는 '함수 정의'에서 printf()를 작성한 뒤에 '함수 호출'에서 호출하여 출력할 수있으나, 반환값(return)이 없기 때문에 변수 저장이 불가합니다.
반환값이 있는 함수
이번 함수는 전달값은 없지만 반환값이 있는 함수 입니다.
따라서 전달값 없이 함수를 호출 해줄 경우, '함수 정의'에서 return 뒤에 있는 값이 반환되고, 반환된 값을 받으려면 값을 저장할 변수가 필요하기 때문에, 당연히 변수 저장이 가능합니다.
변수저장 없이 main() 에서 printf()를 사용하여 별도의 변수 저장없이 출력이 가능합니다.
전달값이 없는 함수
전달값이 없으면 매개변수(parameter)도 필요 없으므로 함수를 선언할 때나 정의할 때 소괄호 안에 아무것도 넣지 안습니다.
하지만 '함수 정의'에서 printf()를 정의 하면, '함수 호출'에서 함수를 호출할 경우, 문제없이 출력은 됩니다.
int sub(int a, int b); // 함수 선언, (a,b) == 매개변수
...
sub(1, 2); // 함수 호출, (1, 2) == 인수
전달값이 있는 함수
반환값은 없고 전달값이 있는 함수입니다.
반환값이 없기때문에 '함수 선언'에서 void로 선언하고, 전달값을 받을 매개변수는 작성합니다.
그리고 '함수 호출'에서 함수를 호출할 때는, '함수 선언'과 '함수 정의'에서 정의한 매개변수의 맞는 자료형으로 값을 넣어주게 되면 무리없이 실행이 됩니다.
반환값과 전달값이 있는 함수
위에 예시코드에서 작성되었던 sub()와 같이 값을 반환합니다.
때문에 반환값이 없는 함수와 다르게 함수를 호출한 곳에서는 반환값을 받을수 있고, 값을 받으려면 값을 저장할 변수가 필요하며, 당연히 변수 저장이 가능합니다.
변수저장 없이 main() 에서 printf()를 사용하여 별도의 변수 저장없이 출력이 가능합니다.