..

Search

8) 상수

8) 상수

상수


상수(constant)

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

하지만 상수가 변수와 다른 점은 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없다는 점입니다.


표현 방식에 따른 상수

C++에서 상수는 표현 방식에 따라 다음과 같이 나눌 수 있습니다.

 

1. 리터럴 상수(literal constant)

2. 심볼릭 상수(symbolic constant)


리터럴 상수(literal constant)

리터럴 상수(literal constant)는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않습니다.

C++에서는 적절한 메모리 공간을 할당받기 위하여, 기본적으로 변수든 상수든 타입을 가지고 있습니다.

 

C++에서 상수는 타입에 따라 정수형 리터럴 상수, 실수형 리터럴 상수, 문자형 리터럴 상수 등으로 구분할 수 있습니다.

 

1. 정수형 리터럴 상수는 123, -456과 같이 아라비아 숫자와 부호로 직접 표현됩니다.

2. 실수형 리터럴 상수는 3.14, -45.6과 같이 소수 부분을 가지는 아라비아 숫자로 표현됩니다.3. 문자형 리터럴 상수는 'a', 'Z'와 같이 따옴표('')로 감싸진 문자로 표현됩니다.


정수형 리터럴 상수

정수형 리터럴 상수는 123, -456과 같이 아라비아 숫자와 부호로 직접 표현됩니다.

C++에서는 정수형 상수를 10진수뿐만 아니라 8진수(0으로 시작)나 16진수(0x로 시작)로도 표현할 수 있습니다.

 

이렇게 여러 가지 진법으로 표현된 정수형 상수의 출력을 위해 cout 객체는 dec, hex, oct 조정자를 제공하고 있습니다.

이 세 가지 조정자를 cout 객체에 전달하면 사용자가 다시 변경하기 전까지 출력되는 진법의 형태를 계속 유지할 수 있습니다.

 

다음 예제는 숫자 10을 각각 10진수, 8진수, 16진수의 형태로 출력하는 예제입니다.

예제

int a = 10;

 

cout << "숫자 10을 10진수로 표현하면 " << a << "이며, " << endl;

cout << oct;

cout << "숫자 10을 8진수로 표현하면 " << a << "이며, " << endl;

cout << hex;

cout << "숫자 10을 16진수로 표현하면 " << a << " 입니다.";

코딩연습 ▶

실행 결과

숫자 10을 10진수로 표현하면 10이며, 

숫자 10을  8진수로 표현하면 12이며, 

숫자 10을 16진수로 표현하면 a 입니다.


정수형 리터럴 상수의 타입

C++에서 정수형 리터럴 상수는 다음과 같은 경우를 제외하면 모두 int형으로 저장됩니다.

 

1. 데이터의 값이 너무 커서 int형으로 저장할 수 없는 경우

2. 정수형 상수에 접미사를 사용하여, 해당 상수의 타입을 직접 명시하는 경우

 

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

 

다음 표는 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++11부터 제공)

실수형 리터럴 상수의 타입

C++에서 실수형 리터럴 상수는 모두 부동 소수점 방식으로 저장됩니다.

이러한 실수형 리터럴 상수는 모두 double형으로 저장되며, 접미사를 추가하여 저장되는 타입을 직접 명시할 수도 있습니다.

 

다음 표는 C++에서 접미사를 추가하여 나타낼 수 있는 실수형 타입을 나타냅니다.

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

포인터 리터럴 상수

널 포인터(null pointer)란 아무것도 가리키고 있지 않은 포인터를 의미합니다.

지금까지 C++에서는 널 포인터를 표현하기 위해서 포인터를 0으로 초기화해 왔습니다.

하지만 C++11부터는 nullptr 키워드를 제공함으로써 0으로 초기화된 널 포인터보다 더욱 제대로 널 포인터를 표현할 수 있게 되었습니다.

 

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

아직도 C++에서는 0을 사용해 널 포인터를 명시할 수 있으며, 따라서 nullptr == 0은 참(true)을 반환합니다.

하지만 nullptr 리터럴 상수를 사용하는 것이 좀 더 안전한 프로그램을 만들 수 있습니다.


이진 리터럴 상수

C++14부터는 0B 또는 0b의 접두사와 0과 1의 시퀀스를 가지고 이진 리터럴 상수를 표현할 수 있습니다.

예제

auto a = 0B010111;


심볼릭 상수(symbolic constant)

심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수입니다.

심볼릭 상수는 선언과 동시에 반드시 초기화해야 합니다.

이러한 심볼릭 상수는 매크로를 이용하거나, const 키워드를 사용하여 선언할 수 있습니다.

하지만 매크로를 이용한 선언은 C언어의 문법이므로, C++에서는 가급적 const 키워드를 사용하여 선언하도록 합니다.

 

C++에서 심볼릭 상수를 만드는 일반적인 방식은 다음과 같습니다.

예제

const int ages = 30;

 

위의 예제처럼 const 키워드를 사용한 상수는 선언과 함께 반드시 초기화해야 합니다.

 

매크로를 이용한 선언보다 const 키워드를 사용한 심볼릭 상수의 장점은 다음과 같습니다.

 

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

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

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


연습문제