'equals 와 =='에 해당되는 글 1건

  1. 2008.08.14 [아시나요?]equals 와 ==
2008. 8. 14. 17:45

[아시나요?]equals 와 ==

==를 자바의 기본 변수에 사용할 경우는 매우 잘 작동하지만, 이것을 객체에 사용하면 조금 이상한 동작을 한다.


String st1 = "abc";

String st2 = "abc";

System.out.println(st1==st2);             //XX1


String st3 = new String("abc");

String st4 = new String("abc");

System.out.println( st3 == st4 );         //xx2


System.out.println( st1 == st3 );         //xx3


출력결과는 다음과 같다.

xx1    true

xx2    false

xx3    false


==를 객체에 사용하면 단순히 메모리의 주소만을 비교한다는 사실은 이미 알고 있을 것이다. xx1행의 결과가 true인 이유이기도 하다. 그런데 xx2번부터 문제가 발생한다. 분명히 같은 문자열을 가지고 있으나 결과는 false이다. = 가 단순히 메로리의 주소만 비교하기 때문에 비록 같은 내용의 문자열일지라도 메모리의 주소가 다르면 앞과 같이 잘못된 결과를 출력하게 된다. 그래서 객체의 값을 비교할 때는 ==를 사용하지 않고 equals()메소드를 사용한다.


equals() 는 모든 클래스의 시조인 Object 클래스의 메소드이기 때문에 어떤 클래스라도 이 메소드를 사용할 수 있다. 그러나 Object 클래스에 선언되어 있는 equals() 메소드는 ==와 같이 메모리의 주소만 비교할 뿐이다. 이렇게 Object 클래스의 euqals()메소드가 단순히 주소만 비교하는 이유는 '같다'라는 기준이 각 객체마다 다르기 때문이다. 컴퓨터에서 '같다'는 의미 CPU의 속도가 같음을 나타낼 수 있고. 자동차에서 '같다'는 의미는 차량의 색상이나 모델이 같음을 나타낼 수도 있는 것이다.


이렇듯 객체마다 그 의미가 달라지기 때문에 Object 클래스에서는 equals() 메소드를 정확하게 구현할 수 없는 것이다. 그래서 객체에 equals() 메소드를 재대로 사용하기 위해서는 그 클래스에 맞게 equals() 메소드를 오버라이딩해 주어야만 한다. 즉객체를 정확하게 비교하기 위해서는 그 클래스에 맞게 equals() 메소드를 오버라이딩해 주어야만 한다. 즉 객체를 정확하게 비교하기 위해서는 그에 맞는 equals() 메소드를 만들어 주어야 한다 . String 클래스의 equals() 메소드도 문자열을 비교할 수 있도록 오버라이딩한 후에 사용하는 것이다. 다음 예문은 String 클래스의 실제 equals() 메소드이다.


public boolean equals ( Object anObject ) {

        if ( this == anObject ) {

          return true;      

        }


        if( anObject instanceof String ) {

             String anotherString  =  (String)anObject;

             int n = count;

             if ( n == anotherString.count ) {

                  char v1[] = value;

                  char v2[] = anotherString.value;

                

                  int i  =  offset;

                  int j  =  anotherString.offset;

                  while ( n-- !=0 ) {

                     if ( v1[i++] != v2[j++] ) {

                             return false;

                      }

                   }

                   return true;

              }

         }

         return false;

}

----------------------------------------------
Object type임을 다시한번 확인