wn42
코딩이랑 이것저것
wn42
전체 방문자
오늘
어제
  • 분류 전체보기 (113)
    • 프로그래머스 (23)
      • LV1 (11)
      • LV2 (1)
      • LV3 (3)
      • 연습 (8)
    • 딥러닝 공부 (0)
      • 머신러닝&딥러닝 이론 (0)
    • 임베디드 (17)
      • Adventure Design (1)
      • 센서기반모바일로봇 (5)
      • ROS (9)
      • Google Coral (2)
    • C++ (38)
      • C++ 기초 (34)
      • 자료구조 및 알고리즘 (4)
    • Python (14)
      • 기본 파이썬 문법 (6)
      • Python 기초 (8)
    • 빅데이터 (9)
      • 빅데이터 첫걸음 시작하기(국비지원) (5)
      • 빅데이터 공부 (4)
    • 알고리즘 공부 (2)
      • 기본 알고리즘 (2)
    • 전자공학 (10)
      • 반도체 공정 (3)
      • 무선데이터통신 (7)
      • 반도체공학 (0)
    • C# (0)
      • C# 기본 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 인스턴스
  • numpy
  • 클래스
  • 데이터분석 인강
  • c++
  • Python
  • 스택/큐
  • 패스트캠퍼스
  • 바이트디그리
  • Queue
  • ROS
  • 내일배움카드
  • 정렬
  • 빅데이터
  • 프로그래머스
  • 소멸자
  • K디지털크레딧
  • google coral
  • 반복문
  • 딥러닝
  • 상속
  • 조건문
  • 데이터분석
  • 노드
  • 빅데이터 첫걸음 시작하기
  • 파이썬
  • stl
  • 변수
  • 스택
  • 큐

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
wn42

코딩이랑 이것저것

C++/C++ 기초

[C++] 변수 이해하기 (지역/전역/정적)

2022. 12. 28. 18:00

 변수 

변수(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을 통한 정적 변수 선언은 맨 처음에 딱 한 번만 실행된다.

 

 

변수명명 가이드

  • 변수 이름을 짓는 기준은 통일하는 것이 좋다. 다음 사이트를 참고하자.
 

Google C++ Style Guide

Google C++ Style Guide Background C++ is one of the main development languages used by many of Google's open-source projects. As every C++ programmer knows, the language has many powerful features, but this power brings with it complexity, which in turn ca

google.github.io

    'C++/C++ 기초' 카테고리의 다른 글
    • [C++] 매크로 / 인라인
    • [C++] void 타입 / main 함수
    • [C++] 열거형(Enum)
    • [C++] 공용체(Union)
    wn42
    wn42
    코딩이랑 이것저것 하는 블로그

    티스토리툴바