Team Curio

비주얼 노벨 한국어 패치 팀 큐리오

프로그래밍

6.c 언어강좌 (3)

연이v 2009. 7. 4. 11:57
반응형
SMALL
=============================================================================
C 프로그래밍 3회
=============================================================================
이번 강좌에서는 C프로그램에서의 데이터에 대해 알아보도록 하죠.

1. C언어에서의 데이터의 종류
C언어에서 데이터를 크게 분류하자면 수치 데이터와 문자 데이터로 분류할수 있습니다.
수치 데이터는 0, 1, 100, 200등의 정수와 1.0, 2.0등등의 소수가 있고, 문자 데이터에는 'A', 'B'등의 문자와, "ABCDEFG"등의 문자열이 있습니다.
그리고 데이터는 상수와 변수로도 구분할수 있습니다.

2. 변수 변수란
프로그램에서 변할수 있는 값을 말합니다.
정확히 말하지면 어떤 기억장소가 주어지는데 그 안의 값을 마음데로 바꿀수 있는 기억장소를 말합니다. 변수를 사용하기 위해선 반드시 변수를 선언해야 합니다.
즉 기억장소를 마련해야 쓸수 있는 것이죠 그럼 변수를 선언하는 방법에 대해 알아볼까요?
변수 선언은..
변수의자료형태 변수명[=초기값, 변수명=초기값...];
이렇게 합니다.
여기서 변수의자료형태는 변수에 저장할 값이 정수인지 소수인지 문자인지 등등을 정하는 키워드를 쓰는 것 입니다. 그리고 변수명은 그 변수를 상징하는 심볼이고 초기값은 처음에 들어갈 값인데 초기값이 필요 없으면 쓰지 않아도 됨니다. 그럼 자료형 키워드에 대해 알아보죠.

(1) 문자 문자를 나타내는 키워드가 있는데 그건 char입니다.
이건 8비트로 되어 있고 1문자를 넣을수 있습니다.

(2) 정수 정수를 나타내는 키워드는 int입니다.
이 형태의 크기는 환경에 따라 달라집니다.
즉 16비트 프로그램의 경우 이 크기는 16비트이고 윈도우즈 95와 같은 32비트 프로그램에선 32비트 입니다.
하지만 지금은 16비트 환경인 도스에서 하므로 이 크기는 16비트가 됩니다. 그러므로 여기에는 -32768에서 32767까지 넣을수 있습니다. 그런데 크기를 16비트 또는 32비트로 정확히 정하고 싶을때가 있죠? 그럴땐 short, long키워드를 사용합니다. short또는 long를 int앞에 써주면 되죠
short int a=3; long int b, c; 이런 식으로..
여기서 short를 써주면 16비트가 되고 long를 써주면 32비트가 됨니다.
그리고 이때는 int를 생략해도 됨니다.
short a=3; long b, c; 이렇게..
만약 long를 썼다면 32비트 이므로 -2147483648에서 2147483647까지 넣을수 있죠.

(3) 소수 그리고 다음은 소수에 형태의 키워드 입니다.
소수 형태에 키워드에는 float와 double이 있습니다. 두개의 차이는 float는 32비트이고 double는 64비트라는 것 입니다. float에는 -3.4E-38에서 3.4E+38까지를 넣을수 있고 double에는 -1.7E-308에서 1.7E+308까지를 넣을수 있죠. 여기서 E다음에 나오는 수는 지수를 말합니다. 즉 -3.4E-38은 -3.4의 -38승을 말합니다.

(4) 숫자와 문자간의 관계 숫자와 문자간의 관계를 알아보죠.
C에서는 숫자가 곧 문자이고 문자가 곧 숫자라는것을 알아두시기 바랍니다. 즉 숫자 65는 곧 아스키 코드 65인 문자 A이고 문자 A는 곧 숫자 65입니다. 그러니까 65는 A라는 것이죠.
그러므로 char a='A';
이것은 char a=65;
이것과 똑같습니다.
또한 여기서처럼 char형에도 숫자를 넣을수가 있습니다. char형에는 -128에서 127까지 넣을수 있죠. 물론 int형에도 문자를 넣을수가 있습니다.

(5) 부호 처리 이번엔 부호 처리를 결정하는 signed와 unsigned에 대해 알아보도록 하겠습니다.
우선 이것은 char형과 int형에 대해서만 사용할수 있다는 것을 알아두세요.
char과 int형에는 +와 -부호가 있습니다.(물론 float, double에도 있지만..) int형의 경우 16비트 중에서 1비트가 부호를 나타내는 것이고, 나머지 15비트가 숫자 크기를 나타내죠.
이 1비트를 sign비트라고 합니다.
이런 sign비트가 있는 변수를 만드느냐 아니면 없는 변수를 만드느냐를 정하는 키워드가 signed와 unsigned입니다.
이것은 변수형 앞에 써 주면 되고 signed를 쓰면 sign비트를 만들고 unsigned를 쓰면 sign비트를 만들지 않습니다.
예를 들자면..
signed int a; unsigned int b;
이런 식으로.. 그런데 signed는 디폴트 입니다.
즉 쓰지 않으면 signed로 하는 것이죠.
그러니까 signed int a;
이건 int a;
이거랑 똑같습니다..
만약 unsigned를 쓰면 sign비트가 없고 모든 비트를 숫자 크기를 나타내는데 씀니다.
그래서 부호를 처리하지 않습니다.
그러므로 양수만을 넣을수 있지만 더 큰 수를 넣을수 있죠.
unsigned char에는 0에서 255까지
unsigned int나 unsigned short에는 0에서 65535까지
unsigned long에는 0에서 4294967296까지 넣을수 있습니다.

(6) 변수에 값 치환 다음으로 변수에 값을 넣는 방법을 알아야 하는데 이건 아주 간단합니다.
변수명=값;
이렇게만 해주면 되거든요.
예를 들자면.. a=10;
이렇게 하면 a에 10을 넣으라는 것이죠.
이것으로 변수에 대한 설명을 마치겠습니다.
그럼 지금까지 나온 변수 형태를 정리해 보죠.
키워드 변수형태 변수 범위
------------------------------------------------------------------------
(signed) char 문자 -128~127
unsigned char 문자 0~255
(signed) int 정수 -32768~32767
unsigned int 부호없는 정수 0~65535
(signed) short (int) 정수 -32768~32767
unsigned short (int) 부호없는 정수 0~65535
(signed) long (int) 정수 -2147483648~2147483647
unsigned long (int) 부호없는 정수 0~4294967296
float 소수 -3.4E-38~3.4E+38
double 소수 -1.7E-308~1.7E+308
------------------------------------------------------------------------
(괄호 안은 생략가능한 것)
여기서 문자열에 관한 데이터형은 없는데 C에는 문자열 데이터형이 없습니다.
그래서 특별한 방법으로 문자열을 처리하기 때문에 조금 후에 배우기로 하죠.

3. 상수
상수는 프로그램에서 변할수 없는 값을 말합니다.
상수는 크게 두가지로 나눌수 있는데 바로 실재값과 기억장소를 갖는 상수 입니다.

(1) 실재값 실재값은 말 그대로 실재값 입니다.
실재값이라고 밖에는 설명할수가 없겠군요.
실재값중 수를 나타내는 실재값을 알아보죠.
수를 나타내는 실재값은 정말 쉽습니다.
10진수의 경우 부호를 쓴 후 값을 그대로 써주면 됨니다.
예를 들어 +20, -20, 5.2 이것 처럼 말입니다. 그런데 부호가 +일 때는 생략해도 됨니다.
그리고 8진수의 경우는 앞에 0을 써주면 됨니다.
예를 들어 013은 8진수 13이고, -015는 8진수 -15입니다. 또한 8진수는 0에서 7까지의 8개의 수만 쓴다는 것도 기억하세요.
마지막으로 많이 쓰이는 16진수는 앞에 0x를 써 주면 됨니다.
예를 들어 0x1A는 16진수 1A가 되고, -0x15는 16진수 -15가 되는 것 입니다.
16진수는 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 이렇게 16개를 사용해 수를 표현합니다.
다음으로 문자를 나타내는 실재값이 있습니다.
문자를 나타낼 때는 반드시 문자를 ''로 묶어야 합니다.
""로 묶으면 문자열로 취급하기 때문에 반드시 ''로 묶어야 하죠. ''로 묶을때와 ""로 묶을때의 차이는 조금 후에 알아보기로 하고.. 문자 A를 나타낼 때는 'A' 이렇게 쓰면 됨니다.
더이상 설명이 필요 없죠? 이제 실재값에 대해서는 이해하셨을 겁니다.

(2) 기억 장소를 갖는 상수 다음은 기억 장소를 갖는 상수 인데, 이것은 변수와 똑같으나 값을 변경하지 못하는 것 입니다.
이것도 변수처럼 선언해야 사용할수 있는데, 선언하는건 변수 선언과 똑같지만 앞에 const키워드를 써야 하고 반드시 초기값이 있어야 한다는 것이 다름니다.
예를 들어.. 100이란 정수 값을 같는 a라는 이름의 상수는 const int a=100; 이렇게 선언합니다.
사용법도 변수와 똑같으나 안에 있는 값을 변경할수 없다는 것이 다름니다.
이해가 되셨죠?

4. 문자열
C언어 에는 문자열에 관한 데이터 형태가 없기 때문에 문자열을 처리하기 위해서는 특별한 방법을 사용해야 합니다.
그 방법 중에는 배열을 사용한 방법과 포인터를 사용한 방법이 있는데 포인터를 사용한 방법은 포인터를 모른상태에선 이해가 어려울 것 입니다.
그래서 여기서는 배열을 이용한 방법만을 배우기로 하고 포인터를 사용한 방법은 포인터를 배운 후에 배우겠습니다.

(1) 문자열 상수 (실재값).
상수 중에서도 실재값 표현을 대해 배워보겠습니다.
문자열 실재값은 아주 간단한데 그냥 ""로 문자열을 묶어 주기만 하면 됨니다.
예를 들자면 "String" 이런 식으로 정말 간단하죠? 그럼 이 상수가 내부적으로는 어떻게 처리될까요?
메모리 상에는 이런 식으로 들어갑니다.
주소 0x01 0x02 0x03 0x04 0x05 0x06 0x07
아스키 코드 0x53 0x74 0x72 0x69 0x6E 0x67 0x00
문자 S t r i n g (NULL) (주소는 임의로 정한 주소임)
이렇게 문자열은 6문자 인데 7바이트를 사용하게 되죠.
여기서 주소 0x01부터 0x06까지는 String의 각 문자에 해당하는 아스키 코드 값이 들어가 있습니다.
그리고 마지막 주소 0x07에는 0x00이 들어가 있는데 이렇게 아스키 0x00인 문자를 NULL문자라고 합니다.
C에서는 이 NULL문자를 사용해 문자열을 처리하는데 시작 주소부터 이 NULL문자가 나올때 까지를 문자열로 하는 것이죠.
즉 모든 문자열의 끝에는 NULL이 있다는 것 입니다.
물론 이 NULL문자는 컴파일러가 알아서 넣어 줌니다.
그리고 문자열의 길이는 이 NULL문자 전까지의 길이를 문자열의 길이로 하게 됨니다.
그럼 문자를 ''로 묶는 것과 ""로 묶는 것의 차이점은 다 아셨겠죠?
'A'와 "A"가 있다고 합니다.
''로 묶으면 그냥 하나의 문자로 처리하게 되고 단지 1바이트가 되는 것이죠.
하지만 ""로 묶으면 문자열로 처리하게 되고 뒤에 NULL문자가 붙으므로 1바이트가 아닌 2바이트가 됨니다.

(2) 문자열 변수
C에서는 변수에서 문자열 형태가 없으므로 문자 배열을 사용하면 문자열 처리가 가능합니다.
배열은 아직 배우지 않았는데 자세히는 나중에 배우고 배열에 대해 간단히 알아보죠.
배열은 어떤 같은 형태의 데이터를 쭉 연결해서 늘어 놓은 구조라고 생각하시면 됨니다.
그러면 배열 선언 방법을 알아보죠.
아주 간단한데.. 데이터형태 배열이름[배열크기]; 이렇게 선언합니다.
데이터형태는 배열의 데이터형태 이고, 배열이름은 그 배열을 상징하는 심볼 배열크기는 그 배열의 크기 즉 몇개의 데이터를 늘어 놓을지 쓰는 것 입니다.
사용할때에는
배열이름[첨자]=값; 변수=배열이름[첨자];
이런 식으로 사용합니다.
여기서 첨자는 배열에서 늘어놓은 데이터중 몇번째것을 사용할 것인지를 정하는 것 입니다.
이때 첨자는 0부터 시작해야 하므로 첫번째 것을 지정하기 위해선 0을 써 주어야 합니다.
그럼 이제 진짜로 문자배열을 사용한 문자열 처리법을 알아보죠.
문자열을 저장할 문자배열을 선언하는 방법은
char 배열이름[문자열길이]=초기값;
이렇게 알아두면 됨니다.
여기서 문자열 길이는 실재 길이보다 1이 더 크게 써야 합니다.
이유는 문자열 뒤에는 꼭 NULL문자가 더 붙기 때문이죠.
그럼 이렇게 선언되었으면 이 변수 안에 문자열을 넣는 방법을 알아야 겠죠??
char str[10];
이런 문자 배열이 있다고 합시다.
그럼
str="String";
이렇게 하면 될까요??
절대로 이렇게 할수는 없습니다.
이유는 아까 배열을 사용할때는
배열이름[첨자]=값;
변수=배열이름[첨자];
이렇게 사용해야 한다고 배웠기 때문이죠.
그런데 위에는 첨자를 주지 않았습니다.
그럼 어떻게 해야 할까요?? 바로..
str[0]='S';
str[1]='t';
str[2]='r';
str[3]='i';
str[4]='n';
str[5]='g';
str[6]=NULL;
이렇게 하면 되겠죠...퍽퍽~(사람들에게 맞는 소리)...으악..! 이 방법이 좀 복잡하다구요??????
만약 문자열의 길이가.. 100문자라면....윽....정말 큰일이군요..
그래서 제공하는 함수가 있는데 string.h에 정의되어 있는 strcpy라는 함수 입니다.
이 함수를 쓰면 문자배열에 간단히 문자열을 넣을수 있죠 사용법은 strcpy(문자배열이름,문자열);
이런 식으로 씀니다.
예를 들어 아까 그것은
strcpy(str,"String");
이렇게 간단히 할수 있습니다.
이제 잘 아시겠죠?

(3) 문자열 상수 (기억 장소를 갖는 상수)
문자열 상수 중 기억장소를 갖는 문자열 상수에 대해 알아보죠.
문자열 상수도 다른 상수처럼 선언하는 문장 앞에 const만 붙여 주고 초기값을 주면 됨니다.
예를 들어..
const char str[10]="String";
이렇게 하면 되죠.
그런데 이때 문자열의 크기는 생략해도 됨니다. 생략하면 컴파일러가 알아서 지정해 줌니다.
예를 들어..
const char str[]="String";
이렇게 하면 String의 길이인 6에 1을 더해 7로 자동으로 지정해 줌니다.
이것으로 문자열 설명을 마치고 예제 하나를 보며 분석해 보죠.
/* 파일 이름 : C3-1.C 프로그램 내용 : 문자열 처리 프로그램. */
#include
#include void main()
{ char str[10];
strcpy(str,"String");
printf("%s\n",str);
str[1]='A'; printf("%s\n",str); }
이 프로그램을 분석해볼까요?
우선 입출력 함수인 printf와 문자열 복사 함수인 strcpy를 썼으므로 stdio.h와 string.h를 포함시켰습니다. 그리고 main함수가 있고 내용을 보면 처음엔 str이라는 문자배열을 선언한 것이죠.
그리고
strcpy(str,"String");
이건 str에 "String"를 넣은 것이고요.
printf("%s\n",str);
이건 str에 들어있는 문자열을 출력한 것 입니다.
str[1]='A';
이건 str배열 중 2번째 문자를 'A'로 바꾼 것이죠 왜 두번째 문자냐구요??
첨자의 시작은 0부터이니 1은 두번째 문자가 되죠.
그 다음에는 다시 출력한 것 입니다.
결과를 볼까요??
C:\>C3-1.EXE
String
SAring
C:\>

5. 특수 문자
이제 마지막으로 특수 문자에 대해 알아보죠.
특수 문자는 말 그대로 특별한 문자인데, 예를 들자면 ""안에서 "를 쓴다던지 할 때에 쓰입니다.
특수 문자는 모두 \(역슬래쉬)로 시작합니다.
그럼 특수 문자를 자세히 살펴보죠.
\a Beep음을 컴퓨터 스피커로 출력 \b Back space(한칸 뒤로 갑니다..)
\n 현재 위치한 줄의 다음 줄로 내려갑니다.
\r 현재 위치한 줄의 멘 처음으로 갑니다..
\t 수평 Tab
\v 수직 Tab
\\ \(역슬래쉬)
\' 작은 따옴표
\" 큰 따옴표
\0 NULL문자
\0?? 8진수 ??에 대한 문자
\x?? 16진수 ??에 대한 문자.
위에서 다 읽어보면 아실건데 \0??의 예를 들어보면..
\013은 아스키 코드 8진수 13에 해당하는 문자이고..
\x1F는 아스키 코드 16진수 1F에 해당하는 문자입니다..
마지막으로 한가지 예제 소소를 보도록 합시다..

/* 파일 이름 : C3-2.C 프로그램 내용 : 특수 문자 예제 프로그램. */
#include
void main() { printf("C Programming\n");
printf("C \bProgramming\n");
printf("C Program\nming\n");
printf("\"C Programming\"");
printf("C Program\tming\n");
printf("C Programming\a\n"); }

이 프로그램을 한번 잘 보시기 바랍니다 그리고 어떤 결과가 나올지 맞춰 보세요
이정도는 충분이 분석하실수 있겠죠?
C:\>C3-2.EXE
C Programming
C Programming
C Program ming
"C Programming"
C Program ming
C Programming('삐'소리 발생)
C:\>

결과는 이렇습니다
왜 그런지는 잘 분석해 보세요. 이번 강좌를 잘 보셨다면 충분히 이해가 되실 겁니다.
이것으로 이번 강좌를 마치겠습니다.
다음 강좌때는 전역 변수, 지역 변수등과 표준 입출력 함수를 배워 보죠.
반응형

'프로그래밍' 카테고리의 다른 글

8.c 언어강좌 (5)  (0) 2009.07.04
7.c 언어강좌 (4)  (0) 2009.07.04
5.c 언어강좌 (2)  (1) 2009.07.03
4.c 언어 강좌(초보프로그래머는 여길 먼저 공부하시길...)  (0) 2009.07.03
3.게임프로그래머 요구조건  (0) 2009.07.03