변수
변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미
지역 변수
- 함수 내부에서 생성되는 변수
- 스택(Stack)에 저장되며, 선언된 함수 내에서만 사용된다.
- 함수가 종료되면 해당 변수는 소멸한다.
- { } 중괄호를 기준으로 하나의 지역(지역변수가 생존하는 영역)을 구분한다.
지역 변수 예제
#include <iostream>
using namespace std;
int change_num() {
int a = 10;
return 0;
}
int main() {
int a = 0;
change_num();
cout << "a = " << a << endl;
return 0;
}
a = 0
- change_num 함수를 호출하여 int a = 10으로 초기화하였음에도 a = 0이 출력되었다.
- 함수 change_num에서의 변수 a와 main에서의 변수 a가 각각 지역변수이기 때문에 해당 함수 내에서만 유효하다.
- 따라서 change_num이 main의 변수 a에 영향을 줄 수 없어 a = 0의 값이 그대로 출력되었다.
전역 변수
- 프로그램이 시작될 때 생성되는 변수
- 데이터 세그먼트(Data Segment) 영역에 저장되며, 지역의 제약 없이 프로그램 전체에 사용이 가능하다.
- 프로그램이 종료되면 소멸된다.
- 모든 전역 변수는 초기화를 따로 하지 않아도, 정의와 동시에 0으로 자동으로 초기화된다.
전역 변수 예제
#include <iostream>
using namespace std;
int a; // 자동으로 0으로 초기화됨
int change_num() {
a = 10;
return 0;
}
int main() {
cout << "a(함수 호출 전): " << a << endl;
change_num();
cout << "a(함수 호출 후): " << a << endl;
return 0;
}
a(함수 호출 전): 0
a(함수 호출 후): 10
- 전역변수는 모든 함수에서 접근이 가능하므로 사용하는 데 매우 주의를 기울여야 한다.
- 되도록이면 많은 수의 전역 변수를 선언하지 않는 편이 좋다.
정적 변수
- 지역변수의 소멸을 막기 위해 함수가 종료되었음에도 메모리 공간을 유지하는 변수
- static 키워드를 사용하여 다음처럼 선언한다.
- static 변수를 선언하는 것은 딱 한 번만 실행된다. ▶ static 변수를 선언하는 함수를 여러번 실행하더라도 값이 초기에 설정한 값으로 초기화되지 않는다.
static datatype dataname;
정적 변수 예제
예제 1) 메모리 유지 확인
#include <iostream>
using namespace std;
int *set_num() {
static int a = 10;
cout << "a의 메모리 주소(함수 안): " << &a << endl;
return &a;
}
int main() {
int *ptr = set_num();
cout << "a의 메모리 주소(함수 밖): " << ptr << endl;
cout << "ptr이 가리키는 값: " << *ptr << endl;
return 0;
}
a의 메모리 주소(함수 안): 0101C020
a의 메모리 주소(함수 밖): 0101C020
ptr이 가리키는 값: 10
- a는 set_num 안에서 정의된 변수임에도 불구하고, static으로 정의되었기 때문에 함수가 종료되어도 메모리 공간이 유지되었음을 알 수 있다.
예제 2) static 변수 선언 횟수 확인
#include <iostream>
using namespace std;
int plus_num1() {
static int num = 0;
if (num == 0) cout << "plus_num1에서 num의 주소: " << &num << endl;
num += 10;
cout << "plus_num1에서 num의 값: " << num << endl;
return 0;
}
int plus_num2() {
static int num = 0;
if (num == 0) cout << "plus_num2에서 num의 주소: "<< &num << endl;
num += 10;
cout << "plus_num1에서 num의 값: " << num << endl;
return 0;
}
int main() {
plus_num1();
plus_num2();
plus_num2();
plus_num2();
plus_num1();
return 0;
}
plus_num1에서 num의 주소: 00F4C148
plus_num1에서 num의 값: 10
plus_num2에서 num의 주소: 00F4C14C
plus_num1에서 num의 값: 10
plus_num1에서 num의 값: 20
plus_num1에서 num의 값: 30
plus_num1에서 num의 값: 20
- plus_num1과 plus_num2에서 서로 같은 이름의 변수 num을 선언하였음에도 서로 다른 메모리 공간에 저장된다.
- 함수를 여러 번 호출하여 static int num = 0 구문을 여러 번 만났음에도 num이 0으로 초기화되지 않았음을 알 수 있다. ▶ static을 통한 정적 변수 선언은 맨 처음에 딱 한 번만 실행된다.
변수명명 가이드
- 변수 이름을 짓는 기준은 통일하는 것이 좋다. 다음 사이트를 참고하자.