'equals 와 =='에 해당되는 글 1건
- 2008.08.14 [아시나요?]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임을 다시한번 확인
'My work space > Java' 카테고리의 다른 글
자바를자바답게하는클래스[StringTokenizer클래스] (0) | 2008.08.14 |
---|---|
자바를자바답게하는클래스[StringBuffer클래스] (0) | 2008.08.14 |
자바를자바답게하는클래스[String클래스] (0) | 2008.08.14 |
JAVA Garbage Collection에 대한 소개와 메모리 Tuning (0) | 2008.08.14 |
[아시나요?]main()메소드에 관하여 (0) | 2008.08.14 |