본문 바로가기

학습공간/C, 프로그래밍기초

[5주차] 함수의 정의와 선언 그리고 호출, 지역변수 & 전역변수, 재귀함수의 호출

반응형

9장

함수를 정의하고 선언하기

 - 함수에 대해서는 한번 설명 언급하였다. 본격적으로 함수에 들어가기에 앞서서 다시

   함수의 형태를 봐 두길 바란다. 함수의 형태는,

 

1. 함수의 반환형 (리턴형)

2. 함수의 이름

3. 함수의 입력 형태 (인자 전달)

 

이 세 가지가 중요한 구성이다.

 

 

함수를 만들어야 하는 이유는?

 - 프로그래밍을 한다는 것은 복잡한 문제를 해결하는 것과 같다. 문제를 main이라는 하나     의 함수 안에서 해결하다 보면 복잡해질 뿐만 아니라 그만큼 더 어려워진다. 구현에

   필요한 기능들이 어떤 것이 있는지 분석해서 각각을 독립적인 함수로 구현하고, 이들을     하나의 프로그램으로 완성시켜가야지만 좋은 프로그램을 쉽게 작성할 수 있는 것이다.

 

다양한 형태의 함수 정의하기

 - 이제부터 main 함수가 아닌 새로운 함수를 직접 만들어서 사용할 것이다.

   함수의 특성에 따라 전달 인자가 없을 수도 있고 반환 값이 없을 수도 있다.

   물론 둘 다 없는 경우도 존재 한다. 전달인자와 반환 값의 형태를 가지고 함수를

   나눈다면 총 4가지 형태로 함수를 나눌 수 있다.

 

case 1. 전달 인자 O , 반환 값 O

정수형 덧셈의 결과를 반환하는 함수이다.

결과 역시 정수형이기 때문에 반환형을 int

함수의 이름은 Add 라 정의 하고,

매개 변수전달 인자를 2개 사용하였다.

 

case 2. 전달 인자 O , 반환 값 X

Result_printf 라는 이름의 그냥 어떤 값을 보여주기만 하는 함수이다. 반환형 X

main 함수에서 어떤 값을 인자로 전달 받으면 그 값을 나타내는 일만 하고 있다.

 

case 3. 전달 인자 X , 반환 값 O

 

case 4. 전달 인자 X, 반환 값 X

반환형도 없고 전달 인자도 없다.

이 함수를 호출을 하면 그냥 함수의 내용을 띄워주는 일만 하게 된다.

 

4가지 경우로 함수를 정의 하는 법을 살펴보았다.

참고로 C언어의 컴파일러는 순차적으로 코드를 읽어 내려간다.

main 함수에서 자기가 만든 함수를 사용하려면 먼저 함수의 정의를 읽어 들여야 한다.

그러므로 함수의 정의는 main 함수 전에 하는 것이 기본이다. main 함수 뒤에 하고 싶다면

main 함수 이전에 자기가 만든 함수들을 선언을 해 주어야 한다. 그렇지 않으면 ERROR.

 

문제 1] 두 숫자를 매개변수로 전달 받아서 크기를 비교하는 함수를 만든다.

           main 함수 안에는 만든 함수를 호출하여 두 숫자 중 큰 수만 출력 하도록 함.

 

문제 2] 세 개의 정수를 입력 받아서 구 중 가장 큰 수를 반환하는 함수와 가장 작은 수를 반환 하는 함수를 만들어 보자. 그리고 이 함수들을 이용한 적절한 main 함수도 구현해보자.

 

 

 

// 4개의 함수를 이용해 만든 두 수의 덧셈 프로그램..

 

 

변수의 범위(scope)에 대하여..  지역 변수 & 전역 변수

함수의 설명은 다 끝났다. 변수의 범위에 대해 이야기 하는 이유는 변수가 선언되는 위치가 함수와 깊은 관계가 있기 때문이다.

변수는 선언되는 위치에 따라 크게 전역 변수와 지역 변수로 나뉜다.

전역 변수와 지역 변수가 지니는 가장 큰 차이점은

첫째로 메모리상에 존재하는 기간이며, 둘째로 변수에 접근할 수 있는 영역이다.

 

1. 지역 변수 (Local Variable or Automatic Variable)

‘지역 변수’ 에서 말하는 ‘지역’ 이란 중괄호에 의해서 형성되는 지역을 의미 한다.

즉, 중괄호 내에 선언된 변수모두 지역 변수다. 이러한 지역 변수는 선언된 지역에서만

유효하다는 특징을 지닌다.

 

함수 두 개를 만들어 보았다.

fct_one 함수와 fct_two 함수 안을

살펴보자.

fct_one 함수라는 지역에 one 이라는

변수를 선언했으므로 이는 지역변수 이다.

fct_two 함수 역시 하나의 지역이므로

안에 선언된 one 변수와 two 변수는

지역변수 이다.

 

참고로 각각 함수는 별개의 지역이므로

변수의 이름이 같은 것이 있어도 무관하다.

 

지역변수는 그 함수가 호출되는 순간

메모리가 할당 되며, 함수가 종료되는 순간

메모리에서 사라진다.

 

 

메모리 공간을 생각하며 프로그램의 흐름을 읽어 보면.. 처음에 val = 10 이라는 값을 가진

메모리가 할당이 된다. 그리고 fct_one 함수가 호출되면서 one = 10 이라는 값을 가진

메모리 공간이 추가 되면서 fct_one 함수가 종료 되면서 삭제된다.

그 다음 fct_two 함수가 호출되면서 one = 20 , two = 30 이라는 값을 가진 메모리가 할당과 동시에 삭제된다.

마지막으로 main 함수가 종료 하면서 val = 10 이라는 값을 가진 메모리가 삭제된다. 흐름을 꼭 알아두도록 하자.

 

아, 참고로 if 문이나 for문 등의 중괄호 안에 선언한 변수들도 그 문장이 끝나면 사라지는

지역 변수이다. 또 함수의 인자로 사용되는 매개 변수들도 그 함수의 지역 변수이다.

 

2. 전역 변수 (Global Variable)

'전역 변수' 는 아직까지 프로그램에서 한 번도 접하지 못한 형태이지만 쉬운 개념이다.

‘전역 변수’ 라는 것은 그 이름이 의미하는 것처럼, 프로그램 어디에서나 접근이 가능한

변수를 말하는 것이다. (변수를 함수 밖에다가 선언함.)

main 함수를 보면 add 함수를 호출하기 전에 val의 값을 보면 0 이라고 되어있다.

전역변수에서 초기화 한 0 그대로 나타나 있는 것이다.

add 함수의 인자를 3 이라 넣고 다시 val의 값을 보면 0+3이 된 3이라는 값이 들어 있다.

val++ 으로 1만큼 증가한 후 다시 val의 값을 보면 4라는 값이 들어 있다.

 

전역변수와 같은 이름의 지역 변수가 존재하는 영역 (지역변수 > 전역변수)

 

재귀적 함수의 호출

재귀 함수 호출이란.. 함수의 자기 자신 내에서 자기 자신을 호출하는 것이다.

실행 시켜보면 Recursive Call!! 이라는 단어가 무수히 나올 것이다.

이건 무한루프도 아닌 함수 자체를 무한히 돌리는 것이라서 루프를 빠져나올 필요도 없이

무한히 돌다가 메모리가 가득차서 프로그램이 강제종료 된다.

이럴 때는 재귀 함수에 적절한 탈출 조건을 걸어주면 유용하게 활용할 수 있다.

 

예) n! 을 구할 때..

 

반응형