본문 바로가기
Study/Java

Long,long / int,Integer 차이

by 오늘만 사는 여자 2022. 3. 29.
728x90
반응형

자료형을 많이 공부해보신분들이라면 long과 int를 많이 사용해보았을것이다.

 

근데 long과 Long이 다르고 int와 Integer 가 다르다는것을 알고 있었는가?

 

굳이 형변환이 필요없이 비교는 되지만 엄연히 다른 둘이다.

 

Long <-> long

큰 차이는 null을 할수 있냐 없냐의 차이이다.

 

Long은 null을 사용할수 있고, long은 null을 사용할수 없다.

그 외에도 메모리 할당 크기의 차이가 있다.

 

Integer <-> int

둘도 또한 null의 차이이다.

Integer 는 null이 가능하며 int 는 불가능 하다.

 

결론

Integer 를 Long와 비슷하게 보면 되고 ,

int를 long과 비슷하게 보면 된다.

 

출처 :  https://thenicesj.tistory.com/77

 

Long,long / int,Integer 차이

자료형을 많이 공부해보신분들이라면 long과 int를 많이 사용해보았을것이다. 근데 long과 Long이 다르고 int와 Integer 가 다르다는것을 알고 있었는가? 굳이 형변환이 필요없이 비교는 되지만 엄연히

thenicesj.tistory.com

 

 

기본타입 박싱된 기본타입 에 대한 내용인데요.

 

기본타입 : 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이 발생하게된 것 입니다. 불필요한 박싱이 수도없이 발생한 것 이죠.

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

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

 

 

 

결론 

우리는 위와 같이 박싱과 언박싱에 대하여 알아보았고, 어떤 차이가 발생하는지 위험성에 대하여도 알아보았습니다.

제 결론은 기본타입만 사용하고, 박싱된 기본타입은 쓰지말자! 는 아닙니다.....

꼭 필요한 경우가 아니면 순수 기본타입을 사용하자 입니다.

 

그럼 어떤 경우에 필요한데? 라고 생각이 들 수 있겠내요.

제가 경험한 케이스에서는 다음과 같은 케이스가 있었습니다.

비지니스 로직상 null이 발생이 가능한 경우 입니다.

 

다만 myBatis를 쓰시는 프로젝트이고, 쿼리 결과로 null을 넣어야 해서 Integer같은 박싱을 Dto에 사용하신 분이 있나요?

(제 회사에 있어서;;;; ㅡㅡ)

이런 경우 <if test=' '> 문으로 sql을 조작하면 sql 에러는 잡을 수 있습니다. (int에 null이 들어가면 장애가 나죠? ^^)

int형으로 선언 후 조건문으로 충분히 거를 수 있습니다................

 

순수 비지니스 로직에 꼭 null이 발생해야되는 케이스가 존재한다면!!! Integer같은 박싱을 사용할 수 있겠죠.

 

박싱된 변수를 intValue(); 할 때 null이면 장애도 발생하고, int로 값을 꺼낼 때나 Integer에 값을 저장할 때 다 속도 저하를 가져옵니다.

꼭 필요한 경우인지, 대체할 방법이 존재하는 것 인지 파악 후 사용하는 개발자가 되도록 합시다. ^^;;

 

 

출처 :  https://kounjeong.tistory.com/21

728x90
반응형

댓글