C++/C++ 기초

[C++] 리터럴 상수와 심볼릭 상수 ( literal constant and symbolic constant )

Song 컴퓨터공학 2023. 5. 4. 11:44
더보기

상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미합니다. 상수와 변수가 다른 점은 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없다는 점이죠. C++ 에서는 표현 방식에 따라 두가지로 상수를 분류합니다.

 

  1. 리터럴 상수 (literal constant)
    1. 정수형
    2. 실수형
    3. 포인터
    4. 이진
  2. 심볼릭 상수 (symbolic constant)

오늘은 리터럴 상수와 심볼릭 상수가 무엇인지, C++ 에서는 이를 어떻게 사용하는지에 대해 알아보겠습니다.


리터럴 상수(literal constant)

 

리터럴 상수는 변수와 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않습니다. 아래 예시를 보면 그 의미를 좀 더 명확히 이해할 수 있습니다.  C++ 은 적절한 메모리 공간을 할당받기 위해 변수든 상수든 타입을 가집니다.

 

상수는 타입에 따라 정수형 리터럴 상수, 실수형 리터럴 상수, 문자형 리터럴 상수 등으로 구분합니다.

 

정수형 리터럴 상수는 말 그대로 정수, 숫자와 부호로 표시되는 int 형을 말합니다. 실수형은 소수 부분을 가지는 숫자로 표현이 되고 문자형 리터럴 상수는 'S', 'o' 와 같이 작은 따옴표(' ') 로 감싸진 문자로 표현됩니다.

 

 

정수형 리터럴 상수

정수형 리터럴 상수는 15, -26 같이 숫자와 부호로 표현됩니다. 정수형 상수는 10진수 뿐 아니라 8진수나 16진수로도 표현할 수 있습니다. 8진수는 0으로 시작하고, 16진수는 0x 로 시작하는 C와 동일한 표현방식을 가집니다.

 

C와 다른 점으로, 이 3 개의 조정자를 cout 객체에 전달하면 사용자가 다시 변경하기 전까지 출력되는 진법의 형태를 유지할 수 있습니다. 숫자 15를 각각 10진수, 8진수, 16진수로 출력하는 코드를 보겠습니다.

 

#include <iostream>
using namespace std; // std라는 name space에 속한 정의들은 이름 안붙이고 사용 가능

int main()
{
	int num = 15;

	cout << "숫자 10을 10진수로 표현 : " << num << endl;
	cout << oct;
	cout << "숫자 10을 8진수로 표현 : " << num << endl;
	cout << hex;
	cout << "숫자 10을 16진수로 표현 : " << num << endl;
	return 0;
}

 

 

C++ 에서 정수형 리터럴 상수는 기본적으로 int 형으로 저장됩니다. int 형으로 저장되지 않는 예외 케이스가 2개 있습니다.

 

  1. 데이터의 값이 int 로 표현할 수 없는 범위인 경우 ( 데이터가 너무 커서 int 형으로 저장할 수 없는 경우 )
  2. 정수형 상수에 접미사를 사용하여 해당 상수의 타입을 직접 명시하는 경우

 

C++ 에서는 접미사를 상수의 끝에 추가하여 해당 상수의 타입을 직접 명시할 수 있습니다.

 

접미사 타입
기본 설정 (signed) int형
u 또는 U unsigned int형
l 또는 L (signed) long형
ul 또는 uL 또는 Ul 또는 UL unsigned long형
long long 또는 u11 또는 U11 또는 uLL 또는 ULL unsigned long long형

접미사를 사용하여 데이터 타입을 정해 주는 것은 C 언어에서의 명시적 형 변환과 비슷합니다.

 

각 타입의 자세한 정의는 C 언어와 동일하기 때문에 이전 포스팅을 링크하도록 하겠습니다.

 

https://blog.naver.com/songsite123/222790281051

 

자료형

컴퓨터가 메모리를 사용할 때 몇 바이트의 메모리를 사용할 것인지를 명시해야 하는데 이를 데이터 타입(D...

blog.naver.com

https://blog.naver.com/songsite123/222800065316

 

상수와 변수

상수(Constant)는 프로그램을 실행할 때 한번 값이 결정되면 프로그램이 끝날 때까지 다른 값으로 바뀌지 ...

blog.naver.com


실수형 리터럴 상수

C++ 에서 실수형 리터럴 상수는 모두 부동 소수점 방식으로 저장됩니다. 이런 실수형 리터럴 상수는 모두 double 형으로 저장되며, 이 또한 접미사를 추가하여 저장되는 타입을 직접 명시할 수 있습니다.

 

C++ 에서 접미사를 추가하여 나타낼 수 있는 실수형 타입은 다음과 같습니다.

접미사 타입
f 또는 F float형
기본 설정 double형
l 또는 L long double 형

 


포인터 리터럴 상수

널 포인터(null pointer) 란 아무것도 가리키고 있지 않는 포인터를 의미합니다. 기본적으로 널 포인터를 표현하기 위해서 포인터를 0으로 초기화 하는 방식을 일반적으로 사용했는데요, C++11 부터는 nullptr 키워드를 제공해주기 때문에 더욱 제대로 널 포인터를 표현할 수 있게 되었습니다.

 

nullptr 키워드를 사용한 리터럴 상수의 타입은 포인터 타입이며, 정수형으로 변환 불가합니다.


이진 리터럴 상수

0B 또는 0b 의 접두사와 0과 1의 시퀸스로 이진 리터럴 상수를 표현할 수 있습니다. 많이 쓸 일은 없을 것 같지만.. 그래도 알고는 있어야겠죠? 의외로 8051 같은 마이크로프로세서를 프로그래밍할 때는 이진수를 쓰는 것이 직관적인 경우가 많습니다.

auto a = 0B010111;

auto 키워드에 대해서도 간단히 알아보겠습니다. auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시합니다. 즉 auto 키워드를 사용하면 초깃값의 형식에 맞춰 선언하는 인스턴스(변수)의 형식이 '자동'으로 결정됩니다. 이것을 타입 추론(type inference) 라고 합니다.

 

이 기능은 생성 시 변수를 초기화 할 때만 작동합니다. 초기화 값을 사용하지 않고 생성된 변수는 이 기능을 사용할 수 없고, 사실 auto 를 많이 사용하면 코드의 가독성이 떨어지고 원하는대로 동작하지 않을 우려가 있기 때문에 많이 쓰지 않는 것이 좋습니다.


심볼릭 상수(symbolic constant)

심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수입니다. 심볼릭 상수는 선언과 동시에 반드시 초기화 해야 합니다. 이러한 심볼릭 상수는 매크로를 사용하거나, const 키워드를 사용하여 선언할 수 있습니다.

const int ages = 24;

const 키워드를 사용한 심볼릭 상수의 장점은 다음과 같습니다.

 

1. 상수의 타입을 명시적으로 지정할 수 있다.

2. 구조체 같은 복잡한 사용자 정의 타입에도 사용할 수 있다.

3. 해당 심볼릭 상수를 특정 함수나 파일에서만 사용하도록 제한할 수 있다.

 

더 자세한 내용은 이전 C 문법 포스팅을 공유하며 마치도록 하겠습니다. 감사합니다.

https://blog.naver.com/songsite123/222858311358

 

지역 변수와 전역 변수

C 언어는 대부분의 변수를 함수 안에 선언해서 사용합니다. 이것은 함수가 작업의 기본 단위이기 때문이죠...

blog.naver.com