전체 코드

1. 전역 변수(Global Variable)

전역 변수는 프로그램 어디에서나 접근할 수 있는 변수입니다.

🔹 전역 변수 특징

  • 함수 외부에서 선언된 변수로, 프로그램이 종료될 때까지 메모리에 유지됨
  • 메모리의 데이터 영역(.data, .bss, .rodata)에 저장됨
  • 프로그램 내 어디서든 접근 가능하며, 여러 함수에서 공유될 수 있음
  • 값이 변경될 수 있어 예기치 않은 변경(side effects) 이 발생할 가능성이 있음
  • 메모리 할당이 고정되므로 메모리 사용 효율이 낮을 수도 있음

📌 전역 변수 예제

#include <iostream>
using namespace std;

// 전역 변수: 어디에서나 접근 가능 (메모리 데이터 영역에 저장)
int globalValue = 0;

void Test() {
    cout << "전역 변수의 값은 : " << globalValue << endl;
    globalValue++;  // 전역 변수 값을 증가
}

int main() {
    cout << "전역 변수의 값은 : " << globalValue << endl;
    globalValue++;  // 전역 변수 값 변경

    Test();  // 함수 호출 → 전역 변수 값 변경

    return 0;
}

📌 실행 결과

전역 변수의 값은 : 0
전역 변수의 값은 : 1

📌 전역 변수의 메모리 저장 위치

메모리 영역저장되는 데이터
.rodata상수(const) 데이터
.data초기화된 전역 변수
.bss초기화되지 않은 전역 변수

2. 지역 변수(Local Variable)

지역 변수는 함수 내에서 선언되며 해당 함수에서만 접근 가능한 변수입니다.

🔹 지역 변수 특징

  • 특정 함수 내에서만 사용 가능 (함수 스코프를 가짐)
  • 메모리의 스택(Stack) 영역에 저장됨
  • 함수가 종료되면 자동으로 해제
  • 같은 이름의 지역 변수를 여러 함수에서 선언 가능 (서로 독립적)
  • 메모리 효율이 좋으며, 예기치 않은 값 변경을 방지할 수 있음

📌 지역 변수 예제

#include <iostream>
using namespace std;

void Test() {
    int localValue = 10;  // 지역 변수 (스택에 저장됨)
    cout << "Test 함수 내부의 지역 변수 값: " << localValue << endl;
}

int main() {
    int localValue = 5;  // main 함수 내부의 지역 변수 (다른 변수)
    cout << "main 함수 내부의 지역 변수 값: " << localValue << endl;

    Test();  // 다른 함수 호출 → Test 함수의 지역 변수는 main과 다름

    return 0;
}

📌 실행 결과

main 함수 내부의 지역 변수 값: 5
Test 함수 내부의 지역 변수 값: 10

📌 지역 변수의 메모리 저장 위치

메모리 영역저장되는 데이터
Stack지역 변수, 함수 호출 스택 프레임

지역 변수는 함수가 종료되면 사라지므로, 함수 밖에서 사용할 수 없습니다! 🚨


3. 값 전달(Value Passing)

함수에 변수를 전달하는 방식 중 하나로, 값을 복사하여 전달하는 방식입니다.

🔹 값 전달 특징

  • 함수를 호출할 때 매개변수(parameter) 를 통해 값을 전달
  • 전달된 값은 복사본(copy) 이므로, 원본 변수에는 영향을 미치지 않음
  • 스택(Stack) 영역에서 매개변수 공간이 따로 할당됨

📌 값 전달 예제

#include <iostream>
using namespace std;

// 매개변수 hp에 전달된 값은 '복사본' (원본 영향 없음)
void IncreaseHp(int hp) {
    hp = hp + 1;  // 증가한 값은 원본이 아니라 복사본에 적용됨
}

int main() {
    int hp = 1;  // 원본 변수

    cout << "Increase 호출 전 : " << hp << endl;
    IncreaseHp(hp);  // hp의 값을 IncreaseHp 함수에 전달 (복사됨)
    cout << "Increase 호출 후 : " << hp << endl;  // 여전히 1

    return 0;
}

📌 실행 결과

Increase 호출 전 : 1
Increase 호출 후 : 1

💡 원본 hp 변수는 값이 변하지 않음! → 왜냐하면 IncreaseHp(int hp) 함수가 받은 hp복사본이기 때문.


4. 스택 프레임에서의 지역 변수 & 값 전달

지역 변수와 매개변수가 함수 호출될 때 어떻게 스택에 저장되는지 확인해보겠습니다.

📌 스택 프레임 구조

[매개변수 (복사본 hp=1)]
[리턴 주소]
[지역 변수]   <- 스택에 저장됨

📌 값 전달이 일어날 때의 메모리 변화

  1. main() 함수에서 hp = 1 선언 (스택에 저장됨)
  2. IncreaseHp(hp) 호출 → hp 값을 복사하여 IncreaseHp() 함수의 스택 프레임에 저장
  3. IncreaseHp()에서 hp = 2로 변경되지만, 이 값은 복사본이므로 원본 hp에는 영향 없음
  4. IncreaseHp() 함수가 종료되면, 스택에서 해당 스택 프레임이 해제됨
  5. main() 함수에서 hp 값을 출력하면 여전히 1

📌 매개변수의 값이 변경되어도 원본 변수는 영향을 받지 않음! (복사된 값만 변경됨)


5. 전역 변수 vs. 지역 변수 비교

특징전역 변수(Global Variable)지역 변수(Local Variable)
선언 위치함수 외부함수 내부
메모리 위치데이터 영역 (.data, .bss)스택(Stack) 영역
사용 범위프로그램 전체선언된 함수 내에서만 사용 가능
수명프로그램 종료 시까지 유지함수가 끝나면 제거됨
초기화 여부명시적 초기화 필요초기화 없이 사용 가능 (쓰레기값 주의)
데이터 공유여러 함수에서 공유 가능함수 내에서만 유지됨

6. 정리

전역 변수(Global Variable)

  • 데이터 영역에 저장, 프로그램 종료까지 유지
  • 여러 함수에서 공유 가능하지만, 값이 변경될 가능성이 높음 (주의 필요!)

지역 변수(Local Variable)

  • 스택(Stack) 영역에 저장, 함수가 끝나면 제거됨
  • 특정 함수 내에서만 접근 가능 (메모리 관리 효율적)

값 전달(Value Passing)

  • 복사본을 전달하여 함수에서 변경하더라도 원본 값에는 영향을 주지 않음
profile
李家네_공부방

0개의 댓글