20230227 [Java] String 클래스는 왜 equals 오버라이딩을 해주지 않나요? 엥 이미 되어 있잖아!

Daisy🌷·2023년 2월 27일
0

equals 메서드

  • 어떤 두 참조 변수의 값이 같은지 다른지 동등 여부를 비교해야 할 때 사용하는 것이 equals() 메서드이다.
  • 대표적으로 String 타입의 변수를 비교할 때 가장 많이 거론되는 메서드일 것이다.
  • 그러면 문자열이 아닌 클래스 자료형의 객체 데이터일 경우 equals() 메서드는 어떻게 다뤄질까?
  • 어렵게 생각할 필요없다! 비교할 대상이 객체일 경우 객체의 주소를 이용하여 비교한다.
  • 즉, 객체 자체를 비교할 때는 ==이나 equals()나 똑같다고 보면 된다.

equals 오버라이딩

  • 객체 자료형을 비교할 때 주소 값이 아닌 객체의 필드 값을 기준으로 동등 비교 기준을 변경하고 싶다면 equals 메서드를 오버라이딩해서 주소가 아닌 필드 값을 비교하도록 재정의해주면 된다.

String 클래스의 equals 오버라이딩

  • 원래 equals() 메서드는 객체의 주소값을 기준으로 동등 비교를 한다고 했었다.
  • 문자열을 저장하는 String 클래스도 사실 객체 타입이기 때문에 예외가 없다. 즉, 원래대로라면 문자열 값이 아닌 주소값을 비교하게 되어있다.
  • 하지만 String의 equals() 메서드가 문자열 값으로 비교한 이유는 실제 자바의 String 클래스에도 equals() 메소드를 살펴보면 equals가 재정의 되어있어 그런 것이다.

Object 클래스의 equals()

  • equals()는 최상위 클래스인 Object에 포함되어 있기 때문에 모든 하위 클래스에서 재정의하여 사용 가능하다.
public boolean equals(Object obj) {
        return (this == obj);
    }

String 클래스의 equals()

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
  • 먼저 equals()변수로 들어온 객체가 자기 자신과 주소값이 같으면 true를 리턴한다. 주소 값이 다르다면 String 객체의 문자열을 Char 타입으로 하나씩 비교해 보면서 끝까지 같다면 true를 리턴, 다르다면 false를 리턴한다.
  • String 클래스에는 처음부터 equals()가 문자열을 비교하게 재정의되어 만들어져 있기 때문에 문자열 비교가 가능했던 것이다.

한 줄 정리!

==는 주소같이 같은지 아닌지 비교하는 것이고, equals() 메서드도 내부적으로 주소값을 비교하지만 String 클래스에서는 equals()를 재정의하여 내용을 비교하도록 되어 있다.

profile
티스토리로 블로그를 이전했습니다. 😂 구경 오세요! 👉🏻 https://u-ryu-logs.tistory.com

0개의 댓글