변수, 상수, 리터럴
값을 다루기 위해서는 메모리에 저장해야 하고, 저장된 값을 다시 참조하거나 조작해야 한다.
변수(Variable)
데이터를 저장할 수 있는 이름을 가진 메모리 공간. 선언 시 해당 타입에 맞는 크기의 메모리가 확보된다.
int x = 10;
x = 20; // 변경 가능
- 변경 가능(mutable)
- 데이터 영역(data segment)
상수(Constant)
한 번 초기화 하면 그 이후로 값을 바꿀 수 없는 메모리 공간. 컴파일러는 상수에 대한 변경 시도를 오류로 처리함.
const int MAX = 100;
MAX = 200; // error
- 변경 불가(immutable)
- 읽기 전용 데이터 영역(read-only data segment)
리터럴(Literal)
코드 상에 직접 쓰여 있는 하드코딩된 값.
42
, 3.14
, 'A'
, "hello"
같은 값들이 리터럴이다.
int age = 42; // 정수 리터럴
- 프로그램에 직접 쓰이는 고정 값
- 컴파일 타임에 읽기 전용 데이터 영역
리터럴 재사용
컴파일러는 동일한 문자열 리터럴이 여러 번 등장하면, 이를 재사용 할 수 있다.
char* a = "hello";
char* b = "hello";
printf("a: %p\n", a); // a: 0x60a9c9303004
printf("b: %p\n", b); // b: 0x60a9c9303004
- 컴파일러는 메모리 절약을 위해 문자열 리터럴 주소를 재사용
- 그러나 재사용 여부는 표준은 아니고 컴파일러의 재량
숫자 리터럴은 값으로 취급되며 주소를 가지지 않기 때문에, 같은 리터럴이라 하더라도 메모리 차원에서 공유되지 않는다.