[JAVA] JAVA에서의 Data Type

2022. 11. 12. 01:57몰랐던거/JAVA & SPRING

오류가 없고 실행가능한 프로그램을 만들기 위해서 올바른 데이터 타입을 할당했는지 확인해야한다. 컴퓨터 프로그래밍 언어에서 중요한 요소임에도 메모리 공간을 어느정도 이용하고 데이터 유형 간의 차이를 정확하게 모르고 있어서 이번 기회에 정리를 해보고자 한다.

모든 프로그래밍 언어에는 언어마다의 Data Type도 있고 할당하는 메모리의 크기가 다를 수 있지만 현재 필자가 사용중인 언어를 기준으로 JAVA에서의 Data Type들을 알아보고자 한다.

JAVA에서의 Data Type

자바에는 크게 두 가지의 데이터 타입 범주가 존재한다.

  1. Primitive Data Type
  1. Reference(Non-Primitive) Data Type

먼저 Primitive Data Type에 대해서 알아보자.

Primitive Data Type (원시형 데이터 타입)

원시형 데이터 타입 Size, Description

원시형 데이터 타입은 정수, 실수, 문자, 논리 리터럴 등 실제 값을 보유(저장)하는 데이터 타입이다. 메모리가 JVM 스택 영역에 생성되고 실제 데이터 값이 그곳에 들어가게 된다.

ex) int x = 100; → 100이라는 실제 값이 x라는 JVM 스택에 생성된 메모리 공간에 들어가게 된다.

모든 언어에서 Boolean 타입을 제외하고는 동일하게 다룰 것이다. JVM에서는 Boolean은 int 혹은 byte로 관리된다. false = 0, true ≠ 0 이런 식으로 처리된다. byte, char, short 데이터 타입도 int 데이터 타입을 사용하도록 컴파일 된다.

💡
byte, char, short 데이터 타입도 int 데이터 타입을 사용하도록 컴파일 된다고 말했다. 결국은 이런 데이터 타입들도 int 데이터 타입으로 자동으로 형 변환이 되어서 연산이 수행되기 때문에 자신이 의도한 연산의 결과가 나올 것인가를 잘 판단해야한다.

Reference Data Type

참조 데이터 타입은 위에서 봤듯이 Non-primitive 타입 즉, 원시형이 아닌 모든 유형은 참조 데이터 타입이다. 이는 실제 데이터 값 자체가 스택 메모리 영역에 저장되는 것이 아니라 JVM 힙 영역에 실제 값이 저장이 되고 스택에는 값이 저장된 힙 영역의 주소값이 저장되는 형태이다.

객체 간의

❗원시형과의 비교를 위해서 Wrapper 클래스를 이용하여 비교하겠다.

ex) Integer x = 100; → 100이란 값은 힙 영역에 인스턴스가 생성되고 해당 메모리 주소가 스택 영역의 x라는 메모리 공간에 저장되고 변에 저장된 참조 값을 이용해서 값으로 접근할 수 있다.

원시 vs Wrapper

Wrapper 클래스는 원시형 데이터 타입을 객체로 감싼 클래스이다. 그렇다면 왜 Wrapper 클래스가 만들어졌을까?

일단 자바는 객체 지향 언어이다. 그러다 보니 객체 간의 상호작용을 통해서 프로그램이 동작하게 된다. 그래서 만들어져 있는 java.util, Collection과 같은 유틸 클래스와 데이터 구조들이 객체만 저장하는 것이다.

또 메서드에 전달된 인수를 수정하려는 경우 primitive 타입을 이용하면 그 값만 복사되어서 보내지니까 메서드 외부에서 전달된 인수의 값은 바뀌지 않는 것이다. 그리고 멀티스레딩에서 동기화를 지원할 때도 필요했다.

마지막으로 primitive 타입은 null 값을 가지지 못하고 제네릭 타입에서 사용할 수 없었다.

그렇다면 원시형 데이터 타입의 장점은 무엇일까?

원시형 데이터 타입의 장점

  1. 원시형 데이터 타입이 속도면에서 더 빠르다.

: Wrapper 클래스는 참조 데이터 타입이다 보니까 스택 메모리 영역에 존재하는 변수로 접근하고 거기서 주소값을 통해 힙 메모리 영역으로 이동해야 실제 값에 도달하지만 원시형 데이터 타입은 스택 상에 실제 값이 저장되어 있기에 속도가 차이가 날 수 밖에 없다.

  1. 원시형 데이터 타입이 메모리가 적게 든다.

이를 봤을 때 Boolean은 128개의 원시형 boolean의 크기가 할당되는 것을 볼 수 있는 것처럼 차지하는 메모리의 크기가 확연하게 차이가 난다.

언제 원시형 데이터 타입을 사용하고 언제 Wrapper 클래스를 이용하는 것이 좋을까?

  1. 비교 연산이 목적이라면 객체화된 reference type 대신 primitive type을 이용해라. ( 이펙티브 자바 8장에 나온다고 함. )

→ 이는 속도차가 많이 나기 때문이다.

  1. 그게 아닌 Method의 경우라면 신중하게 고민 후 선택해라.

→ 위에서 말했던 Reference 타입의 장점과 Primitive 타입의 장점을 잘 생각하면서 적절하게 사용하자.

Reference

Java Data Types
As explained in the previous chapter, a variable in Java must be a specified data type: int myNum = 5; // Integer (whole number) float myFloatNum = 5.99f; // Floating point number char myLetter = 'D'; // Character boolean myBool = true; // Boolean String myText = "Hello"; // String Try it Yourself " Data types are divided into two groups: Non-primitive data types - such as , Arrays and Classes (you will learn more about these in a later chapter) A primitive data type specifies the size and type of variable values, and it has no additional methods.
https://www.w3schools.com/java/java_data_types.asp
Data Types in JVM
Data types are essential for dealing with the memory area(class loader components) which is used to store the data during the run time. Since the data are stored n the memory area. One key aspect you should remember is that the data types of JVM differ from data types in java, but most of them are almost equal.
https://medium.com/@kavindaperera25/data-types-in-jvm-e45eedd00435
Java Primitives vs Wrapper : Which one to use?
Just for the reference, In java primitive type variables occupy below size in memory and they live in stack if declared as local variable and on heap if they are instance variables : boolean - 1 bit * (This is representational, its size not precisely defined) byte - 8 bits short, char - 16 bits int, float - 32 bits long, double - 64 bits Note : In Oracle's Java Virtual Machine implementation, boolean arrays in the Java programming language are encoded as Java Virtual Machine byte arrays, using 8 bits per boolean element.
https://medium.com/@vaibhav0109/java-primitives-vs-wrapper-which-one-to-use-aa7d6efc024
https://www.baeldung.com/java-primitives-vs-objects
Primitive type이 Reference type 보다 빠른 이유.
이펙티브 자바 8장을 사내 스터디를 위해 정리하다가 정리해두면 좋을 정보를 블로깅합니다. (모두가 알고 ...
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=joebak&logNo=220282132384


Uploaded by N2T

'몰랐던거 > JAVA & SPRING' 카테고리의 다른 글

[OOP] Visitor 패턴 정리하기  (0) 2022.12.09
[OOP] Command 패턴 정리하기  (0) 2022.12.09
[OOP] Observer 패턴 정리하기  (0) 2022.11.12
[OOP] Proxy 패턴 정리하기  (0) 2022.11.10
[JAVA] Exception 정리하기  (0) 2022.11.10