C++ 변수 타입 완벽 이해: 메모리, 범위, 연산
변수는 프로그램이 조작할 수 있는 명명된 저장소를 제공합니다. C++의 각 변수는 특정 타입을 가지며, 이는 변수 메모리의 크기와 레이아웃, 해당 메모리에 저장할 수 있는 값의 범위, 변수에 적용할 수 있는 연산 집합을 결정합니다.
변수 이름은 문자, 숫자, 밑줄 문자로 구성할 수 있으며, 문자나 밑줄로 시작해야 합니다. C++은 대소문자를 구분하므로 대문자와 소문자는 서로 다릅니다.
지난 장에서 설명한 C++의 기본 변수 타입은 다음과 같습니다.
| 번호 | 타입 및 설명 |
| 1 | bool true 또는 false 값을 저장합니다. |
| 2 | char 일반적으로 단일 옥텟(1바이트). 정수 타입입니다. |
| 3 | int 기계에서 가장 자연스러운 크기의 정수입니다. |
| 4 | float 단정밀도 부동소수점 값입니다. |
| 5 | double 배정밀도 부동소수점 값입니다. |
| 6 | void 타입의 부재를 나타냅니다. |
| 7 | wchar_t 와이드 문자 타입입니다. |
C++은 이후 장에서 다룰 열거형, 포인터, 배열, 참조, 데이터 구조, 클래스 등 다양한 다른 변수 타입도 정의할 수 있게 합니다.
다음 섹션에서는 다양한 타입의 변수를 정의, 선언, 사용하는 방법을 다룹니다.
C++에서 변수 정의
변수 정의는 컴파일러에게 변수를 위해 어디서 얼마나 많은 저장소를 생성할지 알려줍니다. 변수 정의는 데이터 타입을 지정하고, 해당 타입의 변수 목록을 다음과 같이 포함합니다.
type variable_list;
여기서 type은 char, w_char, int, float, double, bool 또는 사용자 정의 객체 등 유효한 C++ 데이터 타입이어야 하며, variable_list는 쉼표로 구분된 하나 이상의 식별자 이름으로 구성될 수 있습니다. 유효한 선언 예:
int i, j, k;
char c, ch;
float f, salary;
double d;
int i, j, k; 줄은 변수 i, j, k를 선언하고 정의하며, 컴파일러에게 int 타입의 i, j, k 변수를 생성하도록 지시합니다.
변수는 선언 시 초기화(초기값 할당)할 수 있습니다. 초기화는 등호와 상수 표현식으로 구성됩니다.
type variable_name = value;
예시:
extern int d = 3, f = 5; // d와 f의 선언
int d = 3, f = 5; // d와 f의 정의 및 초기화
byte z = 22; // z의 정의 및 초기화
char x = 'x'; // 변수 x의 값은 'x'
초기화 없이 정의된 경우: 정적 저장 기간을 가진 변수는 암시적으로 NULL(모든 바이트가 0)로 초기화되며, 그 외 변수의 초기값은 정의되지 않습니다.
C++에서 변수 선언
변수 선언은 주어진 타입과 이름의 변수가 존재함을 컴파일러에게 보증해, 컴파일러가 변수에 대한 완전한 세부 사항 없이도 추가 컴파일을 진행할 수 있게 합니다. 변수 선언은 컴파일 시에만 의미가 있으며, 프로그램 링크 시에는 실제 변수 정의가 필요합니다.
여러 파일을 사용하고 변수를 그중 하나에 정의해 링크 시에 사용할 수 있게 할 때 변수 선언이 유용합니다. 변수를 어디서든 선언하려면 extern 키워드를 사용합니다. C++ 프로그램에서 변수를 여러 번 선언할 수 있지만, 정의는 파일, 함수, 코드 블록에서 단 한 번만 할 수 있습니다.
예제
맨 위에서 변수가 선언되었지만 메인 함수 내부에서 정의된 예제를 시도해 보세요.
Live Demo
#include <iostream>
using namespace std;
// 변수 선언:
extern int a, b;
extern int c;
extern float f;
int main () {
// 변수 정의:
int a, b;
int c;
float f;
// 실제 초기화
a = 10;
b = 20;
c = a + b;
cout << c << endl;
f = 70.0/3.0;
cout << f << endl;
return 0;
}
위 코드를 컴파일하고 실행하면 다음 결과가 나옵니다.
30
23.3333
같은 개념이 함수 선언에도 적용됩니다. 함수 이름을 선언 시에 제공하고 실제 정의는 다른 곳에서 줄 수 있습니다. 예:
// 함수 선언
int func();
int main() {
// 함수 호출
int i = func();
}
// 함수 정의
int func() {
return 0;
}
Lvalue와 Rvalue
C++에는 두 종류의 표현식이 있습니다.
lvalue − 메모리 위치를 참조하는 표현식을 "lvalue" 표현식이라 합니다. lvalue는 대입 연산의 좌변 또는 우변에 나타날 수 있습니다.
rvalue − 메모리 내 특정 주소에 저장된 데이터 값을 가리키는 용어입니다. rvalue는 값이 대입될 수 없는 표현식으로, 대입 연산의 우변에는 나타날 수 있지만 좌변에는 나타날 수 없습니다.
변수는 lvalue이므로 대입 연산의 좌변에 나타날 수 있습니다. 숫자 리터럴은 rvalue이므로 대입될 수 없으며 좌변에 나타날 수 없습니다. 다음은 유효한 문장입니다.
int g = 20;
하지만 다음은 유효하지 않은 문장이며 컴파일 타임 에러를 발생시킵니다.
10 = 20;