삽질의 현장/- C

곱씹어보자 C!_#012_ 삽잡이의 두서없이 막말하는 함수(1)

shovelman 2015. 6. 25. 00:28

모든 프로그램 언어들은 각자 나름대로 특징이 있습니다...

그중 C언어는 함수들의 집합이라는 특징이 있습니다.


C언어의 경우에는

크게 데이터와 명령어로 나눌 수 있는데요...

참고로 명령어들 중에서 관련성 있는 기능들의 명령어들만을 묶은 함수들이

모여모여 C언어를 만든다고 할 수 있을까나요...


명령어들을 일일히 수행하면서 진행을 합니다.

또한 함수로 시작하여 함수로 끝나죠... 그러면서 필요한 데이터들을 사용하고요...


그래서 C언어는 절차적인 프로그래밍 또는 구조적인 프로그래밍이라고 합니다.


C언어는 main() 이라는 함수의 시작 블럭 ( '{' ) 부터 시작되어

블럭이 끝나면( '}' ) 프로그램이 종료됩니다.


메인 함수와 같이 {, }가 달려있는 함수들은 우리가 직접 구현했다고 볼 수 있죠...

이와는 반대로 {, }가 없는 함수들은 이미 구현되어 있는 것들을 

가져와 사용한다고 볼 수 있습니다.


우리가 정말 자주 쓰는 printf, scanf 같은 것들...

중괄호 끼고 쓰나요? 아니란 말이죠...


printf 와 같이 우리가 자주 사용하는 함수들은 어딘가 만들어져 있습니다...

이와같이, 이미 만들어져있는 함수들의 집합을 C언어 표준 라이브러리 함수라고 합니다.


그런데 우리가 만들어져있는 함수만을 사용하는 것은 아니죠...

우리가 필요할 때 직접 만들어서 사용하는 함수를 사용자 정의 함수라고 합니다.

사용자 정의함수는 '내가 만들고 내가 정의했다' 요정도~

이렇게 크게 두가지로 나뉘죠...


아무튼... 우리가 사용하는 함수...

이들은 Call -> Run -> Return 과 같은 순서로 돌아갑니다.


호출하는 녀석을 호출자(caller), 호출 받는 녀석을 callee라고 부르죠.


또한 Server와 Client라고 부를 수도 있습니다.

Server는 서비스를 제공하는 녀석, 응답을 요청받고 수행하는 녀석... responds 의 성격을 갖는다면,

Client는 서비스를 요청하고 응답받는 녀석... request의 성격을 갖죠...


이건 그런데 딱히 정해져있지 않습니다... 상대적이죠... 

누가 요청하냐에, 누가 요청 받냐에 따라 입장은 바뀌게 되죠...


아무튼...

예를 한번 들어보시고 이야기를 진행하도록 하죠...

저는 지금 별다방 카페에 와있습니다. 가만히 서있다면 직원은 어떻게 할까요 저를...

뭐... 주문을 받던지 해야할터인데... 

난 직원에게 돈을 주는 것도 아니고 뭘 달라고 요청하지도 않습니다.


이러면 문제가 생기죠.

나의 요구는 스스로만 알고 있죠. 즉, 직원은 제 요구를 받아야지 뭔가를 할 수 있다 이겁니다.


이처럼, Client가 Server에게 요구를 전달해줘야할 때가 있습니다.

전달... 그러니까 넘겨줘야하는 값 즉, 인자 혹은 인수(argument)를 넘겨줘야하죠.


Server는 Client로부터 인수를 받아야죠...

이것을 C언어 관점에서 본다면, 인수는 정수 혹은 실수겠죠?

왜냐, C언어에서는 모든 것들이 정수/실수로 표현되어 있다고 했기 때문입니다.


그렇다는 것은, Server는 인수를 받기위한 변수가 필요하게 됩니다.

요구를 받기위한 변수 바로 매개변수(parameter)가 필요하게 되는 것이죠.

자... 그렇다는 것은 고갱님의 요구를 매개변수를 통해 받겠다는 뜻이 됩니다.


매개변수를 받았으면 점원은 고갱님을 요구의 맞게 뭔가를 해야겠죠...


예를들어 내가 좋아하는 시그니처 초콜릿을 주문했다면,

나는 이를 위해 돈을 줬고...

그럼 내놔야지... 결과물을 줘야할 것 아닙니까...


이처럼 결과물을 받는 방법에는 C언어에서는 두가지가 있습니다.


첫번째, 결과치를 되돌려 주는 방법.

즉, 요구에 의해 만들어준 값을 Server 측에서 받고 그것을 Client에 있는 변수를 통해 

메모리에 집어 넣는 방법입니다.

이것은 return을 통해 클라이언트에게 반환되겠군요...

고갱님에게 받을 때에도 형식을 정해줬듯이, 반환할 때도 형식을 정해줘야합니다.

 

두번째 방법으로는 결과치를 보관하지 않고 바로 출력하는 방법이 있습니다.


실제 코드를 보며 두가지의 경우를 모두 살펴보도록 하죠.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int Add(int a, int b)
{
    int result = a + b;
    return result;
}
 
void main() 
{
    int sum;
 
    sum = Add( 23); // 첫번째 방법
    
    printf("sum = %d\n", sum);
    printf("sum = %d\n", Add(10,20)); // 두번째 방법
}
cs


자, 이렇게 두가지의 방법을 사용한 코드를 확인해봤습니다.


함수(2)편에서 보도록 합시다~