[Java] 6. long Long null, int Integer null, boolean Boolean return


뭘로 검색을 할까하는… 포스팅 제목은 long Long null, int Integer null, boolean Boolean return? 원시타입(primitive type)과 참조타입(reference type)?

원시타입(primitive type)참조타입(reference type)

1. long vs Long


자바에서 데이터 타입들은 크게 두 가지로 분류 한다. 원시타입(primitive type)참조타입(reference type)이다.

원시타입은 int, double, long, boolean...을 말하며, 참조타입은 Integer, Double, Long, Boolean... 등을 말한다.


이건 java 책 앞 부분에 자료형 장에서 아마 공부하고 실무에서도 변수 선언으로 많이 사용하며 다 아는 사실이다. 하지만 개발과 이론이 정리가 안된 상태서 개발을 하는 경우를 본거 같아서 포스팅해본다.

실제 실무에서 겪은 질문이였는데, Entity에 선언 된 Field의 자료형이 long이라 null값으로 보내야 될 경우 개발 시에 비효율적이라는(?)는 내용이였다.


우선 답은 long은 null 값이 불가능하며, Long은 null 값이 가능하다.


Long과 Integer 등은 래퍼클래스(Wrapper Class)로 객체 형태이고, long과 int 등은 원시유형의 기본자료형이다. 그래서 Long 이나 Integer이 null 일 수 있다는 것입니다.


비슷한 경험으로 다른 프로젝트에서도 모델의 필드의 자료형을 long으로 선언해서 null 체크나 형변환 작업을 했던 코드를 본적이 있다.

그래서 만약 null을 다뤄야 하면 참조타입을 자신이 선택해서 사용하면 된다.


SampleModel.java

private Long a; //null 가능
private long b; //null 불가능



boolean vs Boolean(제네릭 타입에서 사용)


기억이 가물가물 하지만 남의 코드나 개발 환경을 구경하는게 소소한 재미가 있어서 개인적으로 자체 코드리뷰를 하다보다 의견을 나누고 코드수정해던 경험을 기록해본다.


아래의 코드는 단순 boolean 값을 원한 비즈니스 로직이였고 시스템상 그때 당시 공통 ResultResponse 래퍼클래스를 리턴타입으로 선언했어야 됬는데,

ex1의 코드는 리턴타입의 ResultResponse<boolean>에서 에러가 나서 아마도 ex2 방법으로 구현한게 느껴진 코드였다.


ex1) 에러 나는 코드

@GetMapping("/api/sample")
public ResultResponse<boolean> getTest(Test test){//제네릭타입 에러
    boolean ret = this.testService.getTest(test);
    return new ResultResponse<>(ret);
}


ex2) 실제 구현 예시 코드

  • front-end 에서 data 에서 boolean 값을 꺼내서 사용한 코드
@GetMapping("/api/sample")
public ResultResponse<HashMap> getTest(Test test){
    HashMap ret = new HashMap();
    ret.put("boolean", this.testService.getTest(test));
    return new ResultResponse<>(ret);
}


ex3) 수정한 예시 코드

  • front-end 에서 데이터는 true/false 값으로 바로 받게 된다.
@GetMapping("/api/sample")
public ResultResponse<Boolean> getTest(Test test){
    boolean ret = this.testService.getTest(test);
    return new ResultResponse<>(ret);
}


해당 이슈는

원시타입<boolean>은 제네릭 타입에서 사용할 수 없지만,

참조타입<Boolean>은 제네릭 타입에서 사용할 수 있기 때문에

구현한 개발자의 의도한 방식으로 코드를 수정했다.


내 개인적인 생각은 개발자의 순간 실수이거나 같은 환경에서의 비슷한 개발을 하다보니 조금 바뀌면 작은 코딩 실수하는 경험인 듯 하다. java 에서 Wrapper Class, Boxing 과 UnBoxing 등은 원시타입과 참조타입 뿐만 아니라 실무에서도 코드 분석 및 파악에서도 큰 도움이 되기에 공부하면 좋다.