Java에는 다양한 데이터 종류가 있고, 이는 원시형(primitive type)과 참조형(reference type)으로 나뉜다. 원시형과 참조형 데이터는 어떤게 존재하는지와, 각 데이터의 특징을 알아보자
원시 자료형 (Primitive Type)
Primitive Type 특징
- 종류
- Java에는 총 8가지의 원시 자료형이 존재한다 (boolean, char, long, int, short, byte, double, float)
- 쓰임
- 데이터를 저장하기 위해 사용되는 자료형을 의미한다
- 크기
- 1 byte ~ 8 byte까지 존재
- 데이터를 다루는 최소 단위가 1 byte이므로, 이보다 더 작을 수는 없다
- 사용
- 사용하기 전에 반드시 선언(declared) & 초기화(initialized)를 하고 사용해야한다
- null 처리
- "비객체" 타입으로, 선언될 때 변수에 객체가 아닌 "실제 값"을 가진다. 따라서 null이 불가능하다
(null 자체가 참조형 변수가 어떠한 객체도 가리키고 있지 않음을 나타내기 때문) - null을 넣고싶다면 Wrapper Class를 활용해야한다
- "비객체" 타입으로, 선언될 때 변수에 객체가 아닌 "실제 값"을 가진다. 따라서 null이 불가능하다
- 저장 위치
- 선언시에 "실제 값"이 할당되므로, 스택 메모리에 저장된다
Primitive Type 8종류
분류 | 타입 | 크기 | 기본값 | 범위 |
정수형 | byte | 1 byte | 0 | -128 ~ 127 |
short | 2 byte | 0 | -32768 ~ 32767 | |
int | 4 byte | 0 | -2147483648 ~ 2147483647 | |
long | 8 byte | 0L | -9223372036854775808 ~ 9223372036854775807 | |
실수형 | float | 4 byte | 0.0F | -1.4 * 10^(45) ~ 3.4 * 10^(38) |
double | 8 byte | 0.0 | -4.9 * 10^(324) ~ 1.8 * 10^(308) | |
문자형 | char | 4 byte | '\u0000' | 0 ~ 65535 (\u0000 ~ \uffff) |
논리형 | boolean | 1 byte | false | true, false |
- int : 자바에서 정수 연산을 하기 위한 기본 타입으로, short 혹은 byte의 변수가 연산을 하면 연산 결과는 int가 된다
- long : 초기화할 때 정수값 뒤에 L을 붙여야 한다. 만약 int 범위를 넘어가는 정수에 L을 붙이지 않는다면 컴파일 에러가 발생한다
- float : 자바에서 실수의 기본형은 double이므로, float를 사용하기 위해서는 실수값 뒤에 F를 붙여야 한다
- Wrapper Class : 원시형을 '객체(Object)'로 다루기 위해서 객체화 시키는 클래스로, 원시형을 클래스로 감싼다고 생각하면 된다
참조 자료형 (Reference Type)
Reference Type 특징
- 종류
- java.lang.Object를 상속 받은 객체를 말한다
- Java에서 원시형을 제외한 모든 타입들이 Reference Type이다
- Class Type, Interface Type, Array Type, Enum Type으로 나뉜다
- 쓰임
- 객체를 생성할 때 사용되는 자료형을 의미한다
- null 처리
- 빈 객체를 의미하는 null을 할당할 수 있다
- null을 넣을 수 있지만, 런타임시에 NullPointException이 발생할 수 있으므로 유의해야한다
- 저장 위치
- 선언시 Reference Type은 Heap 영역에 생성되고, 이를 바라보는 변수들은 Stack 영역에 저장된다
Reference Type의 대표적인 종류
분류 | 타입 |
Class Type | 사용자 정의 Class |
String | |
ArrayList | |
HashSet | |
Interface Type | 사용자 정의 Interface |
List | |
Set | |
Queue | |
Array Type | int [] |
String [] | |
Enumeration Type | 사용자 정의 Enum |
- Interface : Class와 다르게 java.lang.Object를 상속받지 않는다
- String
- 참조형에 속하지만 기본형처럼 사용한다
- 불변하는 객체이다
- 비교시 .equals()를 사용해야한다 ( equals는 "값"을 비교, ==는 memory를 비교하기 때문)
복습 Question
- boolean은 실제로 1 bit면 충분한데 왜 1 byte일까?
- primitive type이 null을 할당할 수 없는 이유가 뭘까?
- 두 개의 String 객체를 비교할 때, '=='가 아닌 'equals()'를 사용해야하는 이유는?
Reference
- Java 자료형 이해하기 : https://adjh54.tistory.com/119
- Primitive type & Reference type : https://gyoogle.dev/blog/computer-language/Java/Primitive%20type%20&%20Reference%20type.html
- 자바 자료형 정리 : https://jdm.kr/blog/213