[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
'코딩 1막 <C++개념편>' 카테고리의 다른 글
[C++] 38. namespace (0) | 2022.06.27 |
---|---|
[C++] 36. 자료구조 : 링크드리스트(LinkedList) (0) | 2022.06.27 |
[C++] 35. 자료구조 : 큐와 스택(Queue & Stack) (0) | 2022.06.23 |
[C++] 34. 게터와 세터 (0) | 2022.06.22 |
[C++] 33. 클래스 (0) | 2022.06.22 |