Integer를 비교하면서 ==를 쓸 때, true가 되는 경우도 존재한다.
wrapper class라 ==를 쓰면 안될 줄 알았는데, 되어서 정리해보고자 글을 작성한다.
Integer란
기본타입을 객체로 다뤄야 할 때, 보통 사용한다.
기본타입을 wrapper class로 바꾸면 아래와 같이 된다.
기본타입 | Wrapper Class |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
기본 타입은 산술연산이 가능하고 null로 초기화할 수 없다.
Wrapper 클래스는 Unboxing없이는 산술연산이 불가능하고 null값을 처리할 수 있다.
int
- 산술연산이 가능하고 null로 초기화할 수 없다.
Integer
- Unboxing(int형으로 바꾸는 것)없이는 산술연산이 불가능하다. 하지만 실행하면 산술이 된다.
(JDK 1.5이후 자바에서 AutounBoxing을 하기 때문에 바로 사용할 수 있다.)
- null값을 처리할 수 있다. 즉, SQL과 연동할 경우 사용하기 더 편할 수 있다.
string형을 int형으로 변환할 때,
valueOf()와 parseInt()가 있는데, 둘이 리턴하는 값에서도 차이가 있다.
valueOf() - Integer클래스를 리턴해주기 때문에 산술 연산이 불가능하다.
parseInt() - int형을 리턴해주기 때문에 산술 연산이 가능하다.
비교 예시
Integer A= 100;
int B = 100;
Integer C= 100;
if (A == B) {
System.out.println("true");
} else {
System.out.println("false");
}
if (A == C) {
System.out.println("true");
} else {
System.out.println("false");
}
//결과는
//true
//true
==으로 비교해도 true가 된다.
Integer integerA= 100;
->컴파일러가 Integer intergerA = Integer.valueOf(100)으로 변환한다. (원시타입을 참조 타입으로)
참조타입은 실제 객체가 아니라 객체의 주소를 저장하고 있다.
이때, Integer.valueOf() 메소드는 -129에서 127사이의 int형 리터럴을 넘겨줄 때, 새로운 Integer객체를 생성하지 않고,
내부에 있는 IntegerCache 객체에서 Integer 객체를 반환한다.
-> -128~127의 범위는 정수 객체를 캐싱해서 오기 때문에(미리 만들어진 주소값을 가져온다.) 모두 true가 된다.
- 128~127의 범위는 int형끼리 비교하는 것과 같은 결과가 나온다.
위의 예시에서 C를 아래와 같이 변경하면 A와 C는 다르다고 한다. Integer형으로 새로 생성하겠다고 선언했다는 의미로 -128~127사이의 정수 객체를 캐싱하지 않기 때문이다. 하지만 Java 버전 9 부터는 제거 대상이기 때문에 사용하지 않는 것이 좋다.
Integer C = new Integer(100);
변수의 값을 200으로 변경한 예시
Integer A= 200;
int B = 200;
Integer C= 200;
if (A == B) {
System.out.println("true");
} else {
System.out.println("false");
}
if (A == C) {
System.out.println("true");
} else {
System.out.println("false");
}
//결과는
//true
//false
A와 B는 하나가 int형이기 때문에 모두 int형으로 변환해 int형끼리의 연산으로 생각하고 비교한다.
- int형이 하나 있다면 int형끼리 연산이 된다.
A와 C는 모두 참조타입으로 매번 새로 생성되기 때문에 주소 값이 다르다.
값을 비교하기 위해 객체 타입을 비교할 때, 사용하는 equals를 사용해야 한다.
Integer integerA= 200;
Integer integerC = 200;
if (integerA.equals(integerC)) {
System.out.println("true");
} else {
System.out.println("false");
}
//결과
//true
Integer 값끼리의 비교를 할 때는 범위에 따라 다르게 쓰는 것 보다는 equals를 사용하는 것이 좋다.
'JAVA' 카테고리의 다른 글
[JAVA(자바)] 참조 타입(reference type) null과 NullPointerException (0) | 2023.01.03 |
---|---|
[JAVA(자바)] 기본타입과 참조타입 그리고 ==, != 연산 (0) | 2023.01.03 |
[JAVA(자바)] The method sort(int[]) in the type Arrays is not applicable for the arguments 에러 해결 방법 (0) | 2022.12.27 |
[JAVA(자바)] Arrays.sort()와 Collections.sort() 차이 (feat. 오름차순, 내림차순) 및 Comparable (0) | 2022.12.27 |
[JAVA(자바)] 조건문과 반복문 (2) | 2022.12.25 |
댓글