반응형
728x90
반응형

함수와 변수의 생명주기

  • 함수

문제를 해결하는데 앞서 문제를 작은 단위로 나누는 과정에서 그 작은 단위의 문제를 해결하는 하나 이상의 기능을 지닌 부 프로그램.

함수 정의의 기본 틀

  1. ‘ 함수_이름 ‘ 에는 말 그대로 함수의 이름을 정의한다.

  2. ‘ 출력_타입 ’ 에는 해당 함수가 값을 반환할 경우 반환하는 값의 자료형을 기재한다.
     -> 왜냐하면 함수의 값을 받을 때, 어떤 자료형 변수로 받을지 결정할 수 있어야 하기 때문이다.

  3. ‘ 입력_형태 ‘ 에는 함수가 실행될 때 입력 값으로 받는 인자를 기재한다. 여러 타입, 여러 개의 인자를 받을 수 있다.

  4. ‘ 함수의 내용 ‘ 에는 함수가 수행할 연산 명령들이 정의 된다.

  5. ‘ 출력_타입에_따른_반환_값 ‘ 에는 함수가 종료 하면서 반환하는 값을 기재하는데, 조건문에 의하여 여러 번 기재될 수 있으며 ‘ 출력_타입 ‘ 에 맞춰 값을 반환한다.

함수의 정의와 호출 및 선언

함수의 정의와 호출

<입력 X / 출력 X func 함수의 정의와 호출>

<입력 O / 출력 X func 함수의 정의와 호출>

<입력 X / 출력 O func 함수의 정의와 호출>

<입력 O / 출력 O func 함수의 정의와 호출>

함수의 선언

위와 같이 함수를 main 함수 밑에서 정의할 때, main 함수 내에서 함수의 호출이 정의보다 앞서는 이유로 함수가 존재 하지 않는다는 에러가 발생하는데 이 때 main 함수 상단의 선언을 통해서 정의가 밑에 있음을 컴파일러에게 명시하여 문제를 해결한다.

  • 변수의 생명주기

<지역 변수( = 자동 변수 )>

중괄호 내에 일반적인 형태(자료형 + 이름)로 선언 되는 모든 변수

  • 해당 지역(해당 변수를 감싼 가장 가까운 중괄호 내의 영역)에서만 유효

  • 해당 지역을 벗어나면 자동으로 소멸

  • 선언된 이름이 같아도 지역이 다르면 중복 선언이 가능

  • 선언 시 메모리의 ‘스택’ 영역에 ‘쌓이는’ 형태로 할당 된다. (LIFO)

  • 조건문 혹은 반복문 내에서 선언된 변수 그리고 함수에서의 매개 변수 또한 지역 변수이다.

  • 지역 변수는 외부에서 선언된 동일한 이름의 변수를 가리게 된다. -> 변수의 이름을 통해 메모리에 접근 시 해당 지역에서 먼저 찾은 후 지역의 외부에서 찾는다.

  • for문이나 while문의 소괄호 내부가 아닌 중괄호 내에서 선언된 변수는 생성과 소멸을 반복한다. -> 반복은 중괄호의 진입과 탈출의 반복이기 때문

<전역 변수>

  • 중괄호 내에 선언 되지 않는다.

  • 프로그램의 시작과 동시에 메모리 공간에 할당되어 프로그램의 종료 시까지 존재한다.

  • 초기화를 직접 하지 않더라도 0으로 자동 초기화 된다.

  • 프로그램의 전체 영역 어디서든 접근이 가능하다.



<Static 정적 변수>

  • static 지역 변수

지역 변수에 static 키워드를 붙임으로써 생성되는 정적 변수.
선언된 중괄호 내에서만 접근이 가능( 지역 변수의 특성 )
1회 초기화되고(직접 초기화 하지 않을 경우 0), 프로그램 종료 시까지 메모리 공간에 존재( 전역 변수의 특성 )

  • static 전역 변수

전역 변수에 static 키워드를 붙임으로써 생성되는 정적 변수.
정적 전역 변수는 파일 외부에서 extern 키워드를 이용한 접근이 불가능함. -> 변수의 접근 범위를 해당 파일로 변경

<Register 변수>

지역 변수에 register 키워드를 붙임으로써 생성되는 변수.

Register로 선언된 변수는 CPU 내에 존재하는 ‘레지스터’ 라는 메모리에 공간이 할당될 ‘확률’이 높다. 레지스터 영역은 작고, 중요한 영역으로 상당히 제한이 있는 메모리 공간이기 때문에 register 키워드를 붙인다고 해서 무조건적으로 레지스터 영역에 할당이 되는 것이 아니다. 컴파일러에게 요청을 하는 명령이다.

전역 변수에 register 키워드를 붙이는 요청은 컴파일러에 의해 거절 된다. 중요한 메모리 영역을 전역 변수로 계속 해서 할당을 시키는 것은 명백한 자원 낭비이기 때문이다.



  • 재귀 함수

함수 내에서 자기 자신(함수)을 다시 호출하는 함수.

재귀 함수의 간단한 예이다. 재귀 함수의 필수 구성 요소는 다음과 같다.

  1. 빨간색에 해당하는 1번 원의 ‘ 재귀 호출 ‘ -> 자기 자신에서 자신을 다시 호출하는 것(복사본)

  2. 파란색에 해당하는 2번 원의 ‘ 탈출 조건 ‘ -> 재귀 구조의 무한 루프에 빠지지 않도록 한다.

728x90
반응형

'컴퓨터 언어 정리 > C 언어' 카테고리의 다른 글

08 포인터 기본  (0) 2020.09.11
07 1차원 배열  (0) 2020.09.11
05 반복과 분기  (0) 2020.09.08
04 상수와 자료형  (0) 2020.09.07
03 수의 표현 방식  (0) 2020.09.06
728x90
반응형

지난 포스팅 때, 재귀는 믿음이 졸라 중요하다고 했다. 이번에도 마찬가지다.

그 전에 재귀를 공부할 때, 써야하는 경우에 대한 추가적인 기록이 필요할 것 같아서 먼저 기록한다.

재귀가 필요한 경우

재귀가 필요한 경우는 다음과 같다.

탈출 조건이 명확하고, 같은 작업이 계속해서 반복되는 경우.

피보나찌 수열에서는 n-2항과 n-1 항이 더해지는 부분이 반복된다.

Fibonacci(5) 이면 Fibonacci(4) + Fibonacci(3) 인데 Fibonacci(4)에도 Fibonacci(3)에도 n-2항과 n-1항이 더해지는 부분이 필요하기 때문에 반복이 되고, 이를 재귀로 구현했던 것이다.

이번 포스팅에서 구현해 볼 이진 탐색에서 또한 마찬가지다. 

가운데 값을 구한 후 비교 -> 범위 재설정 

이 작업이 반복되기 때문이다. 탈출 조건의 명확성은 말할 것도 없고 말이다.

이진 탐색에서도 믿음이 필요한가?

물론이다. 필요하다. 위에서 제시한 재귀가 필요한 경우믿음이 존재한다면 재귀 함수를 마음 놓고 신경도 안 쓰고 사용해도 된다.

728x90
반응형

+ Recent posts