[C++] 37. 상수화

2022. 6. 27. 21:32코딩 1막 <C++개념편>

728x90

*면접에서 자주 등장하는 상수화*

1. const와 define의 차이

2. constexpr의 정의

// 상수화 //
// 상수는 3, 1, 2,,,같이 '변하지 않는 값'을 말하며, 변수의 반대이다.
// 변수를 상수화하는 것
// 값을 계속 바꿀 수 있는 변수와는 달리 변하지 않는 값이기에 처음 선언부터 값을 할당받게 되면서 그 다음부터는 값을 바꿀 수 없다.
// 그렇기 때문에 상수를 선언할때 반드시 선언과 동시에 초기화를 같이 해야한다.
// 상수화는 값을 변경시키지 못하도록 제한하고 싶을때 사용한다.
// 상수화의 방법으로 크게 const로 상수를 만드는 방법과 define을 활용하여 매크로 상수를 만들어 값을 치환시키는 방법이 있다.

// const와 define의 차이(const가 define보다 효율적인 이유) //
// define은 단순히 치환시킨다는 의미이다. 
// 선행처리자가 컴파일 전에 치환시켰기때문에 치환과정에서 한번의 연산이 들어가야해서 연산상의 불이익이 있다. 코드가 치환되기때문에 별도의 메모리를 먹지 않음.
// 또 컴파일러가 쓰는 기호테이블에 들어가지않아 에러 발생시 원인을 찾는 어려움이 있다.
// const는 변수를 상수화를 하면 컴파일 과정에서 이 변수를 상수로 인식한다. 즉 메모리가 할당 된다.
// 컴파일러가 사용하는 기호테이블 안에도 들어간다.
// 또한 const를 사용하면 컴파일 과정에서 상수 하나를 계속 돌려쓰지만
// define을 사용하면 define으로 정의된 값을 치환하는 과정에서 사용한 상수만큼 복사본이 생겨나므로 효율적이지 않다.
// define은 전처리기이므로 main함수 밖에 써야한다.
// **constexpr 컴파일시점에만 상수화, 초기화를 시켜준다
	// **런타임(실행 후)때는 constexpr을 적용할 수 없다.
	// int input;
	// cin >> input;
	// constexpr int count = input;	오류발생(런타임적용X)
#include <iostream>

using namespace std;

// 상수화 //
// 변수 : 변할 수 있는 수
// 상수 : 변하지 않는 수
 
// 변수를 상수화 하는 키워드 
// const - 런타임 시점에서 초기화(상수화) 가능
// constexpr - 컴파일 시점에서만 초기화(상수화) 가능
// 장점 : 데이터타입에 대한 정보를 제공하기때문에 가독성이 좋아서 현재 많이 기용됨
// 단점 : 데이터타입이 있는 변수이기때문에 메모리 할당을 함.


// define 전처리기
// 장점 : 메모리 할당을 안함.
// 단점 : 데이터타입에 대한 정보를 모름. 이게 float인지 char인지 int인지...

#define PI 3.1415f
constexpr float pi = 3.1415f;

void main()
{
	cout << "define 전처리기를 사용한 상수화 : " << PI << endl;
	cout << "constexpr을 사용한 상수화 : " << pi << endl;

	int input;
	cin >> input;

	const int maxCount = input;			//런타임시점에서의 초기화 가능
	constexpr int maxCountExpr = input;	//런타임시점에서의 초기화 불가능
	
	
	maxCount = 30; // 컴파일 시점에서 변경 불가
}

 

728x90