응애맘마조
지역변수(Local Variable) 본문
지역변수는 지역 내에 있는 변수입니다. 즉, 중괄호 내에 선언되어 있는 모든 변수는 지역변수입니다. 이러한 변수는 그 지역 내에서, 그 중괄호 내에서만 사용되고 중괄호를 벗어나게 되면 소멸합니다. 새롭게 함수가 호출될 때마다 변수는 새롭게 메모리 공간에 할당됩니다. 지역변수는 선언된 지역 내에서만 유효하기 때문에 지역이 다르면 변수의 이름이 같아도 문제가 되지 않습니다.
위의 사진처럼 똑같은 이름의 num을 2개를 사용하였지만 지역이 다르기 때문에 같은 이름을 사용해도 오류가 뜨지 않고 출력이 되는 모습을 볼 수 있습니다.
Function이라는 함수를 만들어서 num을 10으로 초기화합니다. 그다음 출력문을 사용해서 콘솔창에 num을 출력하는 명령문을 작성하고 마지막에 return을 해서 함수의 종료를 의미하는 반환을 하면서 중괄호를 나가게 되면서 num이라는 함수는 소멸하게 됩니다.
다음 main으로 넘어와서 이 함수 내의 num을 20으로 초기화합니다. 위에 만든 Function 함수를 선언하고 main 안에 있는 num을 출력합니다. Function이 먼저 실행됨으로써 10이 출력되고 다음 20이 출력되어 콘솔창에 출력이 됩니다.
메모리 할당 시에 스택(stack) 영역에 접시 쌓듯이 할당이 됩니다.
지역변수는 함수의 정의에서만 사용할 수 있는 것이 아니고 반복문이나 조건문의 중괄호 내에서도 사용할 수 있습니다.
먼저 반복문 for를 사용한 지역변수입니다.
cnt라는 이름의 지역변수를 하나 만들고 for문에서 0으로 초기화를 합니다. 그리고 for문 안에 있는 중괄호 내에서 num이라는 지역변수를 하나 만들고 0으로 초기화합니다. 그럼 for문 반복과 탈출을 반복하면서 지역변수 num은 cnt가 0부터 4까지 5번을 돌면서 5번을 할당하고 소멸하게 됩니다. (for문에 의한 반복이 중괄호 내에서 이루어지는 것이 아닙니다.)
다음은 조건문 if를 사용한 지역변수입니다.
main 안에 있는 지역변수 num을 1로 초기화를 하고 조건문을 실행합니다. num이 1과 같다면 중괄호 내의 명령문을 실행합니다. if문 안에 있는 지역변수 num을 5로 초기화하고 5를 더합니다. 그래서 if문 내의 num 값은 10이 되고 main 함수 안에 있는 num은 아무런 연산을 하지 않았기 때문에 그대로 1을 출력합니다. 여기서 중요한 것은 if문 내에서는 main 함수 안의 지역변수 num이 가려집니다. 그렇기 때문에 num += 5는 main 함수에 있는 num이 아닌 if문 안에 있는 num이 됩니다. 만약 if문 안에 num이 없으면 main 함수의 num에 접근합니다.
다음은 쓰레기값(Garbage Value)입니다.
위처럼 num값을 초기화하지 않고 출력을 하게 되면 아래처럼 오류가 나는 것과 동시에 쓴 적도 없는 숫자들이 무작위로 출력이 되는 것을 볼 수 있습니다. 이 값을 쓰레기값이라고 합니다.
쓰레기값이 출력되는 이유는 프로그램의 실행과 종료를 하고 새로운 프로그램은 사용하던 메모리에 다시 재사용을 하게 됩니다. 그렇지만 이전에 사용하던 프로그램이 메모리에 어떤 값을 남겨놓았는지 알 수 없습니다. 아무런 쓸모도 없는 값이기 때문에 사용자가 언제든 원하는 값으로 초기화할 수 있습니다. 쓰레기 값은 컴퓨터에 따라 이전에 실행했던 프로그램에 따라 다른 값이 나오게 됩니다.
함수를 정의할 때 선언하는 매개변수도 지역변수의 일종입니다. 그렇기 때문에 매개변수도 지역변수의 특징을 갖게 됩니다. 그래서 '매개변수는 지역변수이다.' 라고 말할 수 있습니다.
지역변수를 자동변수(Automatic Variable)라고도 합니다. 지역 내에서 자동으로 생성되었다가 소멸하기 때문에 붙여진 이름입니다.
읽어주셔서 감사합니다.
'공부 > 개인' 카테고리의 다른 글
static (0) | 2023.03.28 |
---|---|
지역변수와 동적할당을 각각 스택과 힙에 할당하는 이유 (0) | 2023.03.27 |
메모리 구조 (0) | 2023.03.23 |
동적할당(Dynamic Allocation) (0) | 2023.03.08 |
전역변수(Global Variable) (0) | 2023.03.07 |