본문으로 건너뛰기

변수, 상수, 리터럴

값을 다루기 위해서는 메모리에 저장해야 하고, 저장된 값을 다시 참조하거나 조작해야 한다.

변수(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
  • 컴파일러는 메모리 절약을 위해 문자열 리터럴 주소를 재사용
  • 그러나 재사용 여부는 표준은 아니고 컴파일러의 재량

숫자 리터럴은 값으로 취급되며 주소를 가지지 않기 때문에, 같은 리터럴이라 하더라도 메모리 차원에서 공유되지 않는다.