Java - equals() 동등성? 동일성?

c.Hano·2024년 11월 20일

자바

목록 보기
4/17

Object 클래스는 동등성 비교를 위한 equals() 메서드를 제공한다.

자바에서 같다라는 표현은 2가지로 분리된다.

  • 동일성(identity) : ==연산자를 사용 완전히 같아야함.
  • 동등성(equality) : 같은 가치나 수준을 의미하지만 무엇을 기준하냐에 따라 결과가 달라진다.

Object가 제공하는 equals() 메서드를 살펴보면 ==연산자를 기준으로 두 객체를 비교한다. 따라서 완전히 같아야만 ture값을 반환한다.

동등성이라는 개념은 클래스마다 다르다. 참조값을 기준으로 하는지, 입력된 문자값을 기준으로 동등성을 처리하는지... 따라서 사용자의 기준으로 동등성 비교를 사용하고 싶으면 equals() 메서드를 재정의(오버라이딩) 해야한다.

public class User {

    private String id;

    public User(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        User user = (User) obj;
//입력받은 인스턴스가 Object 타입이다. User는 Object의 자식이다.
//user = obj 하려면 다운캐스팅이 필요하다.

        return id.equals(user.id);
//String 타입의 비교는 == 이 아니라 .equals()를 사용한다.
    }

id를 기준으로 동등성을 평가하는 equals() 메서드를 오버라이딩하였다.

public class Main {

    public static void main(String[] args) {
        User user1 = new User("id-100");
        User user2 = new User("id-100");

        System.out.println("identity = " + (user1 == user2));
        System.out.println("equality = " + user1.equals(user2));

    }
}
출력값.
identity = false
equality = true

두 객체는 String id 값은 동일하지만 참조값이 다르므로 == 연산자를 활용한 identity 는false를 반환하였다.
User 클래스에서 id를 기준으로 동등성을 비교하는 equals()메서드를 오버라이딩 하였다. 두 객체의 id는 같으므로 equality는 true 값이 반환된다.

간단히 equals()를 오버라이딩 한 것이다.
하지만 우리의 인텔리J는 equals() 메서드를 자동으로 정의해주는 편의를 넣어주었다. (감사합니다..)

단축키. art + insert -> equals() 선택

동일성 비교가 항상 필요한 것은 아니다. 동일성 비교가 필요한 경우(위와 같은 경우)에만 equals() 메서드를 단축키를 통해 재정의(오버라이딩)하자

profile
꼬질이

0개의 댓글