프로그래밍/C++

#19. const, define

코딩하는상후니 2022. 7. 17. 22:01

 

*const

 
=> 상수화  : 어떤 값을 수정할 수 없는 데이터로 만든다.
=> '읽기' 만 가능한 데이터.
ex) "Hello world", const int t = 1;
=> 해당 내용을 수정하려하면 컴파일러가 오류 보고.
const int AIR = 0;
const int STUN = 1;
const int POLYMORPH = 2;
const int INVINCIBLE = 3;
=> const 지정 시, 반드시 초기화 해주어야 함.
 

 

*#define

 

#define Test 1
 
=>   '전처리기'
=> 선언된 문자를 지정한 문자로 대체한다는 개념.
 
 

 

*const 변수는 무조건 메모리 할당되어지는가 ??

 
 
=> const 가 전역으로 정의되어지면 #define 과 같이 대체되는 개념으로
&B 주소는 존재하지 않음.
 
=> 하지만,
 
const int* pConst = &B;
 
B 의 주소를 쓰게 되면 B 의 주소는 생김.
 
 
=> 또한, main 함수 내부에 지역변수로 const int C 가 정의되어지는 경우,
&C 주소는 존재하는걸 볼 수 있음. ( 스택에 존재 ),  ( &D 와 비슷한 주소 )
 
 
즉,
const 상수 변수는 컴파일러 최적화에 의해 메모리 할당되지 않지만,
해당 변수의 주소를 사용하면 메모리를 할당함.
 
 

 

*클래스 내부에선 const 가 어떻게 동작할까 ??

 
 
 
const int weapon = 15;
const int arrow = 10;
=> 클래스 내부에 const 상수 정의 시, 메모리 할당.
 
=> 각각 독립적인 변수라는 뜻
 

 

 

* static 을 붙이게 되면 조금 다르게 동작.

 

@여기서 알아야할 점
 
객체가 생성되기 전, 이미 컴파일러는 정적 변수에 대한 메모리를 할당.
왜냐하면 프로세스가 시작할 때 전역변수들이 데이터영역에 생성되기 때문.

 

 
static const int Lv;
static const int Atk = 50;
static int Def;
=> 그림을 통해 위 3가지 변수들의 동작과정을 살펴보자.
 
 
Lv : 클래스 외부에서 초기화.
-> 메모리를 할당받는다.
 
Atk : 클래스 내부에서 초기화.
-> 메모리를 할당받지 않는다.
 
 
Def : 클래스 외부에서 초기화.
-> const 가 붙지 않는 정적변수이므로 데이터영역에 메모리 할당받음.
 
 
 
 
Lv : 초기화하지 않음.
 
 
Atk : 클래스 내부에서 정의, 다른 곳에서 Atk 주소를 쓰고 있음.
이 때, Atk 는 메모리 할당.
const int* test = &(Player::Atk);
 
 
 
 
Def : 초기화하지 않음.
 
=> 사용되지 않는 정적변수들은 아예 메모리 할당조차 받지 않음.
 
 

 

 

 

*정리

 
*분명 Lv, Atk 모두 같은 static const 인데,
초기화 위치에 따라서 메모리 할당 유무가 달라지는 이유는 뭘까??
컴파일러가 똑똑하기 때문.
 
 
클래스 내부에 선언 후 클래스 밖에서 정의 시,
컴파일러는 정적변수로 판단해 메모리 할당.
 
 
클래스 내부에서 선언, 정의 동시에 했고 해당 변수의 주소를 쓸 일이 없다면,
컴파일러는 메모리 할당하지 않고 해당 변수를 값으로 대체.
 
 

 

*결론

 
 
const 선언된 변수의 주소가 사용되어지거나 ( & )
사용할 수 있는 영역에 정의되어질 때( 클래스내부, 스택영역 .. )
 
메모리가 할당된다.
 
즉,
컴파일러는 const 상수 변수를 스스로 판단해
해당 변수가 값으로만 사용되면 값으로 대체하고
해당 변수의 주소가 사용되면 메모리를 할당한다.
( 컴파일러 최적화 )
 
 

 

 

*const  /  define  차이점

 
 
1. #define 은 상수 선언 외에 좀 더 넓은 개념을 가질 수 있음.
( 함수 정의... 등 )
 
2. const 는 컴파일러를 거침, #define 은 전처리기 단계.
그래서 const 는 컴파일러 최적화 영향을 받음.
 
3. const 는 변수 타입 지정 가능.
 
4. const 는 클래스 내에서 멤버 변수로 캡슐화 가능.
 
 
 
 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

 

'프로그래밍 > C++' 카테고리의 다른 글

#21. 분기문  (0) 2022.07.17
#20. 유의사항  (0) 2022.07.17
#19. static 정적변수  (0) 2022.07.17
#18. 비트 연산과 비트 플래그  (0) 2022.07.16
#17. 비교 연산과 논리 연산  (0) 2022.07.16