[JAVA] 원시 타입과 참조 타입

yeonjoo913·2023년 8월 26일

JAVA

목록 보기
12/19

sonarqube로 코드를 검증하던 중 굉장히 기초가 되는 부분에 오류가 있음을 발견했고, 이를 수정하면서 리뷰 시간을 가졌다.

Remove the boxing to "Long".

문제발생 코드

.couponClickCount(Long.valueOf(statsMemberStats.stream().filter(i -> i.isCouponClick()).count()).intValue())

원인

statsMemberStats.stream().filter(i -> i.isCouponClick()).count()
는 long primitive(기본) 타입이다. 이를 int primitive type으로 형변환을 하는 것은 (int)를 사용하여 같은 기본형 타입으로 처리하면 되는데, 이를 Long으로 변환해서 해당 메서지가 뜬 것이다.

원시타입과 참조타입

  • 원시타입
    - boolean,char,byte,int,long,double 과 같은 것으로 실제 메모리에 데이터 값을 직접 저장하는 타입
    - null 불가능
  • 참조타입
    - 원시타입을 제외한 문자열,클래스,enum,interface와 같은 것으로 메모리 주소 값을 통해 객체를 참조하는 타입
    - null 가능

결론

원시 타입과 참조 타입을 혼용해서 사용하지 말자

문제 코드에서 사용한 Long.valueOf().intValue()는 기본형 long타입을 Long Reference(참조) 타입으로 변환하는 것이다. 이 과정에서 불필요한 Long 인스턴스가 생성된다. 불필요한 객체 생성으로 인한 성능 저하를 일으키므로 혼용해서 사용하지 말고, 최대한 원시타입을 사용하자

코드는 아래와 같이 변경하였다.

.couponClickCount((int)statsMemberStats.stream().filter(i -> i.isCouponClick()).count())
profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글