SpringBoot 프로젝트 진행 중 JPA Entity를 설계할 때 int가 아닌 Integer로 하는 것을 보고
그 차이가 정확히 무엇인지, 왜 쓰는지, 어떤 경우에 어떤 것을 쓰는게 좋은지 정리해보고자 한다.
자바의 데이터 타입
1) primitive type
- 정수, 실수, 문자, 논리형의 실제 데이터 값 저장
- boolean, byte, short, int, long, float, double, char
- 실제 값만 저장하기 때문에 스택 메모리에 저장된다.
- 기본값이 설정되어있기에(boolean -> false, int -> 0,,,) Null로 초기화할 수 없다.
2) reference type
- Array, Enum, Class, Interface
- 객체의 주소를 저장. 메모리 번지를 통해 객체를 참조한다.
- 스택에 저장되어 있는 실제 값의 주소를 저장하는 곳으로 힙 메모리에 저장된다.
- Null로 초기화할 수 있다.
Auto Boxing & Auto UnBoxing
다음 코드의 결과가 false가 나와야 할 것 같지만 true가 나온다.
자바에서 auto unboxing해주는 것이다.
Wrapper Class는 Call by Value로 작동한다.
int value = 11;
Integer value2 = new Integer(11);
System.out.println(value == value2); // true
char c = 'S';
Character c2 = new Character('S');
System.out.println(c == c2); // true
Wrapper Class를 사용하는 이유
- 매개 변수를 참조 자료형으로만 받는 메소드를 처리하기 위해서
- Wrapper Class는 기본 데이터 타입을 Object로 변환할 수 있다.
- 제네릭과 같이 기본 자료형을 사용하지 않는 기능을 사용하기 위해서
- 제네릭은 타입 파라미터로 Reference Type 밖에 올 수 없음. Primitive Type 불가
- MIN_VALUE, MAX_VALUE와 같이 클래스에 선언된 상수값을 사용하기 위해서
- 기본자료형을 참조자료형으로 만든 클래스들은 Boolean 클래스를 제외하고 모두 MIN_VALUE, MAX_VALUE라는 상수를 갖고 있다.
- 문자열을 숫자로, 숫자를 문자열로 쉽게 변환하고, 2, 8, 10, 16 진수 변환을 쉽게 처리하기 위해서
- ArrayList 등과 같은 Collection 프레임 워크의 데이터 구조는 기본 타입이 아닌 객체만 저장하게 되고 Wrapper Class를 사용하여 자동 방식과 언박싱이 일어 난다.
- 멀티스레딩에서 동기화를 지원하려면 객체가 필요하다.
- synchronized를 적용할 땐 객체변수(Reference Type), 함수 두 가지에서만 가능하다.
- 즉, primitive type은 reference type으로 만든 다음 synchronized를 적용해야 한다.
참고
https://jminc00.tistory.com/13
'개발 > Java' 카테고리의 다른 글
[리팩토링] 함수형 인터페이스와 lambda (0) | 2023.08.16 |
---|---|
[리팩토링] Optional과 orElseGet 그리고 함수형 인터페이스 (0) | 2023.08.16 |
String, StringBuilder, StringBuffer, CharSequence 이해하기 (0) | 2023.08.06 |
댓글