Spring & Spring Boot

[SpringBoot] 원시타입, 참조타입/Boolean boolean의 차이점 및 이슈

김먼저 2022. 12. 28. 18:29
Boolean
  • 참조 타입 : reference type
  • true, false, null 값을 가진다.
  • 주로 Null 체크를 필요로할 때 참조형을 사용한다.

 

boolean
  • 원시 타입 : primitive type
  • true, false 값을 가진다.
  • Null 체크가 불필요할 때 자료형(원시 타입)을 사용한다.

 

참조 타입과 원시 타입의 차이
자료형(원시 타입) : int, float, double, boolean, ...
참조형 : Integer, Float, Double, Boolean, ...
  • 자료형을 객체로 감싼 것이 참조형이다. → Unboxing
  • 원시 타입은 null 입력 가능, 제네릭 타입에서 사용 불가.
  • 참조형은 null 입력 불가, 제네릭 타입에서 사용 가능.
  • 원시 타입은 데이터를 stack메모리에 저장.
  • 참조형은 하나의 인스턴스이기 때문에 stack메모리에는 참조값(주소값)을, 실제 값은 heap메모리에 저장.
  • 메모리 → 참조 타입 >> 원시 타입
  • 속도/성능 → 원시 타입 >> 참조 타입

 

원시타입 / 참조타입 원시타입 참조타입
boolean / Boolean 1 bit 128 bit
byte / Byte 8 bits 128 bits
short / Short 16 bits 128 bits
char / Character 16 bits 128 bits
int / Integer 32 bits 128 bits
float / Float 32 bits 128 bits
long / Long 64 bits 196 bits
double / Double 64 bits 196 bits

 

 

....뭐 이정도는 대충 알고 있었으나 예상치 못한 문제가 발생했습니다.

 

 

Service에서 로직을 처리하고 Controller에서 DTO를 ResponseEntity로 감싸서 return하였는데

DTO 변수

 

return ResponseEntity.ok().body(DTO)

 

Postman으로 받은 데이터

 

 

 

 

........????

 

 

아니, 왜 변수명이 바뀌지??

 

 

isHidden = isHidden ≠ hidden

 

 

(DTO 변수명 = return시 변수명 ≠ Postman 변수명)

 

 

 

Service 코드 디버깅타면서 따라가다가 결국 Controller return 영역까지 따라갔습니다.

 

 

 

.

 

.

 

구글링 결과,

 

 

 

객체의 속성이 'boolean' 타입에 "is" prefix를 사용하게 될 경우

 

 

getter가 "isXXXX"로 생성된다고 합니다.

 

 

위와 같은 해결법으로,

 

 

1. 타입을 래퍼클래스 Boolean을 사용하여 getter, setter를 생성.

 

2. boolean 타입일 경우 getter 메서드 getIsXXXX()를 작성.

 

 

....응?

 

 

일단, Boolean으로 바꿔서 Test를 진행했습니다.

 

 

 

 

 

참조형으로 변경

 

 

 

 

return ResponseEntity.ok().body(DTO)

 

 

 

 

 

Postman으로 받은 데이터

 

 

....된다....!!!

 

 

...명확한 이유는 모르겠지만 찾으면 수정하겠습니다!! (알고 계신다면 가르쳐주세요...ㅠㅠ)

 

 

끝!!