초보자를 위한 Java 200제 , 중급 066, 189p
package javastudy;
public class StringMain {
public static void main(String[] args) {
String city1="Asia"; // String은 참조타입이지만 new 키워드 사용 안하고 생성 가능
String city2="Europe";
String city3= new String("Asia");
String city7="Asia";
System.out.println(city1);
System.out.println(city1.length());
System.out.println(city1==city2); // Asia == Europe ==> false
System.out.println(city1.equals(city2));
System.out.println(city1==city3); // new 키워드 아닌 Asia == new 키워드 Asia F
System.out.println(city1==city7); // new 키워드 아닌 Asia == new 키워드 아닌 Asia T
System.out.println(city1.equals(city3)); // new 키워드 아닌 Asia.equals(new키워드 Asia) T
System.out.println(city1.equals(city7)); // new 키워드 아닌 Asia.equals(new키워드 아닌 Asia) T
/* .equals() 는 해시 코드를 비교하고 == 는 레퍼런스를 비교한다. */
String city4 = String.format("%s-%s", city1,city2);
System.out.println(city4);
String city5 = city1 + "-" + city2 + 1 + 2;
System.out.println(city5);
String city6 = 1 + 2 + city1 + "-" + city2;
System.out.println(city6);
}
}
보통 자바에서 equals를 사용하여 문자열이 동일한지 확인합니다. 다른 언어와 다르게 ==로 문자열이 같은지 확인하지 않습니다. ==는 object가 동일한지를 체크하기 때문에 object가 갖고 있는 문자열이 동일하다는 것을 보장하지 않기 때문입니다.
new 키워드로 생성한 객체의 stack의 레퍼런스는 같을 수 없다. 또 Heap의 해시코드도 같을 수 없다. 그러나 String은 Heap의 풀을 이용하므로, 같은 문자열에 대하여 new로 생성한 문자열의 Stack 레퍼런스는 다르지만 Heap의 해시코드는 동일하다.
<실행 결과>