본문 바로가기
프로그래밍/JAVA

JAVA object equals, String equals 는 뭐가 다를까?

by 애플 로그 2021. 2. 19.
반응형

JAVA object equals, String equals 는 뭐가 다를까?

 

 

equals()

두 객체의 내용이 같은지 확인하는 Method

 

1. 객체를 비교해보자

public static void main(String args[])
{
        User user1 = new User("shlee", 20);
        User user2 = new User("shlee", 20);
        System.out.println(user1.equals(user2));
         // 결과는 false
}


public class User
{
    private String name;
    private int age;

    public User(String name, int age)
    {
        this.name = name;
        this.age = age;
    }
}

 

이게 아무리 봐도 의미상 내용이 같은 객체인데 user1과 user2는 같다고 봐야하는데,

비교시에 false가 나온다.

결과값이 왜 false 일까??

 

1-1. object class의 equals 함수를 사용하기 때문이다.

// Object class의 내용을 확인해보자

    public boolean equals(Object obj) {
        return (this == obj);
    }

 

Object 의 equals 함수는 코드를 보면 "==" 비교이다.

즉 주소값 비교로 되어 있다.

 

 

2. String을 비교해 보자

String을 두가지 방식으로 비교해보고 object의 equals와 어떻게 다른지 확인해보자.

 

 

1) 문자열 리터럴 비교

        String aa = "cc";
        String bb = "cc";
        System.out.println(aa.equals(bb)); 
        
        //결과 true

"cc"라는 문자열 리터럴을 사용하여 String aa = "cc";와 String bb = "cc";를 선언하면, 자바는 문자열 리터럴 풀(String literal pool)이라는 공간에 해당 문자열을 할당한다. 

 

따라서 aa와 bb는 문자열 리터럴 풀에서 동일한 주소값을 참조하게 됩니다. 이는 문자열 리터럴이 동일한 경우에만 가능한 문자열 풀의 장점입니다. 따라서 aa와 bb는 동일한 주소값을 참조하므로, 주소값 비교를 통해 aa.equals(bb)의 결과가 true가 된다.

 

 

2) 문자열 객체 비교

String aa = new String("cc");
String bb = new String("cc");
System.out.println(aa.equals(bb));

 new String("cc")를 사용하여 String aa = new String("cc");와 String bb = new String("cc");를 선언하면, 각각의 new 연산자에 의해 새로운 문자열 객체가 메모리에 생성이 된다.

 

따라서 aa와 bb는 서로 다른 주소값을 가지며, 서로 다른 객체를 참조하게 됩니다. 하지만 경우에도 equals() 메서드는 문자열의 내용을 비교하므로, aa.equals(bb)의 결과는 true가 된다. 주소값은 다르지만 문자열의 내용이 동일하기 때문이다.

 

2-1. String class의 equals 함수

 

한줄 정답은 String의 equals는 재정의( 오버라이드 ) 되어 있기 때문이다.

즉 object equals와는 코드가 다르다.

 

1. 파라미터와 주소값을 비교

2. 파라미터과 문자열를 비교

 

    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;
    }

 

모든 클래스는 Object의 equals 를 상속 받고 있고,

String class는 Object의 equals를 재정의 했다고 할수 있다.

 

댓글