본문 바로가기
c언어

c언어 상수 알아보기(#define, const)

by 개발자 L 2022. 11. 27.
반응형

c언어 상수 알아보기(#define, const)

네 안녕하세요, 이번 포스팅에서는 c언어에서 쓰는 요소 중 하나인 상수에 대하여 한 번 적어보려고 합니다.

상수는 변수와는 다르게 변하지 않는 값이라는 특징이 있습니다.

그리고 상수는 큰 틀에서 2가지로 나뉘는데요, 첫째는 정수 상수, 둘째는 기호 상수입니다.

각각은 숫자로 표현되느냐, 상수화 시키는 문구를 이용하여 상수로 만드느냐에 따라서 이름이 달라집니다.

그럼 지금부터 그러한 상수를 어떤 식으로 만드는지 한 번 같이 알아볼까요?

 

1. 정수 상수

정수 상수는 말 그대로 숫자로 이루어져 있는 상수를 이야기해요.

보통 int형으로 간주를 하기 때문에 숫자로 이루어져 있는 상수를 정수 상수라고 부르게 되었습니다.

그리고 수의 크기는 int형의 범위를 넘어가는 숫자를 적게 되면 자동으로 long형으로 변형을 시키게 되고,

그 마저도 되지 않는다면 unsigned long형으로 변환을 시킵니다.

그러한 이유는 상수를 컴파일러가 처리를 할 때 환산 가능한 변수 자료형 중에서 가장 작은 값으로 취급을 하는 성질이 있기 때문에 그렇습니다.

그리고 정수 상수는 단순히 10진수 형태의 정수로만 표현이 가능한 것이 아니라 8진수나 16진수 등으로도 표현이 가능합니다.

8진수는 0에서 7까지의 수로 수를 표기하고, 8의 배수가 될 때마다 단위가 바뀝니다.

예를 들어서 8이 되면 10, 16이 되면 20 이런 식으로 바뀝니다.

그리고 16진수는 0에서 9까지의 숫자, 그리고 A에서 F까지의 문자를 사용하여 나타냅니다.

그 이유는 아라비아 숫자는 0에서 9까지의 수를 조합을 하여 만드는데, 16진수는 16의 배수가 될 때 마다 자릿수가 바뀌기 때문에 9 이후에 추가적인 무언가가 필요했었습니다.

그런데 그걸 10, 11 이렇게 표현을 하자니 10진수와 겹치기 때문에 사용이 불가했었지요.

그래서 결국에는 알파벳을 쓰기로 하고, 10은 A, 11은 B, 12는 C, 13은 D, 14는 E, 15는 F로 쓰게 되었습니다.

그리고 우리가 표현을 할 때는 대문자를 써야 하지만, c언어에서는 16진수의 대소문자를 크게 구별을 하지 않습니다.

그래서 0xa라는 16진수가 있다면, 0xA로도 표현이 가능하다는 뜻입니다.

또한, 8진수를 표현하고 싶다면 표현하고자 하는 수 앞에 0을 붙이면 되고, 16진수로 표현을 하고 싶다고 한다면 0x를 붙이면 됩니다.

그럼 간단한 예제 코드를 통하여 같이 알아볼까요?

#include <stdio.h>

int main()
  
{
  int x = 10; // 10진수
  int y = 010; // 8진수
  int z = 0x10; // 16진수

  printf("x = %d\n", x); 
  printf("y = %d\n", y); 
  printf("z = %d\n", z); 

  return 0;
}

이렇게 표현이 가능합니다.

그래서 결과를 보게 되면 이런 식으로 나오게 됩니다.

x = 10
y = 8
z = 16

이렇게 다시 10진수로 변환을 해서 나타내게 됩니다.

프로그래밍 언어에서의 숫자 10은 단위가 바뀐다는 것을 의미하기 때문에

10진수에서의 10은 10의 배수마다 단위가 바뀐다는 뜻이고,

8진수에서의 10은 8의 배수마다 단위가 바뀐다는 뜻이고,

16진수에서의 10은 16의 배수마다 단위가 바뀐다는 것을 의미합니다.

그리고 프로그래밍 언어 내에서 쓰이는 8진수와 16진수를 10진수로 변환을 시키지 않고 그대로 사용하고 싶으신 분들도 계시리라 생각이 듭니다.

그리고 표기의 형태까지 출력을 하고 싶으신 분들도 있으실 것 같더군요.

그래서 그걸 그대로 쓰는 방법도 알려드리려고 합니다.

8진수는 출력을 할 때 형식 지정자를 %o로 하면 되고, 16진수는 출력 시에 형식 지정자를 %x로 하시면 됩니다.

그리고 그 표기 형식까지 그대로 뽑아내고 싶으시다면 8진수의 경우는 출력 시에 형식 지정자를 %#o로 입력하시면 되고, 16진수의 경우는 출력 시에 형식 지정자를 %#x로 지정을 하시면 됩니다.

그럼 위에서 쓴 예제를 조금 변형을 해서 한 번 써보도록 하겠습니다.

같이 보실까요?

먼저 8진수와 16진수상 표기를 출력을 하고 싶을 때 쓰는 방법입니다.

#include <stdio.h>

int main()
  
{
  int x = 10;
  int y = 010;
  int z = 0x10;

  printf("x = %d\n", x);
  printf("y = %o\n", y);
  printf("z = %x\n", z);

  return 0;
}

 이렇게 %o, %x로 쓰셨을 때의 결과는 각각 8진수, 그리고 16진수 상의 표기로 출력이 그대로 된다고 그랬었죠?

그래서 결과 화면도 준비를 했습니다.

x = 10
y = 10
z = 10

여기에 기재한 숫자는 전부 다 10을 나타내는 숫자들입니다.

그래서 10진수에서의 10, 그리고 8진수에서의 10, 그리고 16진수에서의 10을 각각 출력을 하게 된 겁니다.

그리고 int형 변수 상에서의 표기를 그대로 출력을 하는 방법에 대한 예제 코드도 한 번 적어보겠습니다.

#include <stdio.h>

int main()
  
{
  int x = 10;
  int y = 010;
  int z = 0x10;

  printf("x = %d\n", x);
  printf("y = %#o\n", y);
  printf("z = %#x\n", z);

  return 0;
}

이런 식으로 입력이 가능합니다.

형식 지정자 중간에 #을 붙이게 되면 형태를 변형하지 않겠다는 뜻입니다.

그래서 이렇게 쓰게 되면 처음에 입력한 문자가 그대로 출력이 됩니다.

그럼 결과 화면은 어떻게 나왔나 같이 보시죠.

x = 10
y = 010
z = 0x10

이렇게 나왔습니다.

입력한 그대로 바로 나왔죠?

이런 식으로도 사용이 가능하다는 것을 보여드리고 싶었습니다.

반응형

 

2. 기호 상수

기호 상수는 상수에 이름을 붙일 때 사용하는 방법입니다.

보통의 상수는 이름이 없고, 값만 존재합니다.

그런데 그 값을 우리가 어떤 변수로써 써야만 할 때가 생기는데,

그럴 때 이용하는 것이 바로 기호 상수입니다.

기호 상수를 사용하는 방법은 크게 두 가지가 있습니다.

  • #define 문장 선언하기
  • const 키워드 사용하기

이 두 가지를 이용하여 이름을 붙입니다.

#define을 사용을 하면 #define 뒤에 이름을 하나 붙이고, 그에 해당하는 값을 이름 뒤에 적습니다.

그리고 이건 전처리기 문장이기 때문에 절대로 세미콜론(;)을 붙이면 안 됩니다.

세미콜론을 붙이게 되면 #define 문장을 인식하지 못하게 됩니다.

그리고 const를 붙여서 사용하는 방법은 자료형 앞에 const를 붙이면 됩니다.

그렇게 되면 변수가 상수가 되어 값이 고정이 됩니다.

이렇게 변수의 값을 고정시켜서 마치 상수처럼 변하지 않게 하는 것을 변수의 상수화라고 부릅니다.

그리고 이 두 가지 중에서 const를 좀 더 많이 쓰는 편입니다.

그 이유는 자료형을 지정할 수 있기 때문에 형식 지정에 있어서 좀 더 자유로워서 그로 인해 생기는 장점이 많기 때문입니다.

그럼 간단한 예제 코드를 통해서 함께 보실까요?

#include <stdio.h>
#define TAX_RATE 0.2 // 상수 선언

int main()
  
{
  const int MONTHS = 12; // 변수의 상수화
  int m_salary, y_salary;

  printf("월급을 입력하시오 : ");
  scanf("%d", &m_salary);

  y_salary = MONTHS * m_salary;
  printf("연봉은 %d 입니다.\n", y_salary);
  printf("세금은 %f 입니다.\n", y_salary * TAX_RATE); // 값을 받는 자리에서도 연산 가능

  return 0;
}

이렇게 #define을 이용하여 전처리기에서 선언을 하여 고정을 하거나, 중간에 const를 써서 변수를 상수화 시켜서 쓸 수 있습니다.

그리고 여기에서 조금 신기한 것이 보일 텐데, 출력을 할 때 우리가 받는 값을 입력하는 자리에서도 연산을 할 수 있습니다.

그래서 제일 마지막에 보시면 연봉에 대한 세금을 계산할 때 연봉과 세율을 곱한 값을 출력하기 위해서 값을 받는 자리에 그냥 곱셈식을 쓴 것이 보이실 겁니다.

굳이 변수를 선언하지 않고도 이런 식으로도 표현이 가능합니다.

그럼 결과 화면을 같이 보실까요?

월급을 입력하시오 : 1000
연봉은 12000입니다.
세금은 2400.000000입니다.

그리고 여기에서 세율은 실수이기 때문에 %f로 받았습니다.

그리고 %f만 쓰게 된다면 저런 식으로 0이 많이 붙어서 수가 더러워집니다.

그래서 이걸 해결하고 싶다면 %f 대신에 %.nf를 쓰시면 됩니다.

n자리에 본인이 끊고 싶은 소수점 자리를 입력을 하시면 됩니다.

예를 들어서 소수점 아래 2번째까지 표현하고 싶다면 형식 지정자에 %.2f로 쓰시면 됩니다.

그리고 이렇게 상수를 선언하여 쓰는 이유는 일단 상수는 값이 변하지 않기 때문에 값이 조작이 된다던지 하는 그런 보안상의 문제에서도 안전할 수 있고,

이렇게 숫자 대신에 변수를 쓰면 가독성이 매우 좋아져서 코드가 간결해집니다.

 

여기까지 c언어 상수에 대하여 알아봤는데요,

다음 포스팅에서는 c언어에서 정수를 표현하는 방법에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사합니다 ~

반응형

댓글