Java에서 int와 boolean값은 ==를 통해 비교하지만
String같은 Class값의 비교는 equals()메소드를 사용한다.
이를 위해서는 먼저 변수 생성 방식을 비교해야 한다.
- 리터럴을 이용한 방식
- new 연산자를 이용한 방식
위 두 방식의 가장 큰 차이는 저장 영역에 있다.
new를 통해 생성하면 Heap 영역에
리터럴을 사용하면 string constant pool이라는 영역에 저장된다.
이때, 리터럴을 사용시 내부적으로 String의 intern()메소드가 호출되고
주어진 문자열이 string constant pool에 존재하면 그 주소값을 반환하고
없다면 string constant pool에 넣고 새로운 주소값을 반환한다.
== 연산자는 두 개의 주소값을 비교하고
equals 메소드는 두 대상의 값 자체를 비교한다.
equals는 Object에 저장된 메소드로 String 클래스가 오버라이드하여 사용한다.
public class compare {
public static void main(String[] args) {
String s1 = "apple";
String s2 = new String("apple");
if(s1 == s2) {
System.out.println("두개의 값이 같음.");
} else {
System.out.println("두개의 값이 같지 않음.");
}
}
}
위 코드의 실행 결과는 "두개의 값이 같지 않음."이다.
참조 타입의 변수의 값은 힙 영역의 객체 주소이므로 다르다는 결론이 나온다.
public class compare {
public static void main(String[] args) {
String s1 = "apple";
String s2 = new String("apple");
if(s1.equals(s2)) {
System.out.println("두개의 값이 같음.");
} else {
System.out.println("두개의 값이 같지 않음.");
}
}
}
위 코드의 실행 결과는 "두개의 값이 같음."이다.
결국 equals()를 사용하여야 데이터 값을 비교하여 정확한 결과를 얻을 수 있다.
compareTo()는 두개의 문자열을 비교한다.
return의 반환으로 같은지, 어떤 문자가 사전적 순서로 앞에 있는지 까지 나타낸다.