본문 바로가기
자바/개념

[Java/개념] 값 비교( '==' 동등 비교 vs equals() 객체 비교)

by drCode 2023. 3. 8.
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 를 누르면 

 

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
반응형

댓글