컴퓨터/Java

Java - 기본타입과 박싱된 기본타입 에 대하여(Long vs long)

곤정이 2021. 4. 6. 22:52
반응형

안녕하세요. Ruk 입니다.
effective java를 읽으며 재밌게 보았던 부분을 한번 테스트와 정리를 해보려고 합니다.
 
기본타입박싱된 기본타입 에 대한 내용인데요.
 
기본타입 : int, long, double, boolean, char등
박싱된 기본타입(참조타입) : Integer, Long, Double, Boolean, Character등
이런 눈에 익숙한? 타입입니다.
 
대게 Integer.MAX_VALUE 등 Integer에 있는 기능을 사용할 때 Integer를 사용하셨을 거라고 생각합니다.
프로젝트를 진행하다보면 일부 Dto에서 Integer 같은 박싱된 기본타입을 사용하는 경우도 종종 보이기도 했구요.
하지만 개발자라면 두 기본타입이 어떻게 다르고 어떤 상황에서 어떤값을 선언해야하는지 알고 사용해야 한다고 생각해요.
 
박싱, 언박싱에 대하여
박싱 : int -> Integer 
언박싱 : Integer -> int
차이점

- 식별성 :

같은 1이라는 숫자값으로 생성 후 비교를 하면

다른 결과를 반환합니다. 이유가 무엇일까요?

 

Integer라는 박싱에는 값 외에도 식별성이라는 속성이 있기 때문입니다.

실제 실무에서 금액을 비교하는데 버그가 발생하여서 코드를 분석해보니 어떤분이 VO를 Integer로 해두셔서 버그가 생긴적이 있습니다.

같은 값이였지만 다른 식별자로 false를 반환한 것 이죠.

물론, 방법이 없는건 아닙니다.

위 그림 기준으로 aa.intValue(); 를 통하여 값만 꺼내와 비교를 하면 됩니다.

 

- null :

기본타입에는 순수 값만 존재합니다. 하지만 박싱이 되면 null이 존재 할 수 있습니다.

제가본 시점에서는 Class같은 느낌?이라고 느껴지더군요.

 

- 박싱되 언박싱으로 인한 속도 :

0부터 Integer.MAX_VALUE까지 합산을 하는 for문입니다. 두 반복문의 동작 시간을 측정하면 약 16배의 속도차이가 발생하게 됩니다. 이유는 뭘까요? 박싱을 하기 때문입니다.

5번 line에 Long인지 long인지에 따라 이런 속도 저하를 불러오게 된 것 입니다.

그럼 어디서 박싱이 발생하였을까요?

8번 line에 +연산을 할 때!! auto boxing이 발생하게된 것 입니다. 불필요한 박싱이 수도없이 발생한 것 이죠.

작은 속도저하가 모여서 서버의 성능을 저하시킵니다.

우리는 이런 로직에 대하여 분명하게 알고 사용할 필요가 있겠습니다.


 
 
결론
우리는 위와 같이 박싱과 언박싱에 대하여 알아보았고, 어떤 차이가 발생하는지 위험성에 대하여도 알아보았습니다.
제 결론은 기본타입만 사용하고, 박싱된 기본타입은 쓰지말자! 는 아닙니다.....
꼭 필요한 경우가 아니면 순수 기본타입을 사용하자 입니다.
 
그럼 어떤 경우에 필요한데? 라고 생각이 들 수 있겠내요.
entity의 기본키가 long타입이라면
null이 가능해야되니 당연 박싱이 가능한 Long으로 사용해야합니다.
반대로 유저타입을 넣는다면 null인 유저는 없겠죠? 이런경우 굳이 박싱일 필요는 없습니다.
주의해야할 점이라면 기본값이 셋팅될 수 있다는거죠.

제가 경험한 케이스에서는 다음과 같은 케이스가 있었습니다.
비지니스 로직상 null이 발생이 가능한 경우 입니다.
 
다만 myBatis를 쓰시는 프로젝트이고, 쿼리 결과로 null을 넣어야 해서 Integer같은 박싱을 Dto에 사용하신 분이 있나요?
(제 회사에 있어서;;;; )
이런 경우 <if test=' '> 문으로 sql을 조작하면 sql 에러는 잡을 수 있습니다. (int에 null이 들어가면 장애가 나죠? ^^)
int형으로 선언 후 조건문으로 충분히 거를 수 있습니다................
 
순수 비지니스 로직에 꼭 null이 발생해야되는 케이스가 존재한다면!!! Integer같은 박싱을 사용할 수 있겠죠.
 
박싱된 변수를 intValue(); 할 때 null이면 장애도 발생하고, int로 값을 꺼낼 때나 Integer에 값을 저장할 때 다 속도 저하를 가져옵니다.
꼭 필요한 경우인지, 대체할 방법이 존재하는 것 인지 파악 후 사용하는 개발자가 되도록 합시다. ^^;;

반응형