C언어 함수에 대해

프로그래밍/C 2018.12.15 댓글 Plorence
함수(Function)

굳이 C언어가 아니더라도 대부분의 언어에서 많이 쓰이는게 함수입니다.
함수는 호출할때 여러가지 값도 받을 수 있고 호출한곳으로 값을 반환할 수도 있습니다.
유지보수면에서도 코드가 줄고 관리해야할 부분이 정해져있으니 좋습니다.

함수의 정의 방법
1
2
3
4
반환타입 함수이름(매개변수)
{
함수의 몸체
}
함수 사용의 장점
  1. 문제의 발생 및 프로그램의 요구사항 변경으로 인한 소스코드의 변경이 필요한 경우에,변경의 범위를 축소 및 제한할 수 있다.(앞에서 말한 관리해야할 부분이 정해져 있으니)

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main (void){
    
    int num1,num2;
    num1 = printf("hello world \n");
    num2 = printf("1234567 \n");
    
    printf("%d , %d",num1,num2);
    return 0;
}
printf함수도 반환을 합니다.
이때 모든 함수가 그런건 아닙니다.
(C언어의 함수는 전달인자가 없거나 반환 값이 없는 경우도 있다. 또는 둘다 없는 경우도 있다.)

printf함수의 반환값은 모니터에 출력한 문자열의 길이입니다.
반환할때 \n와 같은 특수문자와 띄어쓰기도 길이에 포함이 됩니다.
그래서 num1에는 13이 대입되고, num2에는 9가 대입됩니다.

함수 정의해보기
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int add (int num1,int num2){
    int result = num1 + num2;
    return result;
}
int main (void){
    printf("%d",add(1,4)); //5를 출력
    return 0;
}
함수에 대해 더 자세히 알아봅시다.
어떠한 두 값을 더하고 결과값을 반환하는 함수를 정의했습니다.
위 예제를 해석하면 
함수 add는 반환타입이 int로 선언되었고,매개변수는 int num1,int num2 총 2개가 선언(매개변수의 선언 이라고 부름)되었습니다. (인자도 2개를 받아야함)

함수가 호출되면 함수의 몸체에는 전달한 인자(이때 인자는 1,4이다.)를 각각 변수 num1 와 변수num2 에 대입을 합니다.
새로운 변수(int result)를 만들어 선언과 동시에 변수 num1 과 num2를 더해 초기화합니다.
그리고 함수를 종료하면서 add함수를 호출한곳으로 변수 result의값이 전달됩니다.

전달인자의 유무와 반환 값의 유무에 따라서 함수를 네 개의 형태로 나눕니다.
  • 전달인자 O 반환 값 O
  • 전달인자 X 반환 값 O
  • 전달인자 O 반환 값 X
  • 전달인자 X 반환 값 X

return문이 지나가는 한가지의 의미만 살리기
  • 함수 종료
  • 값을 반환한다
반환형이 void 라도 함수의 종료를 위해 반환값이 없는 return; 을 쓰기도 합니다.

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main (void){
    printf("%d",add(1,4)); //5를 출력
    return 0;
}
int add (int num1,int num2){
    int result = num1 + num2;
    return result;
}
 
위에 예제는 add함수의 정의의 위치 관련 문제이고 컴파일시 에러가납니다.

왜 그럴까?
먼저 C는 절차지향이고 절차지향은 위에서 아래로 컴파일을 진행합니다.
add함수의 호출이 add함수의 정의보다 먼저 위치하였기 때문입니다.
정의전에 함수를 호출해버리면 이함수가 뭔지 모릅니다.
즉 호출되기전에 미리 정의되어야 합니다.

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int add (int num1,int num2); //add함수가
int main (void){
    printf("%d",add(1,4)); //5를 출력
    return 0;
}
int add (int num1,int num2){
    int result = num1 + num2;
    return result;
}
위에 예제는 함수의선언 후 함수의 몸체가 구성되었습니다.
위에 예제를 컴파일시켜보면 알건데 함수의 선언은 항상 호출하기전에 있어야하고
함수의 몸체는 어디있던간에 상관없습니다.

함수의 선언은 두가지 모두가 될 수 있습니다.
  • int add (int num1,int num2); //매개변수의 이름은 포함한 선언
  • int add (int , int ) //매개변수의 이름을 생략한 표현

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int add (int num1,int num2); //add함수가 선언되었다.
int main (void){
    printf("%d",add(1,4)); //5를 출력
    return 0;
}
int add (int num1,int num2){
     //add함수가 정의 되었다.
    int result = num1 + num2;
    return result;
}
함수의 선언반환타입,함수이름,매개변수만 있으면 함수의 선언이고
함수의 정의는 반환타입,함수이름,매개변수,함수의몸체가 있어야 완전한 함수므로 함수의 정의가된다.

함수안에 또 다른 함수를 호출할 수 있습니다.
반환형인 void에 대해
void의 사전적 의미는 1. (커다란) 빈 공간, 공동; 공허감   2. …이 하나도 없는   3. 무효의, 법적 효력이 없는 입니다.
반환할 데이터가 없다는 의미로 호출한 곳으로 아무것도 전달하지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
void add (int num1,int num2); //add함수가 선언되었다.
int main (void){
    printf("%d",add(1,4));
    return 0;
}
void add (int num1,int num2){
     //add함수가 정의 되었다.
    int result = num1 + num2;
    return result;
}
값을 반환 할 수도 없고 값이 필요한곳으로 리턴하게 된다면 컴파일 에러가 발생하게 됩니다.
그래서 아래의 코드들은 에러가 발생합니다.
  •  return result;
  • printf("%d",add(1,4));
첫 번째는 반환형이 void라 값을 반환할 수 없는데 변수 result의 값을 반환할려고 하고 있습니다.
두 번째는 반드시 값이 필요한곳에 반환값이 없으니 에러가 발생하게 됩니다.


댓글