본문으로 바로가기
반응형

토큰

 언어학에서는 의미 있는 제일 작은 단위이다.

(he is handsome, heishandsome 이렇듯 띄어쓰기가 없으면 구별할 수 없듯이 토큰은 띄어쓰기로 구별된다)

 

 C 프로그램에 구성하는 문자들도 어휘 단위인 토큰(token)으로 구분된다.

연산자(operator), 구분자(separator), 명칭(identifier), 키워드(keyword), 상수(constant)라는 5가지 토큰이 존재한다.

 

 명칭(identifier)은 변수나 함수의 이름처럼 프로그램내에서 사용자가 필요에 따라 만들어 사용하는 토큰들을 말한다. 영문 대소문자, 숫자 혹은 밑줄(underscore : _)로 구성되며, 숫자로 시작할 수 없으며 키워드와 같을 수 없다.

 

 키워드는 예약어(reserved word)라고도 하며 C프로그램이 갖추어야할 구조를 형성하는데 쓰여지는 단어들로, C 언어 내에서 특정한 의미가 미리 주어져서 명칭으로 사용할 수 없다.(identifier(변수이름)와 겹치면 안된다)

 

C에서 사용하는 예약어

 

 상수(constant)에는 정수 상수(integer constant), 부동소수점 상수(floating-poing constant), 문자 상수(character constant), 문자열 상수(string constant)가 포함된다.

 

 

자료형

 변수는 데이터를 저장할 메모리 공간을 할당하고, 이에 이름을 붙여준 것이다. 예를들어 정수를 저장할 메모리 공간 4바이트를 할당하고 나서 그 메모리 공간에 value라는 이름을 붙여 준다면, value가 바로 변수가 되는 것이다.

 

 C언어는 이러한 변수의 선언을 위해 자료형(data type)을 제공한다. 이때 자료형은 "선언할 변수의 특징을 나타내기 위한 키워드"이다. 

 

 자료형이란 메모리에 저장된 데이터의 해석방법이라고 볼 수 있다. 각 데이터의 저장형식은 메모리의 저장공간을 절약하기 위해 다른 방법을 사용한다.

 

C언어의 대표적인 자료형

char은 1바이트로 정수형에 속한다. 라고 볼 수 있다.

 

void는 회피의 의미를 가지고있으며 크기와 타입이 없다.

 

문자형

 문자형은 문자의 집합으로, 각 문자는 1바이트에 저장된다. 1바이트는 8비트로 구성되어 있기때문에 2^8 = 256개의 문자를 표현할 수 있다. char는 문자형이라고 해놨지만 사실 1바이트 짜리의 정수형이라고 볼 수 있다. 

 

 문자 변수는 예약어 char를 사용해서 선언한다. 문자상수는 작은따옴표( ' ' )를 사용하여 아래와 같이 나타낸다.

 일반적으로 PC에서는 ASCII(American Standard Code for Information Interchange) 코드가 사용되고 있다. 원래 ASCII 코드는 1바이트 내의 7비트 만을 이용해서 10진수 0에서 127까지의 128개의 문자로 구성되었다. 여기에는 영어 알파벳의 대문자와 소문자, 그리고 보조문자들과 제어문자들을 포함하고 있다.

int A = 65;

int B = 'A';

로 두개를 선언하면 A와 B는 같다고 볼 수 있다.

실제로 어셈블리로 확인해보면 41h (65를 16진수로 나타냈다는 뜻) 로 동일하다는 것을 알 수 있다.

// 문자를 화면에 출력하고 벨소리를 출력하는 프로그램
#include <stdio.h>

int main() {
	printf("Print Character: %c\n", 104);
	printf("Print Character: %c\n", 105);
	printf("bell sound \a\n\n");
	
	printf("A, B 같은지 비교\n");
	int A = 65;
	int B = 'A';
	printf("A : %c\n", A);
	printf("B : %c\n", B);
    printf("A : %d\n", A);
	printf("B : %d\n", B);
	return 0;
}

A, B 값은 %c로 출력했을때는 A로 똑같고, %d로 출력했을때는 'A'의 아스키코드인 65로 동일하게 출력된다.

 

 

 

정수형

 char형 변수가 저장할 수 있는 값의 범위는 -128 ~ +127(0~255)이다. 그 이상의 값을 저장해야하면 int형 변수를 사용해야한다.

 int형은 CPU에 의존하는 데이터타입이다. 2의 보수를 사용하는 시스템에서 운영체제가 32비트인 경우, 저장할 수 있는 값의 범위는 -2147483648~+2147483647 이다.

 

 

심볼테이블

 만약 int A; 를 선언하면 프로그래머는 A라는 int형 변수를 선언하는 것이지만, 컴퓨터는 숫자로만 기억하기때문에 A라는 이름으로 기억하는 것이 아니다. 우리가 사용하는 A라는 이름과 매칭시키기위해 컴파일러는 심볼테이블이라는 것을 생성한다.

 심볼테이블은 변수가 선언되면 테이블을 생성하여 변수의 타입, 이름, 주소를 생성한다. 변수를 초기화하면 심볼 테이블에서 변수를 찾아 해당 주소에 값을 넣는다. 심볼테이블은 컴파일러가 생성하고 컴파일이 끝나면 사라진다.

 

 

int A = 100;

1. int A 선언 -> 스택영역에 A의 주소(예를들어 1000번지)를 만듬

2. A의 위치에 100을 넣어라 -> A의 주소(1000번지)에 100을 넣어라.

 

int B; 

가 선언됬을때 A 주소 근처의 주소에 할당된다.

계속 주소를 할당하다보면 스택이 꽉차게된다. 스택을 넘어가버리면 스택 오버플로우가 발생한다.

 

이때, 

B = A;    

 라는 코드를 작성하게되면 컴파일러는 심볼테이블에서 type이 같은지 부터 검사하고, 만약 자료형(type)이 일치하면 1000번지(A)에 있는 값을 996번지(B)에 대입해준다. 

 하지만 데이터는 스스로 움직이는게 아니므로 메모리에서 버스를 통해 CPU로 건너가서 레지스터에 저장된 다음에 다시 버스를 통해 B의 주소로 가게된다.

 

 

 

 

 

 

 

 

 

반응형