자바에 존재하는 원시타입들과 바이트 크기는 다음과 같습니다.
종류 | 데이터형 | 크기 (바이트) |
---|---|---|
논리형 | boolean | 1 |
문자형 | char | 2 |
정수형 | byte | 1 |
정수형 | short | 2 |
정수형 | int | 4 |
정수형 | long | 8 |
실수형 | float | 4 |
실수형 | double | 8 |
우선 자바에는 두가지의 데이터 타입이 존재합니다.
원시 타입은 실제 데이터 값을 저장하는 타입입니다.
ex ) int
, boolean
, char
…
참조 타입은 기본 타입을 제외한 타입으로, 객체의 주소를 저장하는 타입입니다.
ex ) 문자열
, 배열
, 열거형 상수
, 클래스
, 인터페이스
…
자바에서 객체는 힙 영역에 저장되는데, 참조 타입 변수는 이러한 실제 객체의 주소를 스택 영역에 저장합니다.
그리고 이러한 객체들을 사용할 때 마다 참조 타입 변수에 저장된 객체의 주소를 불러와 사용하게 됩니다.
( 자바의 메모리 구조 - 참고 )
boolean
true
/ false
true
/ false
두가지 밖에 없지만 자바가 데이터를 다루는 최소 범위가 1 Byte 이기 때문에 낭비적이지만 1 Byte를 사용한다.char
유니코드
를 사용한다.유니코드
란 ?아스키코드
와 유니코드
를 사용한다.아스키(ASCII) 코드
유니코드 (Unicode)
unsigned
형태다.unsigned
: 음수 없이 0부터 시작하여 양수 값만 가지는 데이터 형태
2 Byte
= 16진수 0x00
= **0**000 0000 0000 0000
→ 원래는 여기서 맨 앞 1 Bit를 가지고 음수나 양수를 표현한다.
하지만 char
형은 unsigned
형식이기 때문에 맨 앞 비트를 음수 양수 형식 으로 사용하지 않는다.
short
형이 1111 1111 1111 1111 의 Bit를 가지고 있을 때, 10진수의 값 → -1
char
형이 1111 1111 1111 1111 의 Bit를 가지고 있을 때, 10진수의 값 → 65535
char a = 'A';
char b = 'B';
if (a > b)
가 가능한 이유 : char
형은 유니코드 정수형태로 저장되어 char a = 'A'
일 때, a
변수에 'A'
의 정수 값인 65가 들어가기 때문이다.byte
, short
, int
, long
JVM의 피연산자 스택이 피연산자를 4 Byte 단위로 저장한다.
따라서 int
보다 작은 자료형의 값을 계산시, int
형으로 형변환 되서 연산이 수행된다.
정수형 데이터 타입은 **int
형 데이터 타입이 기본 데이터 타입이다.
정수형 데이터를 사용하게 되면 JVM에서 기본적으로 int
형 데이터타입의 데이터로 인식한다.
따라서 int
형 데이터 타입의 범위를 넘어서는 long
데이터 타입의 정수를 사용하고자 하는 경우에는 정수 데이터 맨 뒤 쪽에, 접미사 'l'
이나 'L'
을 붙여줘야한다.
Long val = 123456789000;
이런식으로 뒤에 ‘L’
을 붙여줘야한다.Long val = 123456789000**L**;
정수형 데이터들의 표현할 수 있는 범위는 다음과 같다.
byte
( 1 바이트, 8 비트 ) short
(2 바이트, 16 비트 )int
( 4 바이트, 32 비트 )long
( 8 바이트, 64 비트 )float
, double
**double
형 데이터타입이 기본 데이터 타입**이다.과거에는 실수를 표현할 때 float
형을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double
형을 가장 많이 사용한다.
따라서 실수형의 기본 데이터 타입이 double
형 이기 때문에 float
형 데이터를 사용하고자 하는 경우에도 아까 long
형 처럼 실수 데이터 맨 뒤 쪽에 접미사 'f'
나 'F'
를 붙여줘야한다.
float를 사용하고자 한다면, 아래와 같이 사용
float val = 0.123456**F**;
float
형 데이터 타입보다 double
형 데이터 타입이 두배정도 더 정밀한 데이터를 표현할 수 있다.int i = null; // 불가능 (원시 타입)
Integer integer = null; // 가능 (참조 타입)
List<int> i; // 불가능 (원시 타입)
List<Integer> integer; // 가능 (참조 타입)
참고 자료
원시타입, 참조타입(Primitive Type, Reference Type)
[Java] 메모리 구조 메소드(Method), 스택(Stack), 힙(Heap) 영역에 대하여
[Java] 원시 타입 vs 참조 타입
Java - 문자 자료형과 아스키코드, 유니코드(UTF-8, UTF-16)
[JAVA] 3. 기본형 데이터타입의 저장 가능 범위
코딩교육 티씨피스쿨
[Java] float과 double의 차이는 무엇일까?
원시타입이 있는 이유