본문 바로가기

C-programing/C언어 기초

[C언어기초] 변수, 상수, literal상수, symbolic상수.

 

 

변수란 무엇인가? 변수는 C언어의 기본 용어 중의 하나이다. 오늘 포스팅하는 것은, 기초적인 변수 선언 방법을 서술하려는 것이 아니라, 변수의 기본적인 정의와 특성 그리고 반대의 특성을 가지고 있는 상수에 대해 이야기 하려고 한다. 변수는 기초적인 것이므로, 단연 알고 있을 것으로 생각한다. 의외로, 상수에 대해 정확한 정의를 모르는 학생이 있기에 내가 공부했었던 것을 정리하여 올리는 것이다. (이 포스팅을 보다 자세히 알고 싶다면, 댓글로 이름과 이메일을 보내주면 정리한 내용을 워드문서로 보내주겠습니다.)

 

 

>변수의 정의와 변수 선언.

 

- 변수란, 데이터를 임시로 저장할 메모리 공간을 의미한다.

- 변수는 선언과 동시 초기화, 선언 후 초기화 모두 가능한다.

(상수는 const 선언할 때, 선언과 동시에 초기화 해야 한다. 밑에서 다시 언급하겠다.)

- 변수는 프로그램이 종료될 때, 저장된 데이터가 사라진다.

- 변수 선언은 정수형, 실수형, 문자형, 문자열형으로 나누어야 한다.

(int, char, double, char ..[], 문자열형은 고유 함수를 통해 변수에 저장하거나, 상수로 출력하는 방법이 있다. 기본 자료형으로 문자열을 변수에 저장하려는 경우 에러가 발생한다. 배열을 이용하거나, strcpy 함수 등을 써야 한다.)

- 변수 선언 후 출력을 할 경우, 변수 선언하지 않고 scanf로 입력받아 출력을 할 경우. 모두 자료형(int, char---)을 신경써야 한다.

 

tip. 데이터란, 변수에 임시로 저장될 값을 데이터라고 한다. 만약, 변수가 초기화되지 않아 데이터가 저장되지 않는다면, 쓰레기값이 들어간다.

 

 

- 변수선언은 자료형에 신경을 써야한다. 전에 포스팅에서 printf(), scanf()를 설명하면서 언급했던 자료형에 대해 상기해 보면, 자료형에 따른 서식문자(%d, %x, %c, %s...)를 어떤 형식으로 출력하는가에 따라 다를 방식을 띄었던 것을 알 수 있다.

 

 

 

int a= 10;

printf("%d", a);

"4 byte 정수형 변수에 10이라는 데이터를 저장하겠다. 그리고 10진수 정수로 a라는 변수에 저장된 데이터를 출력하겠다"

 

char b= 'a';

printf("%c", b);

"1 byte 문자형 변수에 a라는 데이터를 저장하겠다. 그리고 문자형으로 b에 저장된 데이터를 출력하겠다."

 

double c= 3.1;

printf("%lf", c);

"8 byte 실수형 변수에 3.1이라는 데이터를 저장하겠다. 그리고 실수형으로 c에 저장된 데이터를 출력하겠다."

 

 

- 변수는 초기화하고 나서 재정의가 가능하다. 변수는 말 그대로 임의로 저장된 메모리 공간에 지나지 않으므로, 그 속에 저장되는 데이터 값은 언제든 변환이 가능하다.

 

 

 

 

 

 

>상수의 정의와 특징

 

- 상수는 변환되지 않는 값을 말한다. 초기화가 되면, 다시 재정의가 불가능하다.

- 상수는 변환되지 않는 값 (파이, 3.14~)을 정의하여 반복적으로 사용하기 위해 쓰인다.

- 상수에 두가지가 있다. literal 상수와 symbolic 상수가 있다.

- 상수도 자료형에 신경을 써야 한다.

 

상수는 변환되지 않는 값이다. 즉, 초기화가 되면 재정의가 불가능하다는 말이다.

 

 

- literal 상수는 글자 그대로 의미가 있어서, 이름이 따로 정의되지 않은 상수를 말한다. 특징은, literal 상수는 printf()함수에 출력되는 값으로 (밑의 사진을 보아라), 위의 함수에서 수식문자(%d ~)에 따라 출력 값이 달라진다는 것이다. 또한, literal 상수의 정수형 값의 진수를 자체적으로 변환이 가능하다 (0x27 -16진수, 027 -8진수)

 

 

 

 

 

printf("%d", 27);

"literal 상수 10진수 27을 10진수 27로 출력하겠다."

 

printf("%x", 0x27);

"literal 상수 16진수 27을 16진수 27로 출력하겠다." (10진수로는, 39이다.)

 

printf("%o", 027);

"literal 상수 8진수 27을 8진수 27로 출력하겠다." (10진수로는, 23이다.)

 

tip. literal 상수 앞에 0x, 0이 붙어 있을 때, 각 각 16진수 8진수로 상수 값이 정의 된다.

 

 

- symbolic 상수는, 상수를 기호화하여 변수처럼 이름을 지어쓰는 상수를 말한다. 특징은, 매크로 상수와 const 키가 사용된다는 점이다. 매크로 상수는 전에 포스팅한 전처리기 내용에 포함되므로 생략하고, const 키에 대해 설명하겠다.

 

 

 

const int num=100;

num= 1000;

"정수형 변수 num에 100이라는 상수를 저장하여 이 값을 절대 변환하지 않겠다."

"에러 발생. 값을 변환하지 않겠다고 했는데, 재정의 되었으므로 오류가 생겼다."

 

const int ip;

ip=100;

"오류 발생. 정수형 변수 ip를 초기화하지 않았으므로 에러가 발생했다."

"초기화는 const 상수 선언과 동시에 이루어 져야 한다."

 

tip. 선언과 동시에 초기화 (int a=10;), 선언 후 초기화 (int a; a=10;). const 키는 선언과 동시에 초기화해야 하고, 매크로 상수는 선언과 동시 초기화 또는 선언 후 초기화해도 된다.

 

const와 매크로 상수가 있는 이유는, 파이와 같은 고유 상수의 값을 헷갈리지 않도록 알기 쉬운 이름으로 정의하기 위해서다. 긴 프로젝트를 짜게 되는 경우, 고유 상수를 일일히 코딩하는 것은 비효율적이기 때문에 쉬운 문자로 대체하여 쓰여지는 것이다.

 

이번 포스팅을 통해 알아두어야 할 것은, 변수와 상수의 차이점과 각각 주의할 점이다. 기초적인 것이지만 은근히 헷갈리는 경우가 많다. 선언과 초기화가 동시에 이루어 지는 것과 아닌 것, 그리고 literal 상수에서 진수변환 출력과 수식문자 등. const와 매크로 상수에서 발생하는 오류, 에러 등 이러한 것들을 알아두면, 코딩할 때 이러한 것들로 헷갈려할 일은 없다.