[CS] 자바의 원시타입 | 참조타입 | 원시타입, 참조타입 비교
기술면접
자바의 원시타입들은 무엇이 있으며 각각 몇 바이트를 차지하나요?
정수형
byte(1), short(2), int(4), long(8)
실수형
float(4), double(8)
문자형
char(2)
논리형
boolean(1)
참고
boolean b = false;
int i = 5; //4bytes -> 32bits
short s = 5; //2bytes -> 16bits (-32768~32767)
byte b = 5; //1byte -> 8bits (-128~127)
long l = 5l; //8bytes
float f = 5.5f;
double d = 5.5f;
char c = 'A'; //65
c = 66;
System.out.println(c); //B
int k = (int)5.5; //type casting
char
자바에서 유일하게 제공되는 unsigned 형태
보통 2Byte = 0x00 = 0000 0000 0000 0000이고 맨 앞의 1Bit가 음수/양수를 나타내는데, char은 unsigned이기 때문에 앞자리까지 양수의 숫자로 다 사용!(0~65535까지의 값을 가짐)
ex) 1111 1111 1111 1111 → 65535
char c1 = ‘A’, c2 = ‘B’; 일때 c1 < c2인 이유?
: JVM에서 피연산자를 4Byte 단위로 저장하기 때문에 더 적은 자료형의 값(char, short)을 계산하면 int형으로 자동 형변환된다.
char형은 유니코드 정수 형태로 저장되기 때문에 c1에는 ‘A’의 정수값인 65가 들어간다
원시타입, 참조타입
자바에서 숫자를 다루는 타입의 종류
원시타입(primitive type)
: 정수, 실수, 문자, 논리 리터럴등 실제 데이터 값을 저장하는 타입
참조타입(reference type)
: 객체의 주소를 저장하는 타입으로, 주소를 통해 객체를 참조한다.
특징 비교
Null 가능 여부
원시타입은 null을 가질 수 없다.
참조 타입은 null을 입력값으로 받을 수 있다. (힙 영역의 객체를 참조하지 않는다는 의미)
int i = null;//불가능 Integer integer = null; //가능
제네릭 타입에서의 사용가능여부
원시타입은 제네릭타입에서 사용 불가능
참조 타입은 제네릭 타입에서 사용 가능
List<int> i; //불가능 List<Integer> integer; //가능
성능 비교
접근 속도
원시타입 : 스택 메모리에 값이 존재한다참조타입 : 스택메모리에는 참조값만 있고, 실제 값은 힙 메모리에 존재한다.
값을 필요로 할때마다 언박싱 과정을 거쳐야 하기 때문에 원시타입에 비해 속도가 느리다
int age = 24; double height = 165.5; String name = "다정"; String hobby = "공부";
스택 영역 힙 영역 age : 24 200번지 : “다정” height : 165.5; 300번지 : “공부” name : 200번지 hobby : 300번지 메모리 양
원시타입이 사용하는 메모리 참조타입이 사용하는 메모리 boolean - 1bit Boolean – 128 bits byte - 8bits Byte - 128bits short, char - 16bits Short, Charater - 128bits int, float - 32bits Integer, Float - 128bits long, double - 64bits Long, Double - 196bits 참조타입이 사용하는 메모리 양이 압도적으로 높음을 확인할 수 있다.
결론 :
- 성능과 메모리에 장점이 있는 원시 타입을 먼저 고려한다.
- Null을 다루거나, 제네릭 타입에서 사용되어야 한다면 참조타입을 사용한다.