본문 바로가기
JAVA

[JAVA(자바)] int, Integer차이와 Integer 비교시 == 아닌 equals() 사용하는 이유

by 초이사 2022. 12. 31.

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를 사용하는 것이 좋다.

 

댓글