Java

[Java] primitive type vs reference type

gilchris 2021. 9. 30. 01:49

int와 Integer
long과 Long
등등...

이렇게 java의 primitive type과 reference type 중에서 당연히 될 수 있으면 primitive를 쓰는게 낫다.

이유야 뭐...

  • Object 타입에서 신경쓸게 더 많다. -> 실수할 여지가 많다. NPE나 반복적인 Object를 새로 생성해서 할당한다거나..
  • 메모리를 훨씬 많이 사용한다.

 

그런데... 이런 것들 사이에 동작 속도의 차이가 크다는 누군가의 의견을 보았고, 나도 그렇다고 생각을 했었는데...

예전에 어떤 분이 메모리 사용량 이외에 다른 차이가 나는게 있냐며.. 특히 DB에서 값을 읽어와서 Entity에 넣을 때 NULL이 들어올 수 있는 가능성이 늘 있으니 이 때에는 reference type을 사용하는 것이 맞지 않나 라는 의견을 내셨었다.

그래서 좀 찾아봤는데 도무지 이걸 설명하는 글을 못 찾아서 직접 해볼 시간도 없고 그냥 그렇게 하세요.. 했었다.

그런데 오늘 찾아보니... 금방 잘 나온다;;; 그 때 난 왜 못 찾았던 걸까...

 

처음 찾은 글은 아래의 StackOverFlow 글이었다.

 

https://stackoverflow.com/questions/5199359/why-do-people-still-use-primitive-types-in-java

 

대부분의 답변이 좀 극단적인 상황들을 가정하고 있어서... 좀 난감한데...

for 문 안에서 Integer에 계속 대입을 한다거나;; 당연히 이렇게 하면 객체를 계속 새로 만들고 버리고 해야 해서 좋지 않다.

NullPointerException에 대비를 해야 한다고... 하는데 이것도 Object를 쓰게되면 당연히 고민해야 하는 문제이지 퍼포먼스 적인 문제는 아니다.

이런 사람의 실수가 유발된다고?! 음... 맞는 말인데...

 

그럼 다 잘 짰다고 가정하고 메모리가 무한히 있다고 가정해도 진짜로 속도 차이가 눈에 띌 만큼 나나??

 

이 글 답변 중에 누가 baeldung 사이트 링크를 걸어둔게 있어서 들어갔더니.. 거기에 정답이 있었다.

 

https://www.baeldung.com/java-primitives-vs-objects

 

결론만 말하자면 단순 조회 비교에서도 성능이 primitive가 낫다.

이런 주된 이유를 이 글에서는 primitive type은 stack memory에 저장이 되고, reference type은 heap memory에 저장되어서라고 설명하고 있다.

primitive type은 값을 stack memory에서 바로 읽고, reference type은 stack memory에서 heap memory의 위치를 구해온 다음에 다시 heap memory에 가서 값을 읽어와야 해서 무조건 primitive type이 성능상 유리하다.

 

오늘의 교훈.. 정확히 모르면 다른 사람 말에 혹하기 쉽다. ㅠㅠ