자료형(data type)은 칸에 담을 값의 종류와 칸의 크기를 정하고, 형 변환(type conversion)은 값을 다른 자료형으로 바꾸는 일입니다. 같은 7 나누기 2라도 정수끼리면 3, 한쪽이 실수면 3.5가 되어 출력이 달라지므로, 코드를 읽을 때는 자료형부터 보고 셈해야 합니다. 아래 그림은 char·int·double 칸에 나눗셈과 글자 계산의 결과가 드는 모습입니다.
1기본 자료형과 크기
| 자료형 | 담는 값 | 크기 |
|---|---|---|
| char | 글자 하나 | 1바이트 |
| int | 정수 | 4바이트 |
| float | 실수 | 4바이트 |
| double | 실수(float보다 정밀) | 8바이트 |
크기는 sizeof(int)처럼 sizeof 연산자로 잽니다.
char가 1바이트인 것은 C가 정해 두었고, int 4·double 8바이트는 지금 컴퓨터들이 쓰는 크기라 시험도 이 값으로 셈합니다. long은 컴퓨터마다 4바이트나 8바이트로 갈립니다.
2정수 나눗셈과 나머지
그림의 코드입니다.
#include <stdio.h>
int main(void) {
char c = 'A';
int n = 7 / 2;
double d = 7.0 / 2;
c = c + 1;
printf("%d %.1f\n", n, d);
printf("%c %d\n", c, c);
return 0;
}
3 3.5
B 66- 정수끼리 나누면 몫만 남고 소수 부분은 버립니다. 7 / 2는 3입니다.
- 음수도 0 쪽으로 버려 −7 / 2는 −3입니다. 나머지의 부호는 왼쪽 수를 따라 −7 % 2는 −1입니다.
- 한쪽이라도 실수면 실수 나눗셈이라 7.0 / 2는 3.5입니다.
%.1f는 실수를 소수 첫째 자리까지 찍습니다. - 나머지
%는 정수에만 씁니다. 실수에 쓰면 컴파일 오류입니다. 컴파일(compile)은 코드를 실행 파일로 번역하는 일이라, 이 오류가 나면 실행되지 않습니다. - 대입은 오른쪽 계산이 끝난 뒤에 합니다. 정수끼리 셈한 몫은 실수 칸에 넣어도 소수 부분이 돌아오지 않습니다.
3형 변환과 문자
| 갈래 | 언제 일어나나 | 예 → 결과 |
|---|---|---|
| 자동 형 변환(묵시적 형 변환) | 정수와 실수가 섞인 식, 다른 자료형 칸에 넣을 때 | 7.0 / 2 → 3.5 · int 칸에 3.9를 넣으면 3 |
| 캐스팅(casting) — 명시적 형 변환 | 값 앞 괄호에 자료형을 적었을 때 | (double)7 / 2 → 3.5 · (int)3.9 → 3 |
실수를 정수로 바꾸면 반올림하지 않고 소수 부분을 버립니다. 캐스팅은 바로 뒤 값 하나에만 걸립니다. 괄호로 묶은 식에 걸면 식을 다 셈한 뒤에 바꿉니다.
char 칸에는 글자의 번호가 듭니다. 번호는 아스키 코드(ASCII, American Standard Code for Information Interchange)를 따라 'A'는 65, 'a'는 97, '0'은 48입니다.
그래서 글자도 정수처럼 셈합니다. 'A' + 1은 66이고 %c로 찍으면 B입니다. 'a' - 'A'는 32, '7' - '0'은 7입니다.
예제
계산의 자료형과 담는 칸의 자료형이 다르고, 캐스팅의 자리가 셋으로 갈립니다. 무엇이 찍힐까요?
#include <stdio.h>
int main(void) {
int a = 7;
int b = 2;
double x = a / b;
double y = (double)a / b;
double z = (double)(a / b);
printf("%.1f %.1f\n", x, y);
printf("%.1f %d\n", z, a % b);
return 0;
}
실행 결과 보기
3.0 3.5
3.0 16번 줄은 정수끼리 셈한 몫 3을 실수 칸에 넣어 3.0입니다. 7번 줄은 a를 먼저 실수로 바꿔 실수 나눗셈이 되어 3.5이고, 8번 줄은 몫 3을 셈한 뒤에 바꿔 3.0입니다.
같은 코드를 Java·Python으로
| C | Java | Python | |
|---|---|---|---|
| char 크기 | 1바이트 | 2바이트 | 글자 자료형이 없음(길이 1인 문자열) |
| long 크기 | 4 또는 8바이트 | 8바이트 | 정수 크기에 한계가 없음 |
7 / 2 | 3 | 3 | 3.5(몫은 7 // 2 → 3) |
| 음수의 몫 | -7 / 2 → −3 | -7 / 2 → −3 | -7 // 2 → −4(내림) |
'A' + 1 | 66 | 66 | 오류 — ord('A') + 1이 66 |
| 정수로 바꾸기 | (int)3.9 → 3 | (int)3.9 → 3 | int(3.9) → 3 |
시험 포인트
- 필기: 자료형의 크기를 묻습니다 — C의 char 1·int 4·float 4·double 8바이트, Java의 char 2·long 8바이트. 정수끼리 나누면 몫만 남고,
%는 정수의 나머지입니다. 정수와 실수가 섞이면 실수로 자동 형 변환되고, 실수를 정수로 바꾸면 소수 부분을 버립니다. 'A' 65·'a' 97·'0' 48입니다. - 실기: 결과를 그대로 씁니다 — 정수 나눗셈을 실수 칸에 넣은 값, 캐스팅 괄호의 자리, 같은 칸을
%c와%d로 찍은 글자와 수. 이름으로는 캐스팅(Casting)과 아스키 코드(ASCII, American Standard Code for Information Interchange)를 씁니다.
확인 문제
1. C와 Java에서 크기가 다른 자료형을 고르세요.
- ① int
- ② char
- ③ double
- ④ float
정답
②입니다. char는 C에서 1바이트, Java에서 2바이트입니다.
- ① int는 둘 다 4바이트입니다.
- ③ double은 둘 다 8바이트입니다.
- ④ float은 둘 다 4바이트입니다.
2. 위 예제에서 5번 줄만 int b = -2;로 바꿨습니다. 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답:
-3.0 -3.5
-3.0 1
7 / −2의 몫은 0 쪽으로 버려 −3이고, 나머지 7 % −2는 왼쪽 수 7의 부호를 따라 1입니다.
- 틀리는 꼴
-4.0: 몫을 아래로 내렸습니다. C는 0 쪽으로 버립니다 — 내림은 Python의//입니다. - 틀리는 꼴 나머지
-1: 나머지의 부호가 나누는 수를 따른다고 봤습니다. C는 왼쪽 수를 따릅니다.
3. 다음 코드의 추적 표 (가)~(다)를 채운 뒤, 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
#include <stdio.h>
int main(void) {
char c = 'C';
int n = c - 'A';
int m = 17 % 5;
double r = 17 / 5;
printf("%d %d\n", n, m);
printf("%.1f %c\n", r, c + m);
return 0;
}
| 줄 | 칸 | 들어가는 값 |
|---|---|---|
| 4 | c | 'C'(번호 67) |
| 5 | n | (가) |
| 6 | m | (나) |
| 7 | r | (다) |
정답
(가) 2 · (나) 2 · (다) 3.0
받는 답:
2 2
3.0 En은 67 − 65 = 2, m은 17을 5로 나눈 나머지 2입니다. r은 정수끼리 셈한 몫 3을 실수 칸에 넣어 3.0입니다. c + m은 69라서 %c로 E가 찍힙니다.
- 틀리는 꼴 (다)에 3.4: 실수 칸에 넣으니 실수로 셈한다고 봤습니다. 17과 5가 모두 정수라 몫부터 셈합니다.
- 틀리는 꼴 둘째 줄 끝
69:%c는 번호가 아니라 그 번호의 글자를 찍습니다.
4. 다음 코드의 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
#include <stdio.h>
int main(void) {
int t = 11;
int k = 4;
double avg = (t + k) / 2;
int g = 'a' + t % k;
int h = (int)2.9 + t / k;
printf("%d", h);
printf(" %.1f\n%c\n", avg, g);
return 0;
}
정답
받는 답:
4 7.0
d(int)2.9는 소수를 버려 2이고 t / k는 2라 h는 4입니다. avg는 15 / 2의 몫 7이 실수 칸에 들어 7.0입니다. %는 +보다 먼저 셈합니다(다음 레슨). t % k는 3이라 g는 'a'의 97에 3을 더한 100, 글자 d입니다. 9번 줄 끝에 \n이 없어 4와 7.0이 한 줄에 찍힙니다.
- 틀리는 꼴
7.5: 괄호 안 합 15를 2로 나눌 때 실수로 셈했습니다. 15와 2가 모두 정수입니다. - 틀리는 꼴 첫 줄
5 7.0: (int)2.9를 3으로 반올림했습니다. 소수 부분은 버립니다.
5. 다음 (가)·(나)의 이름을 쓰세요. (가)는 한글 이름과 영문으로, (나)는 영문 약어로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가)
(double)a처럼 값 앞 괄호에 자료형을 적어 그 값의 자료형을 바꾸는 일입니다. - (나) 'A'를 65, '0'을 48로 나타내듯, 영문자·숫자·기호에 번호를 하나씩 매긴 번호 체계입니다.
정답
받는 답: (가) 캐스팅(Casting) 또는 명시적 형 변환 · (나) ASCII
(가)의 실마리는 '코드에 괄호로 적어서 바꾼다'이고, (나)는 'A 65'처럼 글자마다 매긴 번호입니다.
- 틀리는 꼴 자동 형 변환 — (가)에: 정수와 실수가 섞인 식에서 저절로 일어나는 변환입니다. 괄호에 적어 바꾸는 것은 캐스팅입니다.
- 같은 이름의 다른 꼴: (나) '아스키 코드' — 한글 이름이라 약어를 묻는 이 문제에서는 받지 않습니다.
처음이라면: C 언어 과목(준비 중)의 '자료형과 칸의 크기 · const' 레슨에서 같은 규칙을 처음부터 천천히 봅니다.