자료형(datatype)은 크게 '상수(constant)'와 '변수(variable)'로 나눌 수 있습니다.
상수는 값이 한번 정해지면 그 값을 변경할 수 없습니다.
C에서 사용되는 상수는 '정수형 상수', '실수형 상수', '문자형 상수', '문자열 상수'가 있습니다.
C에서 정수형 상수는 10진수, 8진수, 16진수로 표현할 수 있습니다.
10진 상수 : 우리가 평소에 흔히 사용하는 숫자 형식으로, '0~9'로 이루어지고 '0'으로 시작할 수 없습니다.
ex) 1, -1, 100
8진 상수 : '0~7'을 사용하며, "맨앞에 0을 붙여 구분'합니다.
ex) 01, 010
16진 상수 : '0~9'와 'A~F(a~f)(각각 '10~15'에 대응)'를 사용하며, '맨앞에 0x(0X)를 붙여 구분'합니다.
ex) 0x9a, 0X3C
unsigned형 상수 : 부호 없는 상수이며, '맨끝에 u(U)를 붙여 구분'합니다.
ex) 100u, 013u, 0XAU
long형 상수 : 큰 길이의 정수를 표현하며, '맨 끝에 l(L)을 붙여 구분'합니다.
ex) 100l, 0XAL
실수형 상수는 '부동소수점형 상수' 라고도 하며, 기본 자료형으로 'double'형을 사용합니다.
소수 형식 : '소수점을 사용하여 구분'합니다.
ex) 3.14, .1
지수 형식 : '10진수와 e(E)를 붙여 구분'합니다.
ex) 1E3(=1000), 1e-2(=0.01)
float형 상수 : 숫자 '맨 끝에 f(F)를 붙여 구분'합니다.
long double형 상수 : 숫자 '맨 끝에 l(L)을 붙여 구분'합니다.
문자형 상수는 '단일 인용부호('')로 묶여있는 하나의 영문자나 숫자문자'입니다. 내부적으로 ASCII 코드값을 사용하며, 특별히 키보드에 있지않은 문자는 'escape 문자'라고 하는데, 특수한 기능을 갖습니다.
ASCII 코드 : 초창기에는 다양한 방법으로 문자를 표현했는데, 호환에서 문제가 발생하여 이를 해결하기 위해 ANSI에서 ASCII(American Standard Code for Information Interchange)라는 표준 코드 체계를 제시했고, 이 코드가 현재까지 널리 사용되고 있습니다. ASCII는 각 문자를 '7비트'로 표현하므로 총 128(=2⁷)가지의 문자 표현이 가능합니다.
문자열 상수는 '이중 인용부호("")로 묶여있는 둘 이상의 영문자와 숫자문자로 이루어진 상수입니다. 문자열 상수가 기억공간에 저장될 때는 문자열 끝에 '\0(null 문자)'가 추가됩니다.
예를 들어 "hi"라는 문자열은 h
i
\0
형태로 저장되며, 두 글자라서 2바이트가 아닌, null 문자를 포함해 3바이트의 기억공간이 필요합니다.
변수(variable)는 프로그램 실행 도중 변할 수 있는 값이 저장되는 기억공간입니다. 예를 들어 a=1;
이라는 문장에서 'a'는 변수이며, 이 공간에 '1'이라는 값을 저장하는 것 입니다. 변수를 사용하기 전에는 반드시 그 변수를 선언하여 컴파일러가 기억공간을 확보하도록 해야합니다.
모든 변수는 '자료형'이 있으며, '할당된 값'을 가집니다. 그리고 반드시 '이름'도 가지는데, 이때 명칭 작성 규칙 을 따라야합니다.
'변수 선언'은 자료가 저장될 기억 공간을 확보하고, 그 공간에 이름을 부여하는 것 입니다.
'자료형'은 사용하는 자료의 형태로, 컴파일러가 기억공간을 확보할 때 사용하는 자료의 종류나 크기 등의 특징입니다. 따라서 사용 목적에 따라 결정해야합니다.
같은 자료형 앞에 'unsigned'가 붙으면 부호가 없는 정수를 표현합니다. 반대로 음수를 표현하기위해서는 'signed'를 붙여줘야하지만 보통은 생략하여 표현합니다. 따라서 unsigned 키워드가 붙으면 양수 범위가 signed에 비해 두배 늘어나지만, 음수는 표현할 수 없으므로, 결국 byte로 부여받은 기억공간의 크기는 동일하여 표현 범위의 절댓값은 동일합니다.
short, short int, signed short, signed short int
: 2byte의 크기를 가지며, '-32,768~32,767'의 범위를 표현합니다.
unsigned short, unsigned short int
: 2byte의 크기를 가지며, '0~65,535'의 범위를 표현합니다.
int, signed int
: 4byte의 크기를 가지며, '-2,147,483,648~2,147,483,647'의 범위를 표현합니다.
unsigned, unsigned int
: 4byte의 크기를 가지며, '0~4,294,967,295'의 범위를 표현합니다.
long, long int, signed long, signed long int
: 4byte의 크기를 가지며, '-2,147,483,648~2,147,483,647'의 범위를 표현합니다.
unsigned long, unsigned long int
: 4byte의 크기를 가지며, '0~4,294,967,295'의 범위를 표현합니다.
long long, long long int, signed long long int
: 8byte의 크기를 가지며, '-9,223,372,036,854,775,808~9,223,372,036,854,775,807'의 범위를 표현합니다.
unsigned long long, unsigned long long int
: 8byte의 크기를 가지며, '0~18,446,744,073,709,551,615'의 범위를 표현합니다.
실수 자료형은 실수와 소수점을 2진수로 표현하는 '부동 소수점 표현 방법'을 사용합니다. 관련 규약은 'IEEE 754'이며, 값의 일정 부분을 비트 단위로 나누어 부호, 가수, 지수를 저장하여 실수를 표현합니다.
float : 단정밀도 부동 소수점 방식이며, 4byte의 크기를 가지고, '3.4×10⁻³⁸~3.4×10⁺³⁸'의 범위를 표현합니다.
4byte(32bit) 중, 첫 1bit는 부호, 다음 8bit는 지수부, 나머지 23bit는 가수부를 표현합니다.
double : 배정밀도 부동 소수점 방식이며, 8byte의 크기를 가지고, '1.7×10⁻³⁰⁸~1.7×10⁺³⁰⁸'의 범위를 표현합니다.
8byte(64bit) 중, 첫 1bit는 부호, 다음 11bit는 지수부, 나머지 52bit는 가수부를 표현합니다.
C에서는 문자형을 ASCII 코드로 처리합니다.
선행처리기는 컴파일 시 컴파일에 앞서 프로그램 초기에 선언된 지시자들을 미리 처리하는 역할을 합니다. 그리고 헤더 파일이있다면 컴파일 전에 해당 헤더 파일을 불러와 연결시킵니다.
선행처리기는 반드시 '#'으로 시작하며, 끝에 '세미콜론(;)'을 붙이지않습니다. 그리고 한 줄에 하나의 명령만 써야하고 반드시 소스 프로그램의 첫 부분에 위치해야합니다.
파일을 포함 시키는 역할을 합니다.
// 표준 디렉터리(보통 include 디렉터리)에서 파일을 찾아 포함합니다.
#include <파일명>
// 작성 중인 디렉터리와 같은 경로의 사용자 헤더 파일을 찾아 포함합니다.
#include "파일명"
// 작성 중인 디렉터리와 다른 경로의 사용자 헤더 파일을 찾아 포함합니다.
#include "파일 경로"
예를 들어, 표준 입출력인 printf()
함수와 scanf()
함수를 사용하기 위해서는 stdio.h
표준 헤더 파일을 아래처럼 include 해줘야합니다.
#include <stdio.h>
그리고 my.h
라는 헤더 파일을 만들어 사용하고 싶다면
#include "my.h" //현재 디렉터리와 동일한 위치에 헤더 파일이 있을 때
#include "./myHeader/my.h" //하위 디렉터리에 헤더 파일이 있을 때
위 처럼 사용할 수 있습니다.
매크로(macro)(#define에 의해 단순 치환되는 자료)를 정의합니다. 따라서 상수 값이나 수식 등이 자주 사용될 때 사용하면 편리합니다. 명칭 작성시에는 일반적으로 대문자를 사용하며, 문자열이 길어서 줄이 바뀔 때는 '\'를 붙여준 뒤 줄을 바꿔 계속 작성합니다.
#define 매크로명 값 //값이 문자열이라면 "문자열", 문자라면 '문자'의 형태로 작성합니다.
#undef 매크로명 //매크로를 해제할 때는 매크로명만 적어주면됩니다.
#define PI 3.141592
#define C 'G'
#define S "이거 너무 길어서 이러다가 한 줄을 넘어가기라도하\
면 어쩌나 몰라"
위 처럼 매크로를 정의하고 표준 출력 함수인 printf()로 출력을 해보면
이렇게 잘 출력되는 것을 확인할 수 있습니다.
매크로는 함수로도 사용할 수 있습니다. 선행처리기가 단순히 치환을 시키는 방식이므로 짧은 코드는 함수로 정의하는 것보다 속도 측면에서 빠르다는 장점이 있습니다.
#define 매크로명(인수, ...) 수식
인수는 하나가 될 수도있고, 두개 이상이 될 수도 있습니다.
#define PLUS(a,b) a+b
위처럼 작성한 뒤 사용할 수 있습니다.
조건부 컴파일 시 사용합니다.
#if 조건1
명령문1;
#elif 조건2
명령문2;
#elif 조건3
명령문3;
...
#else
명령문;
#endif
위와 같은 형태로 사용되며, '#elif'와 '#else'는 반드시 쓰지 않고, 상황에 맞게 사용하면 됩니다.
#include <stdio.h>
#define CONDITION 8
int main(){
#if CONDITION==1
printf("1");
#elif CONDITION==2
printf("2");
#else
printf("3");
#endif
}
위와 같은 프로그램이 있다고한다면 'CONDITION'이 매크로 상수로 인해 '8'로 정의되어 있으므로, '#if'와 '#elif'로 작성된 부분이 아닌, '#else' 부분을 컴파일하여 실행하기때문에 '3'이 출력됩니다.