#4 함수

우린 아직 함수를 배우지 않았지만 계속 접하고 있었다.

지금까지 사용한

printf()

scanf()

if()

for()

while()

이것들이 모두 함수이다.

이정도면 뭔가 감이 오지 않는가...?

함수라는것들 뒤엔 모두 ()가 있다는 것이다.

그 안에 무엇이 들어가든 일단 ()가 있다는것만 알고 다음내용을 보도록 하자

 

그럼 도대체 함수는 무엇인가...?

우리가 외우면서 쓰던 것들은 뭘 했나?

어떤 일을 해주는 일종의 작은 프로그램 덩어리이다.

그 덩어리들을 잘 모아서 조립해 놓으면 하나의 프로그램이 된다.

printf()는 출력하는 일을

scanf()는 입력받는 일을 하는 함수들이다.

 

이해를 돕기위해 실생활의 예를 한번 들어보자...

밥통이라는 기계가 있는데 이것을 함수라고 보자

밥통이라는 함수는 쌀과 물을 넣으면

안에서 지지고 볶아서 밥을 만들어준다.

그럼 그 밥통은 함수이고 쌀과 물이 입력이고 밥은 출력이다.

뒤에서 함수와 비교해줄테니 외우지는 말자...

 

우리는 함수를 사용뿐만 아니라 만들기도 했다

배우지도 않았는데 언제 썼냐고~?

우린 계속 main()을 만들어왔다.

main()도 함수이다.

그럼 main()에서 시작해보자

 

void main(void) {

}

 

이렇게 썼던것을 기억할것이다.

#1을 기억하는지 모르겠지만

앞의 void는 없다는 뜻이고

뒤의 void도 없다는 뜻이었다

그럼 앞과 뒤의 차이는 뭔가...?

앞의 void는 출력형식이고

(출력 형식을 반환형이라고 부르겠다. 흔히 말하는 return값, 그 타입을 말한다)

뒤의 ()안에 있는 void는 입력형식이다.

(입력형식을 매개변수라고 부르겠다. 함수의 인자 혹은 parameter라고 부르기도한다.)

둘다 아무것도 없다는 뜻은

물이나 쌀도 안넣고 밥도 안나온다는 뜻이다...

아무것도 눈에띄는게 없으니 우리가 하나 만들어보자...

 

#include<stdio.h>

 

int sum(int, int);

 

void main(void)

{

int a = 2;

int b = 3;

printf("%d", sum(a, b));

}

 

int sum(int x, int y)

{

return x + y;

}

 

전처리기(#으로 시작하는것)와 main()사이에 뭔가 하나 생겼다.

 

int sum(int, int);

 

앞에서 들은 바에 의하면 이게 함수이다.

앞의 int는 정수형으로 출력을 하고

뒤의 두개의 int는 정수형으로 입력한다는 것 같다.

근데 내용이 하나도 없다...;;;

그리고 main()이 끝나는 부분에 앞에서 본것과 거의 같은 문장이 하나 더 있다.

 

int sum(int x, int y) {}

 

이게 제대로 함수인것 같다.

정확히 말하자면 위에서 본

int sum(int, int); 이것은 선언부이다.

int sum(int x, int y); 이렇게 정의부랑 똑같이 써도 상관 없다.

프로토타입이라고 부르고, 내가 이런 함수를 뒤에 만들어 놨고 사용하겠다는 말이다.

어디선가 많이 본듯하다...

int a;

이것과 같은 것이다.

우리가 정수형 변수를 미리 선언해서 사용하겠다고 말하는 것과 같은 이치다.

변수를 선언하는 것과 같다고?

그럼 한번 더 생각 해 볼 수 도 있다.

int a = 3;

이렇게 선언과 할당을 동시에 하기도 하지 않는가...?

함수도 이런게 가능 할까....?

물론 가능하다~

 

#include<stdio.h>

 

int sum(int x, int y)

{

return x + y;

}

 

void main(void)

{

int a = 2;

int b = 3;

printf("%d", sum(a, b));

}

 

작은 프로그램을 짤때는 후자처럼 선언부와 정의부가 함께 있는 후자를 선택해도 좋다

하지만 선언부(프로토타입)와 정의부가 따로 있는 전자를 추천한다

여러가지 이유가 있는데 나중에 설명 하도록 하겠다.

 

이제 진짜 함수가 어떻게 돌아가는지 보자

main()을 보자

앞부분은 다 알테고

 

printf("%d", sum(a, b));

 

이부분을 보도록 하자.

분명히 예전에 하던대로 정수형을 출력하는것인데

숫자나 변수는 없고 함수가 나타났다.

그래도 애러가 안나는 이유는 뭘까...?

우리가 선언한곳을 보자

int sum(int, int)

반환형이 int형이기 때문에

저 함수는 정수 값을 내보낼 것이기 때문에 문제가 없다.

int a = 2; 의 a를 출력하는 것과

int sum(int, int)의 sum(2, 3)을 출력하는것은 같다고 볼 수 있다.

 

대체 그럼 sum()이라는건 어떻게 돌아가는 걸까?

우리가 sum(a, b)라고 쓰면 어떤 일이 벌어지는 것일까...?

이해를 돕기 위해 하나하나 풀어 써보자...

sum(a, b)를 실행하게 되면 일단 앞에서 선언한 a와 b가 그 자리에 들어가게 된다.

sum(2, 3)이 되고 함수의 정의부로 들어가게 된다.

 

int sum(int x, int y)

{

return x + y;

}

 

이 부분으로 이동하게 되는데

아까 입력한 값들이 그 자리에 입력이 된다.

 

int sum(int x = 2, int y = 3)

{

return x + y;

}

 

x + y를 즉 2 + 3을 해서 5을 return해주게 된다

return??

이것이 반환해 주는 키워드이다.

return x; 라고 하면 x를 반환해 주는 것이다.

x와 y를 보니 2와 3이기 때문에

둘을 더해서 5가 반환되고

다시 아까 썼던 자리로 돌아가게 된다.

sum(a, b)의 자리에 5가 들어가게 되는것이다.

그렇기 때문에 결과적으로

 

printf("%d", sum(a, b));

printf("%d", sum(2, 3));

printf("%d", 5);

 

이렇게 차례로 변하게 되는 것이다.

그래서 출력은 5가 된다.

잠깐...

실컷 설명하고 났는데....

대체 왜 함수를 쓰는지도 모르고 하고 있다....

고작 더하기만 해주는 프로그램 만으로는 함수의 장점을 말 할 수 없다

그래도 그냥 설명하련다...(이것은 금방 피부로 느끼게 될 것이다.)

문제를 해결하는데 있어서 커다란 문제를 한번에 해결하기엔 쉽지 않다.

우리가 수학문제를 부분부분 풀어서 전체 문제를 풀듯 해결해나가야 한다.

Divide & Conquer라는 말이 있다.

나눠서 정복하라는 뜻으로 함수를 설명할때 이야기한다.

그리고 함수를 만드는 일은 반복되는 일을 컴퓨터에게 시키는것과 같다...

얼레?

왠지 어디서 들어본것 같다...

그렇다 반복문에서도 이런 이야기를 했다.

규칙적인 일을 시킬때 우린 반복문을 사용한다.

하지만 그 둘은 조금 다르다..

함수는 프로그램안의 프로그램이다.

메인함수가 하나의 프로그램이듯 우리가 만든 함수도 프로그램이다.

우리가 필요한 순간이면 언제든 호출해서 사용할 수 있다.

반복문은 반복문이 시작되고 끝나는 순간까지 같은 일을 반복하지만

함수는 우리가 필요할때면 불러내 일정한 일을 시킬 수 있다.

잘 이해가 안된다면...

우리가 만들 계산기의 메뉴를 함수로 만들어보자...


#include<stdio.h>

 

void printmenu(void);

 

void main(void)

{

printmenu();

}

 

void printmenu(void)

{

printf("==========================\n");

printf("1. 계산하기\n");

printf("0. 끝내기\n");

printf("==========================\n");

}

 

이렇게 만들어졌다면

우린 언제든 printmenu();라고 함수를 호출하면

저 printf()네줄로 구성된 메뉴를 출력할 수 있다.

피부로 느끼는게 가중 중요하다.

기회가 되는대로 함수의 장점을 보여주도록 하겠다.

함수에 대한 많은 내용을 했지만

가장 중요한 내용이 남아있다.

쉬운 내용으 아니지만 빼고 넘어갈 수 없는 부분이다.

(이해가 안된다면 여러번 읽어보기도 다른 곳을 참고하기도 하자)

이 글은 스프링노트에서 작성되었습니다.

by 그아이 | 2009/04/16 16:59 | Programming | 트랙백 | 덧글(1)

트랙백 주소 : http://theiz.egloos.com/tb/4307973
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 염재현 at 2009/10/14 10:27
재미있게 잘 구성하셨네요. 역시 프로그래밍 가이드는 무언가를 만들어보자는 목표를 정해 놓고 그것을 하기 위하여 개념을 하나씩 배워나가면서 개선하는 순서로 구성하는 것이 동기 부여도 되고 좋을 것 같군요.

근데 처음 프로그래밍을 배운다면 C언어는 기계와 너무 가까워서 이런 저런 부차적인 설명이 자꾸 길어지게 되고, 그래서 결국 매뉴얼이 깔끔하지 못하게 되는 문제가 생길 것 같아요.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶