[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 과정을 거쳐야 하므로 원시 타입보다 성능이 떨어짐
결론
원시 타입
은 성능적인 면에선 뛰어나지만 유용성은 작고,
참조 타입
은 성능적인 부분은 부족하지만 유용성이 크다.