[Java] Primitive Type(원시타입) & Reference Type(참조타입)
[Java]의 타입
Java에서 데이터 타입은 크게 Primitive Type(원시 타입)과 Reference Type(참조 타입)으로 나뉘어짐
최근 자바는 오토박싱, 언박싱이 잘 되어 있어, 원시 타입과 참조 타입을 코드 구현 상에서 같이 사용해도 큰 불편함이 없다.
Auto Boxing(오토박싱)&UnBoxing(언박싱)Boxing: 원시 타입 데이터에 대응하는 참조 타입으로 만드는 동작UnBoxing: 참조 타입에서 원시 타입으로 변환1 2 3 4 5 6 7
// Boxing int i = 10; Integer num = new Integer(i); // UnBoxing Integer num = new Integer(10); int i = num.intValue();
JDK 1.5부터는 자바 컴파일러가 Boxing과 UnBoxing이 필요한 상황에 자동으로 처리를 해줌
1 2 3 4 5 6 7
// Auto Boxing int i = 10; Integer num = i; // Auto UnBoxing Integer num = new Integer(10); int i = num;
1 2 3 4
// 응용 예시 List<Integer> li = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(i); // Auto Boxing
하지만
오토박싱&언박싱이 일어날 경우 추가 연산 작업이 이루어 지기에 성능 향상을 위해선 동일 타입으로 지정이 효율적임
Primitive Type(원시 타입)
정수, 실수, 문자, 논리 리터럴 등 실제 데이터 값을 저장하는 타입
- Java에서 기본 자료형은 반드시 사용하기 전에 선언(Declared) 되어야하며, 자료형의 길이는 운영체제에 독립적이며 변하지 않는다.
- 스택(Stack) 메모리에 저장
1
int a = 10; // 10이라는 값이 들어간 a가 stack 영역에 생성
| 종류 | 데이터형 | 크기(byte) |
|---|---|---|
| 논리형 | boolean | 1 |
| 문자형 | char | 2 |
| 정수형 | byte | 1 |
| 정수형 | short | 2 |
| 정수형 | int | 4 |
| 정수형 | long | 8 |
| 실수형 | float | 4 |
| 실수형 | double | 8 |
Reference Type(참조 타입)
객체(Object)를 참조(주소를 저장) 하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입이다.
참조 타입(Reference type은 Java에서 최상위 클래스인 java.lang.Object 클래스를 상속하는 모든 클래스들을 말한다.- 실제 객체는 힙(heap) 메모리에 저장되며
참조 타입변수는 스택(stack) 메모리에 실제 객체들의 주소를 저장하여, 객체를 사용할때 마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.- 이후 GC(Garbage Collector)가 돌면서 메모리를 해제
원시 타입 vs 참조 타입
기능적 차이
Null을 담을 수 있는가?
원시 타입은 null을 담을 수 없음. 반면에참조 타입은 null을 입력 값으로 받을 수 있음1 2
int i = null; // 불가능 Integer i = null = // 가능
제네릭 타입에서 사용할 수 있는가?
원시 타입은 제네릭 타입에서 사용할 수 없음. 반면에참조 타입은 제네릭 타입에서 사용 가능1 2
List<int> i; // 불가능 List<Integer> i; // 가능
성능적 차이
원시 타입 은 스택 메모리에 존재하고, 참조 타입은 스택 메모리에는 참조 값이 실제 값은 힙 메모리에 존재함
그렇기에 참조 타입은 최소 2번 메모리에 접근해야 하며, 일부 타입의 UnBoxing 과정을 거쳐야 하므로 원시 타입보다 성능이 떨어짐
결론
원시 타입은 성능적인 면에선 뛰어나지만 유용성은 작고,
참조 타입은 성능적인 부분은 부족하지만 유용성이 크다.