상세 컨텐츠

본문 제목

[JAVA] 자바 자료형, Integer와 int의 차이에 대해

JAVA/기본 & 강의복습

by ranlan 2021. 8. 26. 16:07

본문

728x90

url 매핑 중 쿼리 파라미터가 없을 때(requried=false) null로 받아들이지 못하고 에러가 나는 문제 발생

 

파라미터 타입을 long으로 정의했을 때

@RequestParam(value = "categoryNo", required = false) long categoryNo

해당 문제에서 만난 여러 에러 메시지들.. 내용은 조금씩 달라도 결국 long 타입에 대한 문제로 보인다.

 

There was an unexpected error (type=Bad Request, status=400).

Failed to convert value of type 'java.lang.String' to required type 'long'; nested exception is java.lang.NumberFormatException: For input string: ""

org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'long'; nested exception is java.lang.NumberFormatException

 

DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.OptionalLong'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.OptionalLong': no matching editors or conversion strategy found

 

There was an unexpected error (type=Internal Server Error, status=500).

Optional long parameter 'categoryNo' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

java.lang.IllegalStateException: Optional long parameter 'categoryNo' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

 

파라미터 타입을 Long으로 바꿔서 문제 해결

@RequestParam(value = "categoryNo", required = false) Long categoryNo

 

 

Primitive Type (기본 자료형, 원시 자료형)

자바 컴파일러에 의해서 해석되는 byte, short, int, long, float, double, char, boolean 와 같은 기본 자료형이다.

실제 값을 갖는 자료형으로 자바에서 여러 형태의 타입을 미리 정의하여 제공하며 메모리 크기가 정해져 있다.

산술 연산과 0으로 초기화 가능하나 null로는 초기화 불가능하다.

 

 

 

Reference Type (참조 자료형)

기본 자료형이 아닌 모든 자료형은 참조 자료형이며 클래스를 타입으로 선언하는 자료형이다. 클래스에 따라 할당되는 메모리가 달라진다.

 

 

Wrapper Class (래퍼 클래스)

기본 타입의 데이터를 객체로 사용해야하는 경우 사용한다.

각각의 타입에 해당되는 데이터를 인수로 전달받아 해당 값을 가지는 객체로 만들어주며 모두 java.lang 패키지에 포함되어 제공된다.

unboxing(기본 타입으로의 변환)없이 직접적인 산술 연산은 불가능하나 null 값 처리는 가능하다.

 

* Integer.parseInt("10") vs Integer.valueOf("10") 

parseInt()는 문자열에서 기본형(int)으로 변환, valueOf()는 문자열에서 래퍼 클래스(Integer)로 변환한다.

 

 

박싱(Boxing)과 언박싱(Unboxing)

래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아님으로, 인스턴스에 저장된 값 변경 불가능하다.

값을 참조하기 위해서는 새로운 인스턴스를 생성하고 생성된 인스턴스의 값만 참조 가능하다.

 

래퍼클래스 인스턴스에서 값을 기본 타입의 데이터로 꺼내는 것을 언박싱이라 하며 이를 통해 값을 이용한 산술연산 가능하다.

// Boxing
Integer num = new Integer(1);

// Unboxing
int n = num.intValue();

 

오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)

jdk1.5부터는 박싱과 언박싱이 필요할 때 자바 컴파일러가 알아서 이를 자동으로 처리해준다.

// AutoBoxing
Integer num = 1;

// AutoUnboxing
int n = num;

 

래퍼 클래스의 비교연산

인스턴스에 저장된 값끼리의 동등 여부 판단은 동등 연산자 ==로 불가능하다(==의 의미는 객체의 주소값 비교) -> equals() 메서드로 가능

오토 박싱과 오토 언박싱을 통해 래퍼 클래스와 기본 자료형과의 동등 판단은 ==와 equals() 모두 가능하다.

 Integer num1 = new Integer(10); // 래퍼 클래스
 Integer num2 = new Integer(10); // 래퍼 클래스
 int num3 = 10; // 기본타입
		 
 System.out.println(num1 == num3); // true
 System.out.println(num1.equals(num3)); // true
 System.out.println((num1 == num2)); // false
 System.out.println(num1.equals(num2)); // true

 

* 멀티 스레딩에서의 래퍼 클래스

멀티 스레드 환경에서 동시성이 커져 발생되는 문제를 방지하기 위해 객체 변수와 함수에 대해서만 동기화를 적용한다.

이 때문에 기본형을 래퍼 클래스로 만들어 동기화를 적용시키기도 한다.

 

 

 

728x90

관련글 더보기

댓글 영역