728x90
반응형
실무에서 값 비교를 쓸 때, 객체에 대해서는 보통 equals를 많이 쓴다.
기본 타입이랑 객체 타입의 값 비교가 다르다.
기본 타입은 값을 복사한다. 그래서 '==' 과 같은 동등비교가 가능하다.
int a = 10;
int b = 10;
System.out.println("a == b = " + (a == b));
a == b = true
객체 타입은 '==' 와 같이 동등비교를 할 때 주소 값으로 비교한다.
false가 나온다.
Address address1 = new Address("city", "street", "10000");
Address address2 = new Address("city", "street", "10000");
System.out.println("(address1 == address2) = " + (address1 == address2));
(address1 == address2) = false
객체를 비교하려면 equals 를 사용하면 된다.
사용자의 필요에 따라 equals 를 재정의 할 수 있다.
Alt + Insert 를 누르면
와 같이 Generate가 나온다.
Override Methods를 선택하여 필요한 함수를 재정의한다.
Address.java
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(obj == null || getClass() != obj.getClass()) return false;
Address address = (Address) obj;
return Objects.equals(city, address.city)
&& Objects.equals(street, address.street)
&& Objects.equals(zipCode, address.zipCode);
}
@Override
public int hashCode() {
return Objects.hash(city, street, zipCode);
}
Address address1 = new Address("city", "street", "10000");
Address address2 = new Address("city", "street", "10000");
System.out.println("(address1 == address2) = " + (address1 == address2));
System.out.println("address1.equals(address2) = " + address1.equals(address2));
위 코드를 실행하면
(address1 == address2) = false
address1.equals(address2) = true
와 같이 나온다.
equals는 실무에서 자주 사용하므로 사용법을 알아두면 좋다.
값 타입의 비교
- 동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용
- 동등성(equivalence) 비교 : 인스턴스의 값을 비교, equals() 사용
- 값 타입은 a.equals(b) 를 사용해서 동등성 비교를 해야한다.
- 값 타입의 equals() 메소드를 적절하게 재정의(주로 모든 필드 사용)
728x90
반응형
'자바 > 개념' 카테고리의 다른 글
[Java/개념] equals() 와 hashCode() (0) | 2024.01.19 |
---|---|
[java/개념] 세마포어(Semaphore)와 뮤텍스(Mutex) (0) | 2021.11.06 |
[java] Garbage Collector(GC) - 가비지 컬렉터 (0) | 2021.09.18 |
[java] 자바 RMI(Remote Method Invocation) (0) | 2021.09.10 |
[java] 묵시적 형 변환 (0) | 2021.01.27 |
댓글