변수

변수(Variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미합니다. 즉, 변수란 데이터를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 저장된 값은 변경될 수 있습니다.

변수와 메모리 주소

변수는 기본적으로 메모리의 주소(address)를 기억하는 역할을 합니다. 메모리 주소란 물리적인 메모리 공간을 서로 구분하기 위해 사용되는 일종의 식별자입니다. 즉, 메모리 주소란 메모리 공간에서의 정확한 위치를 식별하기 위한 고유 주소를 의미합니다.

변수를 참조할 때는 메모리의 주소를 참조하는 것이 아닌, 해당 주소에 저장된 데이터를 참조하게 됩니다. 따라서 변수는 데이터가 저장된 메모리의 주소뿐만 아니라, 저장된 데이터의 크기와 형태에 관한 정보도 같이 기억해야 합니다.

변수의 이름 생성 규칙

변수의 이름은 짧으면서 저장될 데이터의 의미를 잘 나타내도록 짓는 것이 좋습니다.

변수의 이름을 생성할 때 반드시 지켜야 하는 규칙은 다음과 같습니다.

  1. 영문자(대소문자), 숫자, 언더스코어(_)로만 구성됩니다.
  2. 같은 이름이더라도 대소문자를 구분합니다. (x 와 X는 서로 다른 이름)
  3. 항상 문자로 시작해야 합니다.
  4. 공백을 포함할 수 없습니다.
  5. C++에서 미리 정의된 키워드(keyword)는 사용할 수 없습니다.
  6. 식별자의 길이에는 제한이 없습니다. (개발 환경에 따라 31자에 제한이 있을 수 있습니다.)
  7. 한글도 사용이 가능하나 일반적으로 사용하지 않습니다.

변수 명명법

여러 개발자가 협업을 해야하는 경우가 많아 하나의 프로젝트에서 모두 동일한 규약으로 변수 이름을 만들도록해 코드의 가독성을 높일 수 있도록 한것입니다.

  • Camel Casing(카멜 표기법, 낙타 표기법)
    • 각 단어의 첫문자를 대문자로 표기하고 붙여쓰는 표기법으로 맨 처음 문자는 소문자로 표기
      • 예) utilityBox, mainFrame, personState
  • Pascal Casing(파스칼 표기법)
    • 변수 이름의 시작을 대문자로 표기하고 복합어인 경우 중간에 시작하는 새로운 단어의 첫 단어도 대문자로 표기
      • 예) UtilityBox, MainFrame, PersonState
  • Hungarian notiation(헝가리안 표기법)
    • 찰스 시모니(Charles Simonyi)가 사용하던 변수 이름 규정으로 마이크로소프트 내부에서 사용하던 표기법
    • IDE의 발달로 변수에서 커서만 가져가면 해당 변수의 각종 정보를 보여주는 기능을 지원해 마이크로소프트의 공식 가이드라인에서 사용하지 말 것을 권고
      • 예) int자료형 + apple -> intApple
  • Snake Casing(스네이크 표기법)
    • 단어들을 모두 소문자로 쓰는것이 일반적이고, 한 문자마다 ‘_‘를 붙여 이어가는 표기법
      • count_my_apple, count_my_apple_and_peach

선언

프로그램에서 데이터를 처리하기 위해서 데이터를 저장할 메모리 공간이 요구됩니다. 메모리 공간을 할당받는 행위를 변수의 선언(Declaration)이라고 부릅니다.

변수를 선언하는 방법에는 대표적으로 두 가지 방법이 있습니다.

  1. 변수의 선언만 하는 방법
  2. 변수의 선언과 동시에 초기화하는 방법

변수의 선언만 하는 방법

int a;
char b;
float c;

이 방법은 먼저 변수를 선언하여 메모리 공간을 할당받고, 나중에 변수를 초기화하는 방법입니다.

하지만 이렇게 선언만 된 변수는 C++에서 자동으로 초기화하지 않았기 때문에 해당 메모리 공간에는 알 수 없는 쓰레기값이 들어가 있습니다 따라서 초기화하지 않고 사용하는 변수는 문제가 될 수 있습니다.

선언하고자 하는 변수들의 타입이 같다면 이를 동시에 선언할 수 있습니다.

int num0, num1, num2, num3;
char a, b, c;
float x, y;

변수의 선언과 동시에 초기화하는 방법

int x = 1;              copy initialization (복사 초기화)
int y(2);               direct initialization (직접 초기화)
int z{ 3 };             uniform initialization (유니폼 초기화)
int w = { 4 };          uniform copy initialization (유니폼 복사 초기화)

변수의 선언과 동시에 원하는 값을 저장할 수 있으며, 변수에 값을 처음 넣는 행위를 초기화라고 부릅니다.

변수를 초기화 할 때 L-Value와 R-Value의 개념이 사용되는데 L-Value는 단일 표현식 이후에도 없어지지 않고 지속되는 객체, 즉 이름을 가진 변수를 말합니다. Const 타입을 포합한 모든 변수는 L-value입니다. R-Value는 표현식이 종료된 이후 더이상 존재하지 않는 임시적인 값을 의미합니다.

첫번째로 대입연산자(=)를 사용하는 복사 초기화입니다. 말 그대로 오른쪽에 있는 값을 복사해 왼쪽에 있는 L-Value에 대입하는게 원래 방법이지만 성능을 위해 실제로 변수에 값이 대입되는 복사가 이루어지지 않고, 최적화 되어 값(R-Value)의 메모리 주소에 변수명이 주어지는 식으로 초기화됩니다.

두번째로 소괄호()를 사용하는 직접초기화입니다. ()안에 값을 넣는 식으로 사용합니다. 정수와 같은 간단한 데이터 유형에서 최적화된 복사 초기화와 기본적으로 동일하나 일부 데이터 자료형의 변수에 대해서만 동작합니다.

세번째로 중괄호{}를 사용하는 유니폼 초기화입니다. 유니폼 초기화와 유니폼 복사 초기화는 동일하게 작동하며, 직접 초기화와 같은 방법으로 사용하지만 괄호 안을 비워둔 상태로 사용할 경우 0으로 초기화합니다. 값을 자료형이 보유할 수 없는 경우(값에 손실이 일어나는 경우) 초기화되지 않는데 int에 float을 초기화하려는 형변환이나 범위를 넘어서는 값을 넣어 축소변환을 허용하지 않습니다.

Date:     Updated:

카테고리:

태그:

Cpp 카테고리 내 다른 글 보러가기

댓글남기기