본문 바로가기
Java

[Java] Primitive Type/Wrapper Class

by hk27 2022. 1. 5.
Long과 long은 무슨 차이가 있을까요?

 

안녕하세요.

오늘은 Primitive Type과 Wrapper Class에 대해 알아보겠습니다.

 

스프링을 공부하면서, 회원 객체를 구현한 클래스에서 멤버 변수로 'Long id'를 이용하는 것을 보고 왜 long이 아닌 Long을 이용하는지 궁금해져서 알아보았습니다.

 

이유를 이해하기 위해서는, 먼저 Primitive Type(기본형), Wrapper Class(래퍼 클래스)가 무엇인지 알아야 합니다.

Java에는 변수 타입에는 기본형(Primitive Type)과 참조형(Reference Type)이 있습니다[1]. 

기본형 변수는 값을 그대로 저장하고, 참조형 변수는 객체의 레퍼런스를 저장합니다.

int a = 3; // 기본형
int b[] = new int[]{1,2,3} // 참조형

즉 기본형은 변수 중 값이 그대로 저장되는 것입니다. short, int, long, float, double, byte, char, boolean 총 8개가 지원됩니다. 

Java는 객체지향 언어입니다. 모든 것을 객체로 다룹니다. 문제는, 기본형은 객체가 아니라는 것입니다.

정수로 이루어진 List를 만들고자 할 때, 아래 두 줄의 코드 중 하나만 허용됩니다. 무엇이 허용될까요? 

List<int> a;
List<Integer> b;

두 번째 줄의 List b만 허용됩니다. List a를 넣으면 'Type argument cannot be of primitive type' 이라는 에러가 뜹니다. 기본형은 List에 들어갈 수 없습니다. 이를 해결하기 위해서 기본형을 객체로 감싸주며(boxing), 이것이 Wrapper Class(래퍼 클래스) 입니다. 아래 사진에서 기본형과 래퍼 클래스의 예시를 확인하실 수 있습니다[2]. 

그럼 기본형보다 래퍼 클래스가 좋다고 할 수 있을까요? 그렇지는 않습니다. 객체인 래퍼 클래스는 객체 생성 비용, 참조 비용 등으로 인해 기본형에 비해 비싸고, 필요할 때만 써야 합니다. 

기본형과 래퍼 클래스의 큰 차이점 중 하나는, null 허용 여부입니다. 기본형에는 null을 허용하지 않고, 객체인 래퍼 클래스에는 null이 허용됩니다. 

지금까지 기본형과 래퍼 클래스가 무엇인지 알아보았습니다. 그렇다면 다시 처음의 질문으로 돌아가서, 왜 멤버 변수로 왜 long이 아닌 Long을 이용할까요?

인프런 Q&A 게시판에 한 사용자 분이 같은 질문을 하셨고, 서포터즈님이 답변을 달아주셔서 아래에 붙입니다.

하이버네이트의 영속성 관련 문서를 보면, primitive 대신 nullable (객체)값을 사용하도록 권장하고 있습니다[3]. 그래서 엔티티의 필드는 Wrapper Class를 사용하시는 것이 좋습니다.

하이버네이트의 영속성 관련 문서에서 왜 객체 사용을 권장하라고 한 것인지 이해가 가지는 않으나, 객체 이용이 더 권장되는 것 같습니다. 하이버네이트는 JPA의 구현체이고, 자바의 JPA에서 영속성은 무언가를 Entity 속성에 영구히 저장해주는 것을 의미합니다[4]. Nullable 하지 않으면 값이 없는 기본형은 저장할 수 없어서 그런 것일까요? JPA를 더 공부한 뒤에, 혹은 공부를 하면서 의문점이 해결되면 이 부분을 수정하러 오겠습니다.  

덧붙여서 중요한 것은 아니지만, Long/long과 int를 구분하기 위해 롱은 숫자 뒤에 L을 붙여야 합니다. Long a = 100L <- 과 같이 이용할 수 있습니다. 없으면 int로 인지하기 때문입니다. 정수 범위 내의 숫자라면 L을 붙이지 않아도 되나, 정수 범위를 벗어나면 Long 범위에 속해도 L이 마지막에 붙어있지 않으면 에러가 날 수 있습니다. 

 

잘못된 부분은 피드백 주시면 감사하겠습니다. 

글 읽어주셔서 감사합니다 :-)

 

[1] https://sowells.tistory.com/162

[2] https://velog.io/@hadoyaji/int%EC%99%80-Integer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80

[3] https://www.inflearn.com/questions/273180

[4] https://sugerent.tistory.com/587

 

'Java' 카테고리의 다른 글

[Java] isSameAs, isEqualTo 정리  (0) 2022.01.13
[Java] 상속 extends, implements, abstract  (0) 2022.01.04

댓글