2장 자료형
C 언어의 자료형이란?
일정 크기의 메모리에 저장된 정보를 해석하는 방법을 말한다.
컴퓨터가 처리할수있는것은 오로지 0과1뿐이다 보기에는 그림이나 글자의 모습을 하고있다고 해도 본질은 숫자이다. 자료는 성격에 따라 변수와 상수로 나눌 수 있고 형식에 따라 다시 정수와 실수로 나눌수 있다.
변수와 상수
상수란 어떠한 값이 확정되어 앞으로 변할 가능성이 없는 수를 말한다. 간단한 예로 파이(3.141592), 빛의 속도등등.

변수란 구체화하지 않았거나 앞으로 변경될 가능성이 있는 수를 말한다.
예를 들어 f(x) = y 에서 x 가 변수이다. 프로그램을 작성하다보면 확정할수 없는 앞으로 변경가능성이 있는 값들이 많이 있다. 또한 사용자로 부터 입력 받아야 하는 값들은 변수가 될수 밖에 없다.
변수는 이름으로 식별하고 선언하고 사용해야하는데 반드시 이름을 부여해야한다. 예를 들어 int Age;
변수는 그릇이고 상수는 그릇에 담을 음료이다. 종이컵에 커피를 담으면 '커피 한 잔'이지만 종이컵에 주스를 담으면 '주스 한 잔'이 된다.
변수는 메모리로 구현되며, 메모리는 주소를 가진다.
C 언어의 자료형
자료형은 크게 정수형, 실수형, 유도형, 함수형 이 있다. 나중에는 알아야 하겠지만 지금은 char은 영문자, int 는 정수, double은 실수를 다루기위한 형식임을 이해한다.

보수와 음수 표현
보수(complement)는 반대로 세는 수이다. 쉽게 생각하면 10에대한 7의 보수라는 것은 "7에 얼마를 더하면 10이 되는가"로 이해할수있다.
보수를 알아야하는 이유는 컴퓨터는 2진법을 사용하여 보수를 더하는 방식으로 뺄샘을 구현하기 때문이다.
예를 들어, 9에서 3을 빼면 6이 된다. 9에 대한 3의 보수는 7이다. 그렇다면 9에 7을 더하면 16이 되고 여기서 자리올림을 무시하면 6이 된다. 보수를 더하고 자리올림을 무시하면 뺄샘이 된다.

부호비트와 자료비트 그리고 표현범위
8비트는 1바이트 이고, 자료형에서 부호가 있는 정수형의 경우, 가장 왼쪽 1비트를 부호비트(sign bit)로 사용한다. 그리고 나머지 비트를 자료비트 영역이라고 한다. 부호비트가 0이면 양수가 되고 1이면 음수가 된다.

8비트 짜리 char 자료형을 보면 부호가 있을때 10진수 표현 가능 범위는 -128 ~ 127 까지이고, 부호가 없는 char 형의 경우 0 ~ 255 까지 표현할수 있다.

이 범위를 넘어선 숫자는 잘림이 발생하기 때문에 표현할 수 없고 정확한 연산 결과를 기대할수 없다. 따라서 표현 범위 내에서 연산이 이루어 질수 있도록 프로그래밍해야한다.
어릴적 하던 게임 포인트의 최대값이 2,147,483,647인걸로 봐서 포인트 변수는 부호가 있는 int 형을 사용했던것같다.

정수 자료형과 변수, 상수
변수는 사용에 앞서 반드시 선언해야한다.
그리고 선언된 변수에 값을 특정하는 정의를 수행하고 사용한다.
자료형 변수이름 = 초깃값;
int Age = 26;
변수를 선언할 때는 반드시 이름을 부여해야하고 선택적으로 초깃값을 명시(정의)할수 있다.
변수 이름은 프로그래머 마음대로 만들지만, 주의할점으로는 영문 대/소문자,_,숫자로 만들어야하며, 첫 글자는 숫자가 될수없고, 중간에 공백을 넣을수 없다. 또한 예약어 return,for, if, 등 사용할수 없다.

제약사항은 아니지만 나의 코드를 팀원,동료등 다른사람도 같이 보기때문에
너무 긴 이름은 좋지않고, 용도에 맞는 이름을 부여하고, 의미없는 이름을 부여하지 않는다.
char와 ASCII코드
컴퓨터는 오로지 숫자만 표현할 수 있을 뿐 글자를 표현할수 없다.그래서 나온 대안으로 특정 숫자를 문자로 규정하자 약속한것인데 이것을 부호체계 라고 한다.
과거 부호체계는 컴퓨터 제조사마다 달랐지만 결국 ASCII(American Standard Code for Information Interchange)로 통일 되었다.
ASCII 코드는 7비트로 문자를 표현하는 코드체계였으나 여기에 확장 비트를 하나 더해 8비트로 표현된다. 영문 한 글자를 저장할 수 있는 메모리의 크기(1바이트)가 8비트인 이유도 위같은 이유이다.
short, wchar_t
short 자료형은 부호가 있는 16비트 정수형 이다. 표현 범위가 작아 자주 사용은 하지않는다.
유니코드체계에서는 문자 하나를 저장하는 공간으로 wchar_t 형을 다룬다. 윈도우 환경에서 short 과 동일한 16비트 자료형이다.
short portNum = 8080;
wchar_t w = L'A';
wchar_t 형 문자 상수는 특이하게 앞에 'L'이 붙는다.
int와long
int형은 부호가 있는 32비트 정수형이며 가장 많이 사용된다.
short port = 7777;
int Age = 26;
long longNum = 10L;
long int longintNum = 10L;
long long int longlongintNum = 10LL;
unsigned short port = 7777U;
unsigned int Age = 26U;
unsigned long int longintNum = 10UL;
unsigned long long int longlongintNum = 10ULL;
자료형에 unsigned 가 포함되면 상수 끝에 U가 붙고,
자료형에 long 이 포함되면 상수 끝에 L 이 붙는다.
따라서 unsigned long long int 라면 상수 끝에 ULL 이 붙는다.
실수 자료형
실수 자료형은 1.234이나 3.123 처럼 소수점 이하의 숫자 정보까지 표현 할 수 있는 자료형을 말한다. 다른 말로 부동 소수점 표현 이라고도 한다.
컴퓨터가 정수를 표현하는 방법은 자료의 비트단위 크기에 대한 차이가 있을 뿐 어떤 자료형이든 해석방법이 같고 숫자가 명확하다. 하지만 실수는 그렇지 않다. 이유는 두 정수 사이의 실수의 수를 정확하게 말할 수 없기 때문이다.
1.3은 정수 1과 정수 2사이의 실수이다. 1과 2사이의 실수는 무한히 많은 실수가 있다고 할 수밖에 없다.
실수를 표현하는 방법은 일정 수준의 오류(부동 소수점 오차)를 전제로 하며 다양한 표현방법이 있다.
옛날에는 컴퓨터 회사마다 실수를 표현하는 방법이 다랐으나 IEEE(Institute of Electrical and Electronics Engineers, 전기전자 공학자협회)가 규정한 표준을 기반으로 실수형 자료를 표현하게 되었고 그것이 IEEE 754(아이트리플이)이다.
IEEE 754 표준은 부동 소수점 자료 표현을 위해 32비트 단정도, 64비트 배정도 및 79비트 확장 배정도 형식에 대한 표준을 규정한다.
C 언어는 32비트 단정도에 해당하는 float 형과 64비트 배정도인 double형을 지원한다.

float 형은 소수점 이하 6자리까지 유효하다.
double 형은 소수점 이하 15자리까지 유효하다.
문자와 문자(배)열
문자의 배열은 여러 문자 인스턴스가 모인 집합체 이다. 본질은 배열임에도 다른 자료형처럼 특정 인스턴스 한 개라고 착각한다. 문자열의 길이가 가변적이여서 고려 해야할 것들이 다른 형식보다 많다.
배열은 한 개의 인스턴스가 아니라 여러 인스턴스가 모여 한 덩어리를 이룬 집합체 라는 것을 명심하고 개별 인스턴스에 부여된 이름이 아니라 주소에 이름을 부여한다는 점은 기억해야한다.
일반 문자 char 형 변수와 배열을 선언 및 정의하는 방법을 보인 예이다.
#include <stdio.h>
int main(void){
char ch1 = 'X', ch2 = 'Y', ch3 = 'Z';
char arrayData[4] = {'X','Y','Z'};
char array2Data[4] = {"XYZ"};
return 1;
}
char형 변수인 ch1,ch2,ch3을 선언 및 정의한 코드이다. 3개의 char 형 인스턴스가 정의 되었으며, 각각 'X','Y','Z' 로 초기화 되었다. 각 변수들의 이름은 독립적으로 부여된 식별자이다.
arrayData[4]는 char형 인스턴스 4개가 한 덩어리를 이루는 배열의 선언 및 정의이다. arrayData[4]는 char 인스턴스 4개를 의미한다. 주의할 점은 배열의 마지막 4번째 요소의 초기값을 주지않았는데 별다른 정의가 없다면 0으로 초기화 된다.
array2Data[4]도 마찬가지로 char형 인스턴스 4개가 한 덩어리를 이루는 배열의 선언 및 정의 인데, 큰따옴표를 사용하여 한번에 묶는 방법으로 표시한것이다.arrayData과 동일하다.
여기서 문제 char 형 인스턴스로 3개를 선언 및 정의했는데 배열은 인스턴스 4개로 구성했다. 이유는 문자열의 끝은 NULL('\0' )이기 때문이다.
이름과 주석문
프로그램 코드는 그 자체로 하나의 문서이다. 따라서 누가 봐도 이해하기 쉽게 기술하는 습관을 유지하는 것이 중요하다. 읽기 좋은 코드라는 것은 이해하기 쉽고 가독성이 좋은 코드를 기본으로 한다.
이해하기 쉽고 가독성이 좋은 코드를 만들려면 기본 중의 기본은 이름 짓기와 주석문 이다.
이름 짓기와 식별자
변수와 함수는 이름으로 각각을 식별한다. 변수와 함수 이름을 별 근거 없이 아무렇게나 짓는 행위는 매우 위험하다. 이름에서 목적이 드러나는 것이 좋다. 최종 연산 결과가 저장되는 변수인 nResult 라고 짓는다면 결과라는 의미를 누구나 유추할것이다.
주석문
주석문이란 프로그램 내에 개발자가 메모를 남길 수 있게 하는 문법이다. 프로그램의 코드가 아니라 메모이다. 실제 프로그램에 영향을 주지 않는다. 소스 코드를 컴파일할때 주석문은 기계어로 번역하지 않는다.
// 한줄 주석
/*
여러 줄 주석
*/
소스코드도 하나의 문서이고 회사에서 일한다면 회사의 문서가 된다. 그러므로 누가 보더라도 쉽게 이해할수있도록 작성하는 노력이 중요하다.