공부내용공유

Wrapper class 의 비교 연산자 본문

Server/Java

Wrapper class 의 비교 연산자

forfun 2023. 8. 2. 17:35

서론


자바로 알고리즘 문제를 풀면서 Integer , String 을 HashMap 자료구조를 사용하여 해결해야 하는 문제를 풀고 있었다.

이때 디버깅 및 간단한 실험을 위해 Integer 끼리 동등 연산자를 사용하여 비교하는 코드를 돌렸다.

내가 공부했던 wrapper class 는

Inerger a = 100 은 new Integer(100);

Integer b = 100 또한 new Inteher(100); 이므로

a==b 는 false 가 나올거라 생각했는데 True 가 나왔다.

왜 그럴까를 찾아보고 알게된 사실을 정리하였다.

본론


Integer class 를 스르륵 훓어 봤는데 수상한걸 발견했다.

해당 부분의 코드를 보고 검색을 해본 결과.

 

Integer class 는 -128 부터 128 까지의 정수는 새로 생성하지 않고 캐싱해둔 객체를 참조한다.

 

그래서 기본 설정이라는 가정하에 Integer 에 동등 연산자를 사용하면

-128 ~ 128 은 True

그 외의 숫자는 False 가 나온다.

 

Integer a=100;
Integer b=100;
System.out.println("a == b " + (a==b));
Integer c = 129;
Integer d = 129;
System.out.println("c == d " + (c == d));

이때 Integer 의 HashCode 와 Equals 는 값을 기준으로 객체를 비교하기 때문에 어떤 숫자라도 값이 같으면 같은 객체로 취급된다.

그래서 HashCode 를 사용하는 HashMap 과 같은 Collection은 같은 객체로 판단한다.

dic.put(c,"c");
dic.put(d,"d");
System.out.print(dic.size());

이러한 결과가 나온다.

 

아래 코드는 Intger class 의 hashCode 와 Equals 이다.

*Equals 와 HashCode

이렇게 Hash 기능을 사용하는 몇몇 자료구조들은 객체를 비교할때 hashCode를 만들어 비교한다.

기본 설정은 객체의 메모리 주소를 이용해 HashCode 를 만들기 때문에 만약 Equals 를 재정의 했다면 HashCode 도 그에 맞춰 재정의 해야 특정 자료구조를 사용해도 오류가 발생하지 않는다.

결론


어쩌다보니 자바의 Wrapper class 와 HashCode, Equals 에 대해 복습하게 되었다.

알고리즘 문제를 풀때뿐만 아니라 프로젝트를 진행할 때도 잘 알고 사용 해야겠다.