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
[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 |
댓글