[C++] C++에서 사용되는 개념 11탄(지역변수와 전역변수의 한계)

Patrick!·2023년 1월 9일
0
post-thumbnail

지역변수와 전역변수 ?

모든 프로그레밍 언어에서는 당연하게 사용되는 개념 지역변수와 전역변수이다.

  • 전역변수 => 작성한 파일 안 어디에서나 사용할 수 있는 변수
  • 지역변수 => 지정한 루프 안에서 사용할 수 있는 변수

이 개념을 모를 사람은 없을거라 본다. (프로그레밍 언어를 배웠다면!)

전역변수는 스택 프레임 중 DATA영역(.rodata .data BBS)에 해당한다.

초기화 여부, const 등 설정을 하더라도 DATA영역에서 사용된다.

int globalValue = 0;

지역변수는 스택 프레임 중 STACK영역에 해당한다.

해당하는 영역(함수) 안에서 사용되는 변수의 개념이다.
이는 사용하는 법에 따라 의미가 달라진다. 지역변수가 어떻게 사용이 되는지 알아보자.

int main() {
	int hp = 1;
}

그럼 여기서 전역변수와 지역변수를 왜 나눈 것인가?

한가지 가정을 들어보자
이처럼 간단한 예제를 만드는 것이 아니라 실전에서 일하는 환경처럼 code line이 10만줄 이상되는 프로젝트에서

code line: 1,000,000줄
function: 6,000개
GlobalValue: 3,000개

무지성으로 전역변수를 남발했다고 하자. (고양이도 놀라서 잠깐 멈춰 세울 일이다.)

이렇게 있는 상황속에서 전역변수만으로 컨트롤하게 되면 상당한 복잡성을 갖게 된다. 나아가 코드의 가독성 또한 미쳐버리게 만든다.... (뚱이처럼 아마 정신놓고 웃고만 있을 것이다.)

A라는 전역변수를 어디에서 물고 이걸 또 다른 곳에서 물고 연쇄적인 반응들이 결국에는 에러나 크러시형태로 나타나게 되는데 이를 방지하기 위해서(이외에도 다양한 이유가 있다.) 지역변수라는 개념이 필요한 것이다.

이를 보면서 한가지 궁금한 점이 생기기 마련이다.
코드를 배울 당시(현재는 아니라는 소리!),
전역변수와 지역변수의 이름이 같다면 값이 전달 될 수 있을까? 라는 의문을 가지고 알게 된 사실이다.

#include <iostream>
using namespace std;

void IncreseHp(int hp) {
	hp = hp + 1;
}

int main() {
	int hp = 1;

    cout << "Increse 호출 전 : " << hp << endl;
    IncreseHp(hp);
    cout << "Increse 호출 후 : " << hp << endl;
}

위와 같이 지역변수를 IncreseHp로 보내어 연산을 한 후, 다시 출력을 하면 2가 나오지 않을까?! 하는 행복회로를 돌렸었다.

결과는 아니다. (행복회로 불타서 없어짐) 이유는 간단하다. main()에서 사용하는 지역변수인 int hp가
void IncreseHp(int hp)의 인자값으로 들어가 hp = hp + 1 라는 연산을 거친다고 한다해도 main() { int hp = 1; } 에는 아무런 영향을 주지 않기 때문이다.

조금 쉽게 말한다면 반환값(return)이 없다...


이때당시만 하더라도 나는 재능어 없는 줄 알고 좌절감에 빠졌던 적이다... 하지만 이후에 지역/전역 변수에 대하여 확실하게 알게 된 개념을 통해 극복할 수 있었다.

이를 통해서 알 수 있는 것 => 전역변수는 어디에나 영향받거나 줄 수도 있지만 지역변수는 그에 비해 한정적이다.

하지만 C++에서는 이를 초월할 수 있는 무기가 ... 있었으니 ...

Pointer 라는 개념은 지역변수와 전역변수에 대한 영역을 뛰어넘을 수 있는 C언어의 최고 장점이자 최악의 단점인 양날의 검이다.

이를 사용하는데 있어 가장 중요한 것은 다음시간에 ~

profile
C++와 Unreal Engine / C#과 Unity / Katalon Studio를 통한 자동화 테스트 등을 하루하루 공부한 기록

0개의 댓글