C언어에서 가장 많이 사용하는 변수는 역시 int일 것이다. 당장 for문 쓰려고 해도 int형 변수를 선언해야 하니까.
기본적으로, int는 정수형 변수고 char는 문자형 변수를 나타내는 예약어이다.

다음과 같이 선언해서 쓴다.
int a;
char b;

이렇게 하면 a는 정수 1개를 저장하는 변수가 되고 b는 문자 1개를 저장하는 변수가 된다.
a=65;
b='A';

이렇게 사용할 수 있다.
그런데 이런것도 된다.

a='A';
b=65;

이게 되는 이유는 C언어에서 문자를 숫자로 변환해서 사용하기 때문이다. 이때 변환하는 규칙은 ASCII코드표에 다 써져 있다. (ASCII코드가 아닌 다른 코드를 쓸 수도 있지만, 대세는 ASCII이다.)
다음과 같이 하면, a는 66이 되고 b는 "B"가 된다.
a++;
b++;


물론 다음과 같은 것도 된다.
printf("%d\n", a);
printf("%c\n", (char)a);
printf("%c\n", b);
printf("%d\n", (int)b);

이렇게 하면 그 결과는
65
A
A
65

가 될 것이다.

int와 char는 공통적으로 (실제로는) 둘 다 정수 1개를 저장한다. 하지만 int로 선언한 경우와 char로 선언한 경우에는 그 해석이 달라지는데, char로 선언하면 그것을 문자 1개로 해석한다. int로 선언한 경우에는 그것을 정수로 해석한다. 그리고 char에 저장될 수 있는 내용은, 그것을 정수로 생각한다면 8비트 정수 1개만 가능하다. 하지만 int는 그 선언을 어떻게 하느냐에 따라 다 달라진다
int a; //기계 또는 컴파일러에서 제공하는 기본적인 정수형의 길이(대체로 16비트나 32비트)
short int a; //16비트(2바이트) 길이
long int a; //32비트(4바이트) 길이
long long int a; //64비트(8바이트) 길이. 이건 요새 64비트 컴퓨터가 늘어나면서 쓰게 되었다. 운영체제에 따라서 long long 대신 int64를 쓰는 것도 있다.

이렇듯 더 큰 숫자를 쓰기 위해서 길이를 여러가지로 지정할 수 있다.

char은 또 한가지 중요한 특징이 있는데, 웬만해서는 포인터형 변수 또는 배열 변수로 사용한다는 점이다. 만약 "snowall"이라는 문자열을 처리하기 위해서 7개의 변수가 필요하다고 할 때,
char a='s';
char b='n';
char c='o';
char d='w';
char e='a';
char f='l';
char g='l';

이런식으로 쓰는 프로그래머가 있을지도 모르겠지만, 아마 돈받고 일하는 프로그래머중에는 없을 것이다.
이렇게 쓰면 아주 많은 문제가 발생한다. 직접 문자열을 다루고 체험하면서 느낄 수도 있지만 그런 수고를 덜기 위해서 간단히 설명해 보자면, 저렇게 쓰면 귀찮다. (귀찮지 않다면... 뭐 굳이 저렇게 써도 상관 없지만, 혼자서 개발하는 프로그램에만 저렇게 쓰기를 바란다.) 그래서 다음과 같이 쓸 수 있다.
char a[8] = "snowall"

이렇게 쓰면 a[0]부터 a[7]까지 접근하여 snowall의 각각의 글자들을 다룰 수 있다.[각주:1] 물론 a라는 배열 변수를 이용하여 한번에 뭔가를 할 수도 있다.
하지만 이 경우에도 문제가 발생하는데, a에 저장하여야 할 문자열의 길이가 7글자가 아닌 경우이다. 이때는 다시 길이를 마음대로 바꿀 수 있는 포인터를 사용하여 선언하게 된다.
#include<string.h>
char *a;
a = malloc(sizeof(char)*8);
strcpy(a, "snowall");
free(a);

이와 같이 쓰면 코드는 좀 복잡하지만 문자열의 길이를 맘대로 바꿔가면서 사용할 수 있다.
  1. 글자가 7개인데 배열이 8칸인 이유는 숨어있는 1글자 때문에 그렇다. 그 숨어있는 1글자는 자습. [본문으로]
by snowall 2010. 9. 19. 10:26
  • 마조 2010.09.19 12:08 ADDR EDIT/DEL REPLY

    스승님! 우러러보이쇼. 열심히 공부하겠으쇼.

  • goldenbug 2010.09.19 12:45 ADDR EDIT/DEL REPLY

    이렇게 간단한 거 짜지 마시고, 2GB보다 큰 TTXML 자르는 프로그램좀 만들어 주세요. ^^;;;

    • snowall 2010.09.20 03:45 신고 EDIT/DEL

      간단한거니까 대충 했죠.
      복잡한건 못해요 -_-;
      아직 XML파서는 다뤄본적이 없어서요..

    • goldenbug 2010.09.20 10:20 EDIT/DEL

      거창하게 xml 파서까지 생각하지 마시고, 큰 파일을 처음부터 끝까지 계속 검색하면서 특정 분자열과 문자열 사이를 복사해서 새파일로 계속 만들어주는 방법을 쓰면 되지 않을까 싶네요. 어차피 post태그를 기준으로 하나씩 자르기만 하면 되는 거니까요. ^^
      일단 작은 파일로 자르는 거 하나 만든 뒤, 그걸 검색해서 큰 걸로 만드는 프로그램을 다시 만들던지.... 뭐 그런...
      즐거운 추석 보내세요.

    • snowall 2010.09.20 10:28 신고 EDIT/DEL

      작은 파일과 큰 파일은 다루는 방법론 자체가 달라집니다.-_-;
      작은 파일에서 작동하는 프로그램도 큰 파일에서는 작동이 안되는 경우가 부지기수죠.
      그리고 그냥 특정 태그를 기준으로 파일을 잘라주는 프로그램이라면 perl이나 python쪽에서 이미, 여러개가 잘 개발되어 있을 가능성이 높습니다. 한번 검색해 보시면 될 것 같네요.

    • goldenbug 2010.09.20 11:31 EDIT/DEL

      그런가요? 한번 뒤져봐야겠네요.
      프로그래밍과 담을 쌓고 산지가 거의 10년이 되다보니 이젠 완전 꽝 됐다는..^^;

  • Tirin 2010.09.19 16:39 ADDR EDIT/DEL REPLY

    char 타입 변수에 문자를 넣으시려면 " 가 아니라 ' 을 써야 하는데.. 잘못 쓰신거 같네요.

    • snowall 2010.09.20 03:51 신고 EDIT/DEL

      감사합니다.
      지적하신 부분을 반영하여 수정하였습니다.

  • 구차니 2010.09.19 22:13 신고 ADDR EDIT/DEL REPLY

    a=65와 a='A' 와 같은건 해석의 문제겠죠.
    컴퓨터 에게 있어서 0100 0001 로 동일한 데이터고
    단지 출력(혹은 해석)에 있어서 사람이 보기 좋은 방법대로 출력할 뿐이니까요.

    이런생각이 드니 문득 기존의 type 이라는 정의자체가 바뀌어야 하지 않을까
    단순히 데이터를 저장하는데 있어 메모리를 아끼기 위한 방법이 아닌
    컴퓨터가 데이터를 해석하는 방법을 알려주기 위한 것으로 바뀌어야 하지 않을까 싶더라구요.

    • snowall 2010.09.20 03:51 신고 EDIT/DEL

      type은 원래 그 정의가 컴퓨터가 메모리의 내용을 해석하는 방법을 알려주는 건데요;;;;

    • 구차니 2010.09.20 09:22 신고 EDIT/DEL

      대부분의 교재에서 메모리를 아끼는 방법으로 사용된다 라고만 나오니까요 ^^;

    • snowall 2010.09.20 10:04 신고 EDIT/DEL

      제가 컴퓨터를 잘못 배웠나보네요 -_-;

      type을 메모리를 아끼는 방법으로 사용한다면 객체지향형 언어에서 사용하는 class는 메모리를 낭비하는 방법이 되는 거라서 말이죠...

    • 구차니 2010.09.20 13:13 신고 EDIT/DEL

      원래 객체지향이 시스템을 극한(?)으로 쓰기 보다는 프로그램 유지보수나 개발속도 향상에 집중하는 개발방법론이니 엄밀한 의미에서는 메모리 낭비는 맞겠죠 ^^;