[C++] 상수 _ 리터럴 상수 (literal Constants ) & 심볼릭 상수 (Symbolic Constants)

반응형
반응형

*개인적인 공부 기록용으로 작성한 글 이기에, 잘못된 내용을 포함하고 있을 수 있습니다.


#1 리터럴상수 (literal Constants)

- 8진수 : 0

- 16진수 : 0x

- 2진수 : 0b

#2 심볼릭상수 (Symbolic Constants)

- magic number

- constexpr


상수(Constants)란, 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다.

하지만 변수와 달리 상수는 런타임중 값을 변경할 수 없다. 또한 C++ 에서의 상수는 표현 방식에 따라서 1.리터럴 상수(literal Constants0와 2.심볼릭 상수(Symbolic Constants)로 구분된다. 

#1 리터럴상수 (literal Constants)

8진수 : 0

int main() {
  int x = 012;
  cout << x << endl;
}

[출력] 10

숫자 앞에 "0"을 붙이면 메모리 공간에 8진수 형태로 저장된다.

 

16진수 : 0x

#include <iostream>
using namespace std;

int main() {
  int x = 0x12;
  cout << x << endl;
}

[출력] 18

숫자 앞에 "0x"를 붙이면 메모리 공간에 16진수 형태로 저장된다. 이때 알파벳 "O"가 아닌 숫자"0" 임을 조심하자.

 

2진수 : 0b

#include <iostream>
using namespace std;

int main() {
  int x = 0b01101100;
  cout << x << endl;
}

[출력] 108

숫자 앞에 "0b"를 붙이면 메모리 공간에 2진수 형태로 저장된다. C++14 부터 이진수 가운데 " ' " 를 이용해 가독성을 높여줄 수 있다. 

#include <iostream>
using namespace std;

int main() {
  int x = 0b0110'1100; //중간 ' 는 무시. (C++14부터 허용)
  cout << x << endl;
}

#2 심볼릭상수 (Symbolic Constants)

심볼릭 상수는 변수와 마찬가지로 이름을 갖고 있는 상수로, 선언과 동시에 초기화 해 주어야 한다.

심볼릭 상수의 초기화 방법은 const 키워드를 이용하는 방법과 C-Style의 매크로(#define)을 이용하는 2가지 방법이 있는데, 매크로를 이용한 상수 초기화는 지양하는 것이 좋다.

그 이유는 다음과 같다.

1. 매크로를 이용해 상수를 초기화할 시 상수의 적용 범위(Scope)가 너무 넓어진다.

2. 상수의 타입을 명시적으로 설정해 줄 수 없다.

3. 디버깅이 힘들다.

#define PI 3.14 // x
const int PI = 3.14 // o

 

magic number

아무런 의미를 가지지 않은 불분명한 숫자를 매직 넘버(magic number)라고 한다.

아래 코드를 보면 3.14 라는 숫자만 보고선 3.14가 어떠한 뜻을 가지고 있는지 추측하기 어렵다. 이러한 매직 넘버의 사용은 코드의 가독성을 떨어뜨리기에, 사용을 지양하는 것이 좋다.

int main() {
  int r = 5;
  cout << r * r * 3.14 << endl;
}

이처럼 매직넘버 3.14를 상수 PI로 정의해 주면 코드를 볼 때 이해하기가 훨씬 수월해 진다.

#include <iostream>
using namespace std;

int main() {
  const int PI = 3.14;
  int r = 5;
  cout << r * r * PI << endl;
}

 

constexpr

constexpr 키워드는 컴파일타임에 값이 완전히 정의되는 상수임을 명시하는 키워드이다.

예를들어 아래 코드의 상수 N은 런타임에 값이 결정되는 런타임상수이다. 따라서 constexpr 키워드를 붙여 주면 에러가 발생한다.

  int n;
  cin >> n;
  constexpr const int N(n); //runtime - error

하지만 다음 코드의 상수 N2는 컴파일타임에 값이 결정되는 컴파일타임 상수이다. 그렇기에 constexpr 키워드를 붙여도 에러가 발생하지 않는다.

  constexpr const int N2(100);

반응형

댓글

Designed by JB FACTORY