오류가 없고 실행가능한 프로그램을 만들기 위해서 올바른 데이터 타입을 할당했는지 확인해야한다. 컴퓨터 프로그래밍 언어에서 중요한 요소임에도 메모리 공간을 어느정도 이용하고 데이터 유형 간의 차이를 정확하게 모르고 있어서 이번 기회에 정리를 해보고자 한다.
모든 프로그래밍 언어에는 언어마다의 Data Type도 있고 할당하는 메모리의 크기가 다를 수 있지만 현재 필자가 사용중인 언어를 기준으로 JAVA에서의 Data Type들을 알아보고자 한다.
JAVA에서의 Data Type
자바에는 크게 두 가지의 데이터 타입 범주가 존재한다.
- Primitive Data Type
- Reference(Non-Primitive) Data Type
먼저 Primitive Data Type에 대해서 알아보자.
Primitive Data Type (원시형 데이터 타입)
원시형 데이터 타입은 정수, 실수, 문자, 논리 리터럴 등 실제 값을 보유(저장)하는 데이터 타입이다. 메모리가 JVM 스택 영역에 생성되고 실제 데이터 값이 그곳에 들어가게 된다.
ex) int x = 100;
→ 100이라는 실제 값이 x라는 JVM 스택에 생성된 메모리 공간에 들어가게 된다.
모든 언어에서 Boolean 타입을 제외하고는 동일하게 다룰 것이다. JVM에서는 Boolean은 int 혹은 byte로 관리된다. false = 0, true ≠ 0 이런 식으로 처리된다. byte, char, short 데이터 타입도 int 데이터 타입을 사용하도록 컴파일 된다.
Reference Data Type
참조 데이터 타입은 위에서 봤듯이 Non-primitive 타입 즉, 원시형이 아닌 모든 유형은 참조 데이터 타입이다. 이는 실제 데이터 값 자체가 스택 메모리 영역에 저장되는 것이 아니라 JVM 힙 영역에 실제 값이 저장이 되고 스택에는 값이 저장된 힙 영역의 주소값이 저장되는 형태이다.
객체 간의
❗원시형과의 비교를 위해서 Wrapper 클래스를 이용하여 비교하겠다.
ex) Integer x = 100;
→ 100이란 값은 힙 영역에 인스턴스가 생성되고 해당 메모리 주소가 스택 영역의 x라는 메모리 공간에 저장되고 변에 저장된 참조 값을 이용해서 값으로 접근할 수 있다.
원시 vs Wrapper
Wrapper 클래스는 원시형 데이터 타입을 객체로 감싼 클래스이다. 그렇다면 왜 Wrapper 클래스가 만들어졌을까?
일단 자바는 객체 지향 언어이다. 그러다 보니 객체 간의 상호작용을 통해서 프로그램이 동작하게 된다. 그래서 만들어져 있는 java.util, Collection과 같은 유틸 클래스와 데이터 구조들이 객체만 저장하는 것이다.
또 메서드에 전달된 인수를 수정하려는 경우 primitive 타입을 이용하면 그 값만 복사되어서 보내지니까 메서드 외부에서 전달된 인수의 값은 바뀌지 않는 것이다. 그리고 멀티스레딩에서 동기화를 지원할 때도 필요했다.
마지막으로 primitive 타입은 null 값을 가지지 못하고 제네릭 타입에서 사용할 수 없었다.
그렇다면 원시형 데이터 타입의 장점은 무엇일까?
원시형 데이터 타입의 장점
- 원시형 데이터 타입이 속도면에서 더 빠르다.
: Wrapper 클래스는 참조 데이터 타입이다 보니까 스택 메모리 영역에 존재하는 변수로 접근하고 거기서 주소값을 통해 힙 메모리 영역으로 이동해야 실제 값에 도달하지만 원시형 데이터 타입은 스택 상에 실제 값이 저장되어 있기에 속도가 차이가 날 수 밖에 없다.
- 원시형 데이터 타입이 메모리가 적게 든다.
이를 봤을 때 Boolean은 128개의 원시형 boolean의 크기가 할당되는 것을 볼 수 있는 것처럼 차지하는 메모리의 크기가 확연하게 차이가 난다.
언제 원시형 데이터 타입을 사용하고 언제 Wrapper 클래스를 이용하는 것이 좋을까?
- 비교 연산이 목적이라면 객체화된 reference type 대신 primitive type을 이용해라. ( 이펙티브 자바 8장에 나온다고 함. )
→ 이는 속도차가 많이 나기 때문이다.
- 그게 아닌 Method의 경우라면 신중하게 고민 후 선택해라.
→ 위에서 말했던 Reference 타입의 장점과 Primitive 타입의 장점을 잘 생각하면서 적절하게 사용하자.
Reference
Uploaded by N2T