자료형
IT 위키
더 많은 작업
- 상위 문서: 정보처리기사/프로그래밍 언어 활용
- Data Type
- 변수나 값이 가질 수 있는 데이터의 종류와 크기, 허용되는 연산을 정한 것
| 분류 | C | Java | Python |
|---|---|---|---|
| 문자 | char 1바이트 | char 2바이트(UTF-16 코드 단위) | str (문자 자료형 없음) |
| 정수 | short 2, int 4, long 4 또는 8, long long 8 | byte 1, short 2, int 4, long 8 | int (크기 제한 없음) |
| 실수 | float 4, double 8 | float 4, double 8 | float (배정밀도 8바이트) |
| 논리 | _Bool (C99, 0/1) | boolean (true/false) | bool (True/False) |
- 크기 단위는 바이트이다.
- C의 크기는 구현(플랫폼)에 따라 다르다. 표준은 최소 범위만 정한다(char ≥ 8비트, int ≥ 16비트, long ≥ 32비트). 64비트 Windows(LLP64)는 long이 4바이트, 64비트 리눅스(LP64)는 long이 8바이트이다. 일반적인 환경에서 int는 4바이트이다.
- Java의 크기는 언어 명세로 고정되어 플랫폼과 무관하다. boolean의 크기는 명세에 정해져 있지 않다.
- Java의 문자열 String, Python의 str은 기본 자료형이 아닌 객체이다.
- 관련 문서: C 언어 자료형, 파이썬 변수형
- 묵시적(자동) 형 변환: 작은 범위의 자료형이 큰 범위로 자동 변환된다. 예: int와 double을 연산하면 int가 double로 변환된다.
- 명시적(강제) 형 변환: 캐스트 연산자로 직접 변환한다. 실수 → 정수 변환 시 소수점 이하는 버려진다(0 방향).
- Java는 큰 자료형을 작은 자료형에 대입하려면 명시적 변환이 필요하며, 없으면 컴파일 오류가 난다.
System.out.println(10 / 4 + " " + 10 / 4.0); // 2 2.5
System.out.println((int) 3.99); // 3
System.out.println((byte) 130); // -126
char ch = 'A';
System.out.println(ch + 1); // 66
System.out.println((char) (ch + 1)); // B
print(int("3") + 1, str(3) + "1") # 4 31
print(int(3.99), int(-3.99)) # 3 -3
- 자료형이 표현할 수 있는 범위를 넘으면 값이 반대쪽 끝으로 돌아간다(2의 보수 표현 기준).
- Java의 int 범위는 -2,147,483,648 ~ 2,147,483,647이며, 최댓값에 1을 더하면 최솟값이 된다.
- C에서 부호 없는 정수(unsigned)의 오버플로는 모듈러 연산으로 정의되지만, 부호 있는 정수의 오버플로는 정의되지 않은 동작(undefined behavior)이다.
- Python의 int는 임의 정밀도이므로 오버플로가 발생하지 않는다.
int max = Integer.MAX_VALUE;
System.out.println(max + 1); // -2147483648
long big = 3000000000L;
System.out.println((int) big); // -1294967296
unsigned char u = 255;
u++;
printf("%d\n", u); /* 0 */
- 오버플로는 보안약점이 될 수 있다. 관련 문서: 시큐어 코딩
- Java 기본 자료형 8가지와 크기(byte 1, short 2, int 4, long 8, float 4, double 8, char 2, boolean)를 외운다.
- C의 long 크기는 플랫폼에 따라 4 또는 8바이트이다.
- 정수 나눗셈과 강제 형 변환(소수점 버림), byte 캐스팅 결과를 계산하는 문제가 자주 나온다.