티스토리 뷰

<Primitive 변수 : 원초적인 변수.자바에서 제공하는 기본적인 데이터 형의 변수.>
정수형 : int, short int, long int
실수형 : float, double
바이트형 : byte
논리형 : boolean
문자형 : char


<Object변수 : 객체 변수>
정수형 : Integer, Short Integer, Lomg Integer
실수형 : Float, Double
바이트형 : Byte
논리형 : Boolean
문자형 : Char



표에서 보여주는 것 처럼 primitive변수와 object변수의 값의 표현 범위는 같다.
그렇다면, 왜 변수를 primitive타입과 object타입으로 나누어 놨을까?


(ex)
int i1 = 10;
Integer i2 = new Integer(10);


HashMap<String , Integer> map = new HashMap<String , Integer>();
map.put("윤상아", i1);
map.put("윤상아", i2);



Integer는 클래스를 내부적으로 들어가보면 number클래스를 상속받고 number클래스는 object클래스를 상속받는다.
따라서 Integer클래스는 메모리에 object클래스가 가지는 변수들과 number클래스가 가지는 변수들을 모두 담고 있고,
위의 예시처럼 Integer 인스턴스를 만들면 4byte의 객체를 가지게 된다. 하지만 상속 받는 모든 클래스들의 변수들을 가지고 있으므로 메모리의 사이즈가 더 크다.

그럼에도 불구하고 object변수가 존재하는 이유는
자바에서 제공하는 자료구조에는 데이터를 넣을때 객체로만 넣을 수 있다.


예시에서 보면
map.put(k 키, v 값)==>  v는 객체만 들어간다.
따라서
map.put("이땡땡", i1); //int i1 = 10;
map.put("이땡땡", i2); //Integer i2 = new Integer(10);
각각 map에 primitive타입과 object타입을 넣었지만
primitive타입을 사용하더라도 내부적으로 instance화하여 데이터를 넣는다.


그렇다면 어차피 객체화하여 데이터가 들어감에도 primitive타입이 존재하는 이유는 무엇일까
new하여 객체를 만들면 해당 객체가 상속받는 모든 클래스들의 모든 변수들을 다 가지므로 메모리사이즈가 커지기 때문이다.
또한 원천적인primitive타입만이 비트연산이 가능하다.(객체object타입은 비트연산 불가능)
일반적으로 20/5=4처럼 사칙연산을 할 때도 primitive타입 비트연산이 더 적은 비용이 든다.
object형으로도 계산은 가능하나 암복호화 과정을 거쳐 계산하기 때문에 비용이 많이 든다.

따라서 자바는 객체의 세상임에도 불구하고 primitive타입이 존재하는 것이다.



'Java' 카테고리의 다른 글

Array와 List  (0) 2018.11.19
switch case문, 다양한 for문 (java의 iterator for문)  (0) 2018.11.19
바이트, 비트 연산(쉬프트 연산, 2의 보수 처리 등)  (0) 2018.11.19
객체, Class, Instance  (0) 2018.11.19
JDK, JRE, JVM  (0) 2018.11.19