변수를 이용할때는 메모리에 공간을 할당해야 합니다. 해당 변수를 제외한 그 다른 어떤 코드도 변수의 내용을 변경하면 안되기 때문입니다. 즉, 변수의 선언은 메모리의 특정 위치 (주소)를 해당 변수에 그 메모리 위치를 알려주는 행위입니다. 그래서 변수의 값을 참조하는 것은 메모리의 특정 위치 (주소)에 있는 내용을 가져온다는 뜻이니까요. 그리고 변수의 이용이 끝나면 소멸되어야 합니다. 메모리에서 특정 변수가 차지했던 위치를 해제 해야 다른 코드나 변수가 그 공간을 이용할 수 있으니까요. 만약, 메모리 해제를 하지 않는다면 해당 메모리 위치는 그 누구도 사용할 수 없게 되어 사용할 수 있는 메모리의 영역이 점점 줄어들고 결국에는 메모리 부족으로 프로그램이 다운됩니다. 이를 메모리 누수 (memory leak)이라고 합니다.
그렇다면 변수는 언제 메모리를 할당하고 해제할까요? 어떻게 이용을 다 했는지 알까요? 메모리의 할당은 변수가 선언될 때 합니다. 변수 선언문을 찾으면 되기 때문에 비교적 쉽게 알 수 있습니다. 그럼 메모리의 소멸은 언제 일어날까요? 그것은 바로 범위 (scope)에 있습니다. 중괄호 시작 기호{ 와 마침 기호 }로 코드 범위를 설정하는데, 범위가 끝날때 변수의 쓰임이 다 했다고 판단합니다. 즉, 범위가 끝나는 순간 그 안에 있는 모든 변수를 소멸합니다.
int main()
{ // 코드범위 시작
int a = 10;
float b = 3.4f;
std::cout << a << b << std::endl;
} // 코드범위 종료
다음과 같이 함수의 내용은 { }안에 작성합니다. 함수 자체가 하나의 커다란 범위라고 생각하면 됩니다. 함수가 종료되면 함수안에서 선언한 모든 변수는 소멸합니다. 때로는 함수안에서 또 다른 범위를 사용할 수 도 있습니다.
int main()
{ // 코드범위 시작
int a = 10;
{ // 코드범위 시작
int b = 10;
std::cout << "a = " << a << ", b = " << b << std::ends;
} // 코드범위 종료
std::cout << "a = " << a << std::ends; // ERROR! a는 소멸되어 더 이상 참조할 수 없습니다.
std::cout << "b = " << b << std::ends; // 여전히 b는 참조할 수 있습니다.
return 0;
} // 코드범위 종료
main 함수안에서 작성한 코드 범위는 해당 블럭이 종료될때 그 블럭안에서 선언된 모든 변수가 소멸합니다. 앞의 예제에서 a는 여전히 main함수 내에서 참조 가능하지만, 내부 코드블럭에서 선언한 b는 블럭 밖에서는 사용할 수 없습니다. 이는 다음에 얘기할 if문 이나 for문의 블럭에서도 유효합니다.
변수의 수명 (Lifetime)은 가급적 짧게
변수는 필요할때 생성하고 사용을 다 하면 바로 소멸시키는 것이 좋습니다. 이는 메모리 관리 측면 뿐만 아니라 코드 관리 측면에서도 좋습니다. 코드가 커질수록 코드안에서 선언한 변수의 관리도 힘들고, 가끔 잘못 사용하는 경우도 있기 때문입니다.
변수의 수명에 대해 조금 더 어렵고 복잡한 내용은 레퍼런스를 참조하세요.
'C++' 카테고리의 다른 글
| 현업에서 사용하는 모던 C++ Ep1. 변수 (variable) (1) | 2024.01.07 |
|---|---|
| [강좌] 현업에서 사용하는 모던 C++ (1) | 2024.01.07 |