본문으로 건너뛰기

자료형과 형 변환

정보처리기사 목차프로그래밍 기초레슨 125 / 233

목차

자료형(data type)은 칸에 담을 값의 종류와 칸의 크기를 정하고, 형 변환(type conversion)은 값을 다른 자료형으로 바꾸는 일입니다. 같은 7 나누기 2라도 정수끼리면 3, 한쪽이 실수면 3.5가 되어 출력이 달라지므로, 코드를 읽을 때는 자료형부터 보고 셈해야 합니다. 아래 그림은 char·int·double 칸에 나눗셈과 글자 계산의 결과가 드는 모습입니다.

8단계 중 1단계. 4번 줄 — 자료형마다 칸의 크기가 다릅니다. char는 1바이트이고, 글자 A는 번호 65로 들어갑니다.

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 1

6번 줄은 정수끼리 셈한 몫 3을 실수 칸에 넣어 3.0입니다. 7번 줄은 a를 먼저 실수로 바꿔 실수 나눗셈이 되어 3.5이고, 8번 줄은 몫 3을 셈한 뒤에 바꿔 3.0입니다.

같은 코드를 Java·Python으로

CJavaPython
char 크기1바이트2바이트글자 자료형이 없음(길이 1인 문자열)
long 크기4 또는 8바이트8바이트정수 크기에 한계가 없음
7 / 2333.5(몫은 7 // 2 → 3)
음수의 몫-7 / 2 → −3-7 / 2 → −3-7 // 2 → −4(내림)
'A' + 16666오류 — ord('A') + 1이 66
정수로 바꾸기(int)3.9 → 3(int)3.9 → 3int(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;
}
줄칸들어가는 값
4c'C'(번호 67)
5n(가)
6m(나)
7r(다)
정답

(가) 2 · (나) 2 · (다) 3.0

받는 답:

실행 결과
2 2
3.0 E

n은 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' 레슨에서 같은 규칙을 처음부터 천천히 봅니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로