함수에서 사용되는 변수는 지역 변수, 전역 변수, 정적(static) 변수, 외부(extern) 변수, 레지스터(register) 변수가 있습니다. 이러한 변수들은 선언되는 위치나 종류에 따라 메모리상에 존재하는 기간이 다릅니다. 이번 절에서는 변수의 심화 학습으로 변수의 종류와 범위에 대해서알아보겠습니다.
- 지역 변수
- 전역 변수
- 정적 변수
- 외부 변수
- 레지스터 변수
지역 변수
지역 변수(Local Variable)는 main() 함수, 조건문, 반복문의 중괄호(블록) 내부와 함수의 매개 변수(Parameter)로 사용되는 변수를 의미합니다.
다음 그림을 보면 자료형과 변수 이름까지 같은 변수 result가 동시에 두 곳 있습니다. 문제가 될 것 같지만 그렇지 않습니다. sum()함수의 중괄호 내에 있는 변수 result main()함수 내에 있는 변수 result는 이름만 같을 뿐이지 지역적으로는 전혀 다른 변수이기 때문입니다.
앞의 그림과 같이 서로 다른 지역에서 같은 이름으로 존재하는 변수의 특성을 예제를 가지고 자세히 알아보겠습니다.
6행에서 main() 함수의 중괄호 내에서만 사용 가능한 지역 변수 aaa를 선언하고 10으로 초기 화합니다. 그래서 main()함수의 aaa 변수 이름으로 메모리가 생성됩니다. 그리고 15행에서 func_A() 함수의 중괄호 내에서만 사용 가능한 지역 변수 aaa를 선언하고 20으로 초기화합니다. 그래서 func_A() 함수의 aaa 변수 이름으로 메모리가 생성됩니다. 16행에서 func_A() 함수의 중괄호 내에서만 사용 가능한 지역 변수 bbb를 선언하고 30으로 초기화합니다. 그래서 func_A() 함수의 bbb 변수 이름으로 메모리가 생성됩니다.
20행에서 func_A() 함수의 return이 실행되는 순간 func_A() 함수의 중괄호 내에서 사용되던 지역 변수 aaa, bbb가 메모리에서 모두 소멸됩니다. 그리고 10행에서 main() 함수의 'return 0'이 실행되는 순간 main() 함수의 중괄호 내에서 사용되던 지역 변수 aaa가 메모리에서 소멸됩니다.
서로 다른 중괄호 내에서 같은 이름으로 변수 aaa가 선언되었지만 지역적으로 서로 완전히 다른 변수라는 것을 이해했을 것입니다. 또한 앞의 그림과 같이 지역 변수는 해당 지역(중괄호)에서 메모리를 생성해서 사용하고 해당 지역을 빠져나가면 메모리가 자동으로 소멸되는 특징이 있습니다.
또 다른 예제를 가지고 지역 변수의 특성을 더 잘 이해해 보겠습니다.
예제는 13행에서 에러가 발생합니다. [F4] 키를 눌러 에러의 내용을 확인해 보면 다음과 같습니다.
error C2065: 'total' : 선언되지 않은 식별자입니다.
왜 이러한 에러가 발생했을까? 바로 지역 변수의 특징 때문입니다. 9행에서 선언된 변수 total은 7행과 11행 사이, 즉 for 문의 중괄호 내에서만 사용되는 지역 변수입니다. for 문의 중괄호 11행을 벗어나면 변수 total의 메모리는 소멸되어 더 이상 메모리에 존재하지 않습니다.
따라서 13행에서는 메모리에서 소멸된 변수 total을 조건문에서 비교하고 있기 때문에 에러가 발생합니다. 그러면 어떻게 에러를 제거할 수 있을까? 5행의 주석을 제거하면 문제가 해결됩니다.
다음 예제를 가지고 함수의 매개 변수(함수의 인자)도 지역 변수라는 사실을 알 수 있습니다.
6행과 7행에서 main() 함수의 지역 변수 a, b, result가 각각 초기화되어 메모리에 생성되고, 9행에서 a, b의 값을 가지고 13행의 subtract() 함수를 호출합니다. subtract()함수가 호출되는 순간 이 함수의 매개 변수 x에 a의 값이 복사되고 y에 b의 값이 복사되어 x와 y 메모리가 생성됩니다. 이렇게 매개 변수는 일반 지역 변수와 달리 초기화 시점이 다르다는 것을 알 수 있습니다.
15행에서 x-y의 결과를 9행 main() 함수의 변수 result에 반환하고, subtract()함수가 종료되어 x, y 메모리가 소멸되고, 11행이 수행되어 main() 함수의 지역 변수인 a, b, result 메모리가 소멸됩니다. 13행에서 사용된 subtract() 함수의 int x
와 int y 같은 모든 매개 변수들은 지역 변수임을 반드시 숙지해야 합니다.
결론적으로 지역 변수의 특징을 정리하면 다음과 같습니다.
- 초기화를 하지 않으면 쓰레기 값이 저장됨
- 지역 변수의 메모리 생성 시점 중괄호 내에서 초기화할 때
- 지역 변수의 메모리 소멸 시점 중괄호를 탈출할 때
'프로그래밍언어 > C언어' 카테고리의 다른 글
함수 적용 2가지 방법 part2 (0) | 2022.11.03 |
---|---|
함수 적용 2가지 방법 part1 (0) | 2022.11.02 |
함수의 형태 네 가지 (0) | 2022.09.28 |
다양한 형태의 함수들 (2) | 2022.09.27 |
함수란 무엇인가 (0) | 2022.09.06 |
댓글