프로그램에서는 변하지 않는 값이 있습니다.
바로 상수입니다. 마치 끄떡없는 돌기둥처럼 우리가 아무리 바꾸고자 해도 에러를 출력하며 변경을 거부합니다. 오늘은 절대로 변하지 않는 상수에 관하여 공부하는 포스팅이 되겠습니다.
목차
상수가 뭘까요?
상수는 위에서 말했다시피, 변하지 않는 값입니다.
정확히 이야기하자면 다음과 같습니다.
상수는 고정된 값을 가지는 메모리 공간을 의미한다.
변수와 마찬가지로 메모리 공간입니다만, 변수는 값의 변경이 가능한 공간이지만 상수는 변경이 불가능한 고정된 공간이라는 특징이 있습니다.
결과적으로 상수도 값을 저장하는 공간에 속하지만, 그 값의 변경이 절대 불가능하기 때문에 이를 프로그램에서 수정하는 것이 불가능합니다.
상수에는 리터럴 상수와 심볼릭 상수가 있습니다.
리터럴 상수
우리가 지금까지 '값'이라고 불러왔던 것들이 리터럴 상수에 해당합니다.
변수의 타입처럼 상수에도 타입이 존재합니다.
각각은 다음과 같습니다.
상수 | 의미 | 예시 |
정수형 상수 | 정수 | 12 |
실수형 상수 | 실수 | 12.34 |
문자형 상수 | 문자(1개) | 'A' |
포인터형 상수 | 포인터 | nullptr(C++ 11부터), "너는 못생겼다" |
맨 아래의 포인터형 상수는 무시해주세요. 나중에 [포인터] 개념을 다룰 때 더 설명하도록 하겠습니다.
이렇게 값 자체를 우리들은 리터럴 상수라고 부릅니다.
변수와는 다르게 이름이 없는 것이 특징이고, 값 자체가 메모리에 저장되어 있어 그 메모리 공간을 리터럴 상수 그 자체라고 부릅니다.
이 메모리 공간은 수정할 수 없도록 되어있어 상수의 특징을 가지게 됩니다.
프로그램이 시작될 때, 프로그램에 작성된 상수들은 메모리 공간에 쓰이고, 우리가 프로그램 도중 이를 참조하는 방식으로 이용하게 됩니다.
심볼릭 상수
위에서는 이름이 없는 상수, 리터럴 상수에 대하여 알아보았습니다.
이번에는 심볼릭 상수에 대하여 알아보겠습니다.
심볼릭 상수는 이름이 없는 리터럴 상수와는 다르게 이름이 존재하는 상수입니다.
변수와 비슷한 특징을 가지고 있으나, 변수와는 다르게 수정할 수 없어 상수가 됩니다.
심볼릭 상수는 이름을 가지고 있고, 이름과는 별개로 값이 존재하기 때문에 리터럴 상수보다 그 값이 쓰이는 의미를 파악하기 쉬운 장점을 가지고 있습니다.
심볼릭 상수의 선언에는 2가지 방법이 있습니다.
1. 전처리기(define)를 이용한 매크로
2. const 키워드를 이용한 선언
각각은 두 방법으로 선언한 예시입니다.
#include <stdio.h>
#define A 100
int main() {
const int B = 10;
A = 1; // Error!
B = 100; // Error!
printf("매크로 상수 : %d, const 키워드 상수 : %d", A, B);
}
#define (상수의 이름) (상수의 값)
const (상수의 타입) (상수의 이름) = (상수의 값);
#define의 경우 컴파일 과정에서 상수의 이름을 가지는 모든 부분을 상수의 값으로 치환하는 방식으로 상수를 적용합니다. 컴파일된 코드에서는 A가 존재하지 않고 그 자리에 100이 치환되는 방식입니다.
전처리기를 이용한 매크로 방법을 자주 쓰기도 하지만, 요즘에는 const 키워드를 이용한 방법이 자주 쓰이더군요.
생각해보니 const 키워드로 인한 장점이 꽤 많은 것 같습니다.
장점을 나열하자면,
1. 매크로로 인한 원하지 않는 결과 초래 최소화
2. 상수의 타입 명시
3. 변수처럼 유효 범위의 지정 가능
등이 있는 것 같습니다.
그래서 상수를 왜 쓰는데?
상수는 변하지 않습니다. 상수를 쓰는 이유는 당연히 변하지 않는 값을 원할 때 쓰는 것입니다.
프로그램에서 아주 중요한 값이 있다고 가정합시다. 이 요소가 변수가 되면, 원치 않는 접근으로 인해 값의 변경이 일어날 수 있습니다. 그러나, 이 요소가 상수가 되면 변하지 않는 불변의 값으로 작용하므로 원치 않는 접근으로 인한 값의 변경이 일어나지 않습니다.
프로그래밍은 이런 사소한 실수로 인해서 모든 것이 뒤틀릴 수 있습니다.
특히, 코드가 길어지고 커질수록 사소한 실수로 인한 버그를 디버깅하기 위해 주말 전체를 날려 먹은 적도 있었습니다.
프로그래머들의 관습은 이러한 사태를 최소화하기 위해 존재합니다. 이번 상수도 마찬가지이고요.
마무리
이번에는 상수에 대하여 간략하게 알아보았습니다.
사실 상수 개념이 그리 어려운 개념은 아닌데, 도중의 표에 포인터형 상수가 있어서 전체적으로 갑자기 확 어려워진 느낌이 드네요.
역시 C, C++ 언어의 어려움의 주범인 포인터답습니다.
다음 포스팅은 뭐가 될지 잘 모르겠네요.
아마 손에 잡히는 것을 하려고 하지 않을까 싶긴 한데,
일단 다음에 뵙시다!
'IT > C and C++' 카테고리의 다른 글
[C]변수의 집합! 배열에 대해 알아보자 (0) | 2023.01.03 |
---|---|
[C] scanf 함수를 알아보자! (0) | 2023.01.02 |
[C] 전역변수와 지역변수란? (0) | 2022.12.30 |
[C] 함수란 무엇이고, 어떻게 사용하나요? (2/2) (0) | 2022.12.30 |
[C] 함수란 무엇이고, 어떻게 사용하나요? (1/2) (0) | 2022.12.30 |
댓글