3.변수
변수 - 말뜻 그대로 변할 수 있는 수. 즉 고정되어 있지 않은 수라는 뜻이며 1이나 3.14같은 상수의
반대 개념이다. 이름은 변수이지만 반드시 수치 값만 저장되는 것은 아니며 문자나 포인터 같은
좀 더 복잡한 값도 저장될 수 있다.
컴퓨터의 기억공간에는 번지(Address)라는 개념을 사용하여 위치를 구분하며 사용한다. 그런데 번지라는 것은 사람의 입장에서 보면 굉장히 다루기 힘든 형태로 되어 있다. 게다가 16진수로 표현하기때문에 더욱 그렇다. 그래서 번지를 직접 사용하는 대신 좀 더 기억하기 쉬운 변수를 사용한다. 번지에 별도의 이름을 붙여 놓은 것이 변수이다.
1. 의미를 잘 설명할 수 있는 이름을 주는 것이 좋다.
2. 변수명의 길이에는 제약이 없지만 3~10자 내외로 작성하는 것이 좋다.
3. 대소문자 구성을 일관되게 하는 것이 좋다. C언어에서는 대소문자를 구분하므로 철자가 같더라도
대소문자를 다르게 썻다면 다른 변수명이 된다.
- 변수의 종류
구분 |
타입 |
설명 |
기본형 |
정수형 |
정수 |
문자형 |
문자 | |
실수형 |
실수 | |
열거형 |
가능한 값들에 대한 나열형 | |
void형 |
타입이 정해지지 않은 자료형 | |
유도형 |
배열 |
같은 타입의 자료 집합 |
구조체 |
다른 타입의 자료 집합 | |
공용체 |
메모리를 공유하는 자료 집합 | |
포인터 |
대상체의 번지를 가리키는 타입 | |
함수형 |
함수의 번지를 가리키는 타입 |
타입 변수명[=초기값][,변수명, 변수명...];
변수를 사용하려면 먼저 선언을 해야한다. 선언이란 컴파일러에게 앞으로 이런 이름을 가진 어떤 타입의 변수를 사용하겠으니 준비해 달라고 부탁하는 것이다. 기본 형식에서 [] 괄호 안에 있는 것은 생략가능 하다는 뜻이며 ... 표기는 임의 개수만큼 반복될 수 있다는 뜻이다. 반드시 필요한 것은 타입과 변수명, 그리고 제일 끝에 있는 세미콜론(;)밖에 없다
printf
printf는 C의 표준 출력 함수이다. printf의 제일 뒤에 있는 f는 Formatting의 약자이며 서식화된 출력을 한다는 뜻이다.
printf("서식문자열"[, 인수, 인수, ...]);
서식 문자열을 화면으로 출력하되 문자열 내에 %로 시작되는 서식이 있으면 이 서식과 대응되는 뒤쪽의 인수를 문자열 안에 넣어 같이 출력한다. 서식 문자열 안에는 %d, %c 등의 서식이 포함되어 있으며 이 서식과 대응되는 인수의 값이 서식대신 출력된다.
서식은 %다음에 알파벳 문자 하나로 표기하며 다음과 같은 종류가 있다.
서식 |
의미 |
설명 |
%d 또는 %i |
Decimal, Integer |
10진 정수로 출력한다. |
%o |
Octal |
8진 정수로 출력한다. |
%x 또는 %X |
hexadecimal |
16진 정수로 출력한다. 대문자 X를 쓰면 a~f도 대문자로 출력된다. |
%u |
unsigned |
부호 없는 10진 정수로 출력한다. |
%c |
character |
1개의 문자를 출력한다. |
%s |
string |
문자열을 출력한다. |
%f |
float |
고정 소수점 형식의 실수로 출력한다. |
%e 또는 %E |
|
부동 소수점 형식의 실수로 출력한다. |
%g 또는 %G |
|
%e, %f중 더 짧은 형식으로 출력한다. |
%p |
pointer |
포인터의 번지값을 출력한다. |
%n |
|
출력된 문자 개수를 포인터 변수에 대입한다. |
%% |
|
%문자 자체를 출력한다. |
scanf
사용자로부터 정보를 입력받는 기본 함수이다.
scanf("서식문자열", &변수[, 변수, ...]);
printf와는 달리 서식 문자열에는 오로지 서식만 들어갈 수 있으며 서식 이 외의 문자열은 넣어봐야 무시된다.
puts("문자열")
문자열만 출력할 때 사용한다. 서식을 다루지 않기 때문에 printf보다 훨씬 더 간편하며 속도도 빠르다는 장점이 있다. puts의 경우 출력후 항상 개행을 한다.
gets(변수)
gets 함수는 문자열을 입력받아 인수로 주어진 변수에 저장하는데 서식문자열을 사용해 입력을 받는 scanf에 비해 gets는 개행 코드 이전의 모든 문자를 입력받는 다는 점이 다르다.
putch(문자)
문자 하남나 출력하는 함수이다. printf함수보다 훨씬 더 간편하게 사용 할 수 있다.
getch()
getch함수는 문자 하나만 입력받는다. scanf는 값을 입력한 후에 반드시 Enter키를 눌러야하는데 getch는 키를 누르는 즉시 눌러진 문자를 입력받는다.
kbhit()
키보드의 키가 눌려져 있는지 아닌지만을 조사한다. 눌러졌으면 참의 값을 리턴하고 그렇지 않은 경우 거짓의 값을 리턴한다.
정수형
정수(Integer)란 부호는 있지만 소수점 이하를 표현하지 못하는 수이다. 0, -23, 156 이런 값들이며 소수점 이하가 있는 1.28, 25.4 는 정수가 아니다. 정수형이란 이런 정수 값을 저장할수 있는 타입이다. 정수형 변수의 타입 이름은 Integer의 앞 세 자를 딴 int이다.
int i;
i = 10;
선언문은 위와 같이 키워드 int 다음에 변수의 이름 그리고 세미콜론으로 구성되어 있다. 컴파일러는 이 선언문을 만나면 정수 값을 저장할 4바이트의 공간을 운영체제로 부터 할당받고 이 공간에 i라는 이름을 붙여줄 것이다.
비트의 구성으로 수를 표현하게 되는데 가장 왼쪽의 비트(MSB)를 부호 비트로 사용하며 이 비트가 0이면 양수 1이면 음수가 된다. MSB를 부호비트로 사용하면 기억하는 비트 하나가 줄어들게 되므로 표현할 수 있는 최대 값은 절반으로 줄어드는 대신 음의 값을 표현할 수 있다.
- 정수형 타입
타입 |
크기 |
부호 |
범위 |
int |
4(바이트) |
있음 |
-2147483648 ~ 2147483647 |
short int | 2 |
있음 |
-32768 ~ 32767 |
long int |
4 |
있음 |
-2147483648 ~ 2147483647 |
unsigned int |
4 |
없음 |
0 ~ 4294967295 |
unsigned short int |
2 |
없음 |
0 ~ 65535 |
부호에 대한 수식어가 생략되면 signed가 적용되어 부호가 있는 것으로 선언된다.
오버플로우(Overflow)
변수의 저장 용량을 넘어서는 현상을 오버플로우(Overflow)라고 한다.
(int형의 경우 2147483647에서 1이 더 커지게 되면 -2147483648이 된다.)
실수형
실수(Real Number)란 소수점 이하를 가지는 수이며 정수보다는 한 단계 더 확장된 범위를 포괄한다. 3.14나 57.4 같이 정수부 다음에 소수점과 소수 이하의 소수부가 있다.
- 실수형 타입
타입 |
크기 |
범위 |
유효자리수(십진수) |
float |
4(바이트) |
3.14*10^-38 ~ 3.4*10^38 |
7 |
double |
8 |
1.7*10^-308 ~ 1.7*10&308 |
15 |
long double |
10 ~ 16 |
1.2*10^-4932 ~ 3.4*10^4932 |
19 |
문자형
문자형이란 문자 하나를 표현하는 자료형이다. 컴퓨터는 원래 숫자밖에 모르기 때문에 문자도 숫자로 기억한다. 이때 어떤 숫자와 어떤 문자를 대응시키는가에 따라 여러가지 인코딩 방식이 있는데 통상 아스키(ASCII) 코드 방식을 많이 사용한다. 문자형 상수는 'A'와 같이 ''로 문자 하나를 감싸주면 된다.
char ch;
ch = 'A';
- 아스키(ASCII) 코드 표
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
0 |
0 |
NULL |
47 |
2F |
/ |
68 |
44 |
D |
89 |
59 |
Y |
110 |
6E |
n |
7 |
7 |
Bell |
48 |
30 |
0 |
69 |
45 |
E |
90 |
5A |
Z |
111 |
6F |
o |
8 |
8 |
BS |
49 |
31 |
1 |
70 |
46 |
F |
91 |
5B |
[ |
112 |
70 |
p |
9 |
9 |
Tab |
50 |
32 |
2 |
71 |
47 |
G |
92 |
5C |
\ |
113 |
71 |
q |
10 |
A |
LF |
51 |
33 |
3 |
72 |
48 |
H |
93 |
5D |
] |
114 |
72 |
r |
13 |
D |
CR |
52 |
34 |
4 |
73 |
49 |
I |
94 |
5E |
^ |
115 |
73 |
s |
32 |
20 |
공백 |
53 |
35 |
5 |
74 |
4A |
J |
95 |
5F |
_ |
116 |
74 |
t |
33 |
21 |
! |
54 |
36 |
6 |
75 |
4B |
K |
96 |
60 |
` |
117 |
75 |
u |
34 |
22 |
" |
55 |
37 |
7 |
76 |
4C |
L |
97 |
61 |
a |
118 |
76 |
v |
35 |
23 |
# |
56 |
38 |
8 |
77 |
4D |
M |
98 |
62 |
b |
119 |
77 |
w |
36 |
24 |
$ |
57 |
39 |
9 |
78 |
4E |
N |
99 |
63 |
c |
120 |
78 |
x |
37 |
25 |
% |
58 |
3A |
: |
79 |
4F |
O |
100 |
64 |
d |
121 |
79 |
y |
38 |
26 |
& |
59 |
3B |
; |
80 |
50 |
P |
101 |
65 |
e |
122 |
7A |
z |
39 |
27 |
' |
60 |
3C |
< |
81 |
51 |
Q |
102 |
66 |
f |
123 |
7B |
{ |
40 |
28 |
( |
61 |
3D |
= |
82 |
52 |
R |
103 |
67 |
g |
124 |
7C |
| |
41 |
29 |
) |
62 |
3E |
> |
83 |
53 |
S |
104 |
68 |
h |
125 |
7D |
} |
42 |
2A |
* |
63 |
3F |
? |
84 |
54 |
T |
105 |
69 |
i |
126 |
7E |
~ |
43 |
2B |
+ |
64 |
40 |
@ |
85 |
55 |
U |
106 |
6A |
j |
127 |
7F |
Del |
44 |
2C |
, |
65 |
41 |
A |
86 |
56 |
V |
107 |
6B |
k |
|
|
|
45 |
2D |
- |
66 |
42 |
B |
87 |
57 |
W |
108 |
6C |
l |
|
|
|
46 |
2E |
. |
67 |
43 |
C |
88 |
58 |
X |
109 |
6D |
m |
|
|
|
- 문자형 타입
타입 |
크기 |
부호 |
범위 |
signed char |
1(바이트) |
있음 |
-128 ~ 127 |
unsigned char |
1 |
없음 |
0 ~ 255 |
확장열
키보드로 직접 입력할 수 없는 문자들은 좀 특수한 방법으로 표현하는데 이를 확장열(Escape Sequence)라고 한다. 확장열은 \(\) 문자 다음에 기호 하나를 써서 표현한다.
확장열 |
코드 |
설명 |
\a |
0x07 |
벨 소리 |
\b | 0x08 | 백 스페이스 |
\t | 0x09 |
탭 |
\n |
0x0a | 개행 |
\x## |
0x## |
16진 코드 |
\### | 0### | 8진 코드 |
\\ | 0x5c | 백슬레쉬 |
\' | 0x27 | 홑따옴표 |
\" | 0x22 | 겹따옴표 |
\? |
0x3f |
물음표 |
확장열을 쓰는 이유는 꼭 키보드로 표현하지 못해서뿐만 아니라 환경에 따라 달라질 수 있는 코드를 논리적으로 표현하기 위해서이다. 개행을 하는 방식은 시스템마다 다른데 윈도우즈에서는 CR, LF의 조합으로, 유닉스는 LF만으로, 매킨토시는 CR만으로 개행 문자를 표현한다. C는 이런 방식에 상관없이 개행을 표현할 수 있는 확장열을 제공하고 프로그래머는 개행이 필요할 때 \n이라고만 적으면 된다.
문자열
문자열은 일련의 문자가 연속되어 있는 것이며 문자의 집합이 곧 문자열이다. 문자열 상수는 문자 상수와 달리 ""로 감싸서 표현한다.("Korea") 문자열의 끝에는 문자열의 끝임을 알리는 널 종료 문자가 들어간다. 메모리는 연속적인 공간이기 때문에 그 끝을 명확히 표시해야한다.
3중 문자
3중 문자(Trigraph)란 세개의 연속된 문자를 하나의 문자로 대체하는 표현이다. 유럽의 몇 개 국가들은 영어에 없는 자신의 고유한 글자(움트라움 등)를 표현하기 위해 이 문자 코드에 다른 문자를 할당해서 사용하고 있으며 그러다 보니 ASCII표에 있는 9개의 문자들이 없을 수도 있다. 이런 이유로 3중 문자를 정의하고 있다.
3중 문자 |
대체 문자 |
3중 문자 |
대체 문자 |
??= | # | ??/ | \ |
??' | ^ | ??! |
| |
??( | [ | ??) | ] |
??< | { | ??< | } |
??- | ~ |
- 출처 : 혼자 연구하는 C/C++