C언어 study_함수

민성철·2022년 11월 10일
0

nadocoding_study_C

목록 보기
10/17

함수

함수(function)는 앞전에 사용했던 printf()부터 switch()까지 모든 걸 함수라 하고, 간단하게 생각해서 '값을 입력받아 어떤 작업을 한 후 그 결과를 출력하는 것'이 함수입니다.

함수 선언

프로그램에서 함수를 사용하려면 컴파일러에 알려줘야 하는데, 이를 '함수 선언'이라고 하고 main() 함수 위쪽에 작성합니다.
함수 선언을 할 때는 반환형과 함수명을 적은 뒤, 소괄호 안에는 어떤 값을 전달받을지 적어주고 세미클론으로 문장을 종료합니다.

함수 정의

'함수 선언'을 하면, 함수가 어떤 일을 수행할지 정의해야 되며, 이는 main() 함수 아래쪽에 작성하고 이를 '함수 정의'라고 합니다.
'함수 정의'는 '함수 선언'과 거의 비슷하게 작성되지만 차이점은 세미클론으로 문장을 종료하지 않고, 중괄호({})를 작성하고 중괄호 안에 수행할 문장을 적습니다.

함수 호출

함수를 선언하고 정의했으니 이제 함수를 호출할 차례입니다.
'함수 호출'은 main() 함수에 함수를 사용하는데, 여기서 함수를 사용한다는 것은 위에서 간단하게 설명되어 있는 '함수에 어떤 값을 전달해 어떤 작업을 하라'는 것입니다.
'함수 호출'을 사용할 때는 함수명을 적은 뒤 소괄호에 전달할 값을 넣어주고 세미클론으로 문장을 종료하면 됩니다.

  • 여기서 반환형은 함수에서 어떤 동작을 수행하고 나서 결과로 나오는 값의 자료형입니다. 그리고 결과로 나오는 값은 반환값이라고 합니다.
    만약 함수의 결과가 실수라면 반환형은 double이나 float로, 문자면 char로 작성합니다. 또한, 어떤 값도 반환하지 않는 함수도 있으며 이럴때는 반환형을 void로 작성합니다.
  • 함수에서 반환값을 표시할 때는 return 문을 사용합니다.
    return을 넣으면 해당 값을, 함수를 호출한 곳으로 되돌려 줍니다.
    함수의 반환형을 void로 하면 반환할 값이 없다는 뜻이므로 return문은 필요 없습니다.
  • 추가로 소괄호 안에 작성되는 전달값 자리에는 자료형과 변수명이 들어갑니다. 함수의 전달값 자리에 들어가는 변수는 매개변수(parameter)라고 합니다.
  • 함수의 매개변수는 하나 이상 넣을 수 있고, 변수마다 자료형을 다르게 받을 수 있습니다.
    또한 변수명을 서로 다르게 지어야 하며, 매개변수가 여러 개일 때는 쉼표로 구분하고 매개변수 개수와 전달값의 개수는 같아야 합니다.
    매개변수의 이름은 '함수 선언'과 '함수 정의'에서 다르게 적어도 되지만, 되도록 같은 이름을 사용하는 것이 추후 코드를 확인했을 때 헷갈리지 않습니다.

위에 설명을 아래와 같이 예시코드로 보겠습니다.

#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()를 정의 하면, '함수 호출'에서 함수를 호출할 경우, 문제없이 출력은 됩니다.

  • 매개변수와 인수
    -- 매개변수(parameter)는 함수를 호출할 때 전달되는 값이 저장되는 변수이고, 인수(argument)는 함수를 호출할 때 전달하는 값이나 변수입니다.
    예시로 함수를 선언할 때 a, b는 매개변수이고, 함수를 호출할 때 1, 2는 인수입니다.
int sub(int a, int b);   // 함수 선언, (a,b) == 매개변수
...
sub(1, 2);              // 함수 호출, (1, 2) == 인수

전달값이 있는 함수

반환값은 없고 전달값이 있는 함수입니다.
반환값이 없기때문에 '함수 선언'에서 void로 선언하고, 전달값을 받을 매개변수는 작성합니다.
그리고 '함수 호출'에서 함수를 호출할 때는, '함수 선언'과 '함수 정의'에서 정의한 매개변수의 맞는 자료형으로 값을 넣어주게 되면 무리없이 실행이 됩니다.

반환값과 전달값이 있는 함수

위에 예시코드에서 작성되었던 sub()와 같이 값을 반환합니다.
때문에 반환값이 없는 함수와 다르게 함수를 호출한 곳에서는 반환값을 받을수 있고, 값을 받으려면 값을 저장할 변수가 필요하며, 당연히 변수 저장이 가능합니다.
변수저장 없이 main() 에서 printf()를 사용하여 별도의 변수 저장없이 출력이 가능합니다.

  • C프로그램에서 함수는 조금 복잡하면서도 꼭 필요하기 때문에 익혀두는 것이 좋습니다.
    main() 함수 위쪽에 함수를 선언하고, main()함수 아래쪽에 함수를 정의합니다.
    단, 여러 함수를 쓸 때 함수 선언이나 함수 정의가 main() 함수를 기준으로 올바른 위치에만 있다면 순서는 상관없습니다.
profile
ENTJ-A

0개의 댓글