- 변수(Variable)는 컴퓨터가 명령을 처리하는 도중 발생하는 값을 저장하기 위한 공간으로 변할 수 있는 값을 의미한다.
- 변수는 저장하는 값에 따라 정수형, 실수형, 문자형, 포인터형 등으로 구분한다.
- 영문자, 숫자,_(under bar)를 사용할 수 있다.
- 첫 글자는 영문자나 _(under bar)로 시작해야 하며, 숫자는 올 수 없다.
- 글자 수에 제한이 없다.
- 공백이나 *, +, -, / 등의 특수문자를 사용할 수 없다.
- 대소문자를 구분한다.
- 예약어를 변수명으로 사용할 수 없다.
- 변수 선언 시 문장 끝에 반드시 세미콜론(;)을 붙여야 한다.
- 변수 선언 시 변수명에 데이터 타입을 명시하는 것을 헝가리안 표기법(Hungarian Notation)이라고 한다.
예약어
- 예약어는 정해진 기능을 수행하도록 이미 용도가 정해져 있는 단어로, 변수 이름이나 다른 목적으로 사용할 수 없습니다.
- C언어에는 다음과 같은 예약어가 있습니다.
구분 예약어 제어문-반복 do, for, while 제어문-선택 case, default, else, if, switch 제어문-분기 break, continue, goto, return 자료형 char, double, enum, float, int, long, short, signed, struct, typedef, union, unsigned, void 기억 클래스 auto, extern, register, static 기타 const, sizeot, volatile - 예제: 다음의 변수명을 C언어의 변수명으로 사용할 수 있는지 여부를 쓰시오.
변수명 설명 2abc 변수명의 첫 글자를 숫자로 시작하여 사용할 수 없다. sum* 특수문자를 변수명에 사용할 수 없다. for 예약어를 변수명으로 사용할 수 없다. ha p 변수명 중간에 공백을 사용할 수 없다. Kim, kim C언어는 대소문자를 구분하기 때문에 Kim과 kim은 서로 다른 변수로 사용할 수 있다. 변수를 상수로 만들어 사용하기
- 변수는 프로그램을 실행하는 도중 발생한 값을 저장하기 위한 공간으로 변수의 값은 변경될 수 있습니다. 하지만 변수에 저장된 값을 프로그램이 종료될 때까지 변경되지 않도록 상수로 만들어 사용할 수 있는데, 이런 경우 C언어에서는 const라는 예약어를 사용합니다.
- 변수처럼 상수에 이름을 붙여 기호화하여 사용한다고 하여 심볼릭(Symbolic) 상수라고도 합니다.
- 예: const float PI = 3.1415927;
- const: 변수를 상수로 변경하는 예약어입니다. const를 자료형 뒤에 붙여 'int const a = 5;'와 같이 사용할 수도 있습니다.
- float PI: 실수형으로 변수 PI를 선언하지만 const 예약어로 인해 PI는 상수가 됩니다.
- 3.1415927: 저장되는 값 그 자체로 리터럴(Literal)이라고 합니다.
∴ 이렇게 선언되면 PI는 변수가 아닌 상수이므로, 이후 PI는 프로그램 안에서 3.14159270이란 값으 로 고정되어 사용됩니다.
- 변수 선언 시 메모리 내에 변수의 값을 저장하기 위한 기억영역이 할당되는데, 할당되는 기억영역에 따라 사용 범위에 제한이 있다. 이러한 기억영역을 결정하는 작업을 기억 클래스(Storage Class)라 한다.
- C언어에서는 다음과 같이 5가지 종류의 기억 클래스를 제공한다.|종류|기억영역|예약어|생존기간|사용 범위|
|자동 변수|메모리(스택)|auto|일시적|지역적|
|레지스터 변수|레지스터|register|일시적|지역적|
|정적 변수(내부)|메모리(데이터)|static|영구적|지역적|
|정적 변수(외부)|메모리(데이터)|static|영구적|전역적|
|외부 변수|메모리(데이터)|extern|영구적|전역적|자동 변수(Automatic Variable)
- 자동 변수는 함수나 코드의 범위를 한정하는 블록 내에서 선언되는 변수이다.
- 함수나 블록이 실행되는 동안에만 존재하며 이를 벗어나면 자동으로 소멸된다.
- 초기화하지 않으면 쓰레기값(Garbage Value)이 저장된다.
외부 변수(External Variable)
- 외부 변수는 현재 파일이나 다른 파일에서 선언된 변수나 함수를 참조(reference)하기 위한 변수이다.
- 외부 변수는 함수 밖에서 선언한다.
- 함수가 종료된 뒤에도 값이 소멸되지 않는다.
- 초기화하지 않으면 자동으로 0으로 초기화 된다.
- 다른 파일에서 선언된 변수를 참조할 경우 초기화 할 수 없다.
정적 변수(Static Variable)
- 정적 변수는 함수나 블록 내에서 선언하는 내부 정적 변수와 함수 외부에서 선언하는 외부 정적 변수가 있다.
- 내부 정적 변수는 선언한 함수나 블록 내에서만 사용할 수 있고, 외부 정적 변수는 모든 함수에서 사용할 수 있다.
- 두 변수 모두 함수나 블록이 종료된 뒤에도 값이 소멸되지 않는다.
- 초기화는 변수 선언 시 한 번만 할 수 있으며, 초기화를 생략하면 자동으로 0으로 초기화 된다.
레지스터 변수(Register Variable)
- 레지스터 변수는 메모리가 아닌 CPU 내부의 레지스터에 기억영역을 할당받는 변수이다.
- 자주 사용되는 변수를 레지스터에 저장하여 처리 속도를 높이기 위해 사용한다.
- 함수나 블록이 실행되는 동안에만 존재하며 이를 벗어나면 자동으로 소멸된다.
- 레지스터의 사용 개수는 한정되어 있어 데이터를 저장할 레지스터가 없는 경우 자동 변수로 취급되어 메모리에 할당된다.
- CPU에 저장되어 메모리 주소를 가질 수 없기 때문에 변수의 주소를 구하는 주소 연산자(&)를 사용할 수 없다.
가비지 콜렉터(Garbage Collector)
- 변수를 선언만 하고 사용하지 않으면 이 변수들이 점유한 메모리 공간은 다른 프로그램들이 사용할 수 없게 됩니다. 이렇게 선언만 하고 사용하지 않는 변수들이 점유한 메모리 공간을 강제로 해제하여 다른 프로그램들이 사용할 수 있도록 하는 것을 가비지 콜렉션(Garbage Collection)이라고 하며, 이 기능을 수행하는 모듈을 가비지 콜렉터(Garbage Collector)라고 합니다.
- 변수는 일반적으로 '자료형 변수명 = 값;' 같은 형식으로 선언한다.
- 자료형: 변수에 저장될 자료의 형식을 지정한다.
- 변수명: 사용자가 원하는 이름을 임의로 지정한다. 단 변수명 작성 규칙에 맞게 지정해야 한다.
- 값: 변수를 선언하면서 초기화할 값을 지정한다. 단 값은 지정하지 않아도 된다.
- 예: int a = 5;
- int: 자료의 형식을 정수형으로 지정한다.
- a: 변수명을 a로 지정한다.
- 5: 변수 a를 선언하면서 초기값으로 5를 저장한다.
- 예제 1: 다음과 같이 변수를 선언할 때 변수에 저장되는 값을 확인하시오.
변수 선언 설명 char aa = 'A'; 문자형 변수 aa에 문자 'A'를 저장한다. 문자형 변수에는 한 글자만 저장되며, 저장될 때는 아스키 코드값으로 변경되어 정수로 저장된다. aa가 저장하고 있는 값을 문자로 출력하면 'A'가 출력되지만 숫자로 출력하면 'A'에 대한 아스키 코드 65가 출력된다. char bb = '1'; 문자 변수 bb에 '1'을 저장한다. 숫자를 작은따옴표로 묶을 경우 문자로 인식된다. short si = 32768; 짧은 정수형 변수 si에 32767을 넘어가는 값을 저장했기 때문에 오버플로가 발생한다. int in = 32768; 정수형 변수 in에 32768이 저장된다. float fl = 24.56f; 단정도 실수형 변수 fl에 실수 24.56을 저장한다. double dfl = 24.5678; 배정도 실수형 변수 dfl에 24.5678을 저장한다. double c = 1.23e-2; 배정도 실수형 변수 c에 1.23e-2를 저장한다. - 예제 2: 다음과 같이 변수를 선언할 때 잘못된 이유를 확인하시오.
변수 선언 설명 올바른 변수 선언 char a = 1.2345e-3; 배정도 실수형 상수를 char형으로 선언했기 때문에 오류가 발생한다. double a = 1.2345e-3; short a = 1.5e3f; 단정도 실수형 상수를 short형으로 선언했기 때문에 오류가 발생한다. float a = 1.5e3f; int a = '1'; 문자형 상수를 int로 선언했기 때문에 오류가 발생한다. char a = '1'; float a = 'A'; 문자형 상수를 float로 선언했기 때문에 오류가 발생한다. char a = 'A'; double a = "hello"; 문자열 상수를 double로 선언했기 때문에 오류가 발생한다. char a[] = "hello"; long long a = 1,5784E300L; 배정도 실수형 상수를 long long형으로 선언했기 때문에 오류가 발생한다. long double a = 1.5784E300L; char a = 10; 정수형 상수를 char형으로 선언했기 때문에 오류가 발생한다. int a = 10;