String 클래스 비교
String 클래스를 비교할 때는 항상 equals 비교를 해야한다.
- 동일성 : == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는 지 확인
- 동등성 : equals 메서드를 사용하여 두 객체가 논리적으로 같은지 확인
public class StringEqualsMain1 {
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("new String() == 비교: " + (str1 == str2));
System.out.println("new String() equals 비교: " + str1.equals(str2));
String str3 = "hello";
String str4 = "hello";
System.out.println("리터럴 == 비교: " + (str3 == str4));
System.out.println("리터럴 equals 비교: " + str3.equals(str4));
}
}
실행결과
=> str1 과 str2는 new String()을 사용해서 각각 인스턴스를 생성하므로 동일성(==) 비교에서 false가 나온다.
그러나 내부의 값은 같은 'hello'를 가지고 있으므로 동등성(equals) 비교에 성공한다.
리터럴은 왜 동일성 동등성 모두 true일까?
문자열 리터럴을 사용하는 경우에 자바는 메모리 효율성과 성능 최적화를 위해 문자열 풀을 사용한다. 자바가 실행되는 시점에 클래스에 문자열 리터럴이 있으면 인스턴스를 미리 생성한다. 이 때 같은 문자열이 있으면 만들지 않는다. str4의 경우 문자열 풀에서 str3과 같은 참조를 사용한다.
문자열 풀 덕분에 같은 문자를 사용하는 경우 메모리 사용을 줄리고 문자를 만드는 시간도 줄어들기 때문에 성능도 최적화 할 수 있다.
* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java 중급] StringBuilder - 가변 String (0) | 2024.08.13 |
---|---|
[Java 중급] String 클래스 - 불변 객체 (0) | 2024.08.13 |
[Java 중급] String 클래스 (0) | 2024.08.12 |
[Java 중급] 불변 객체 - 값 변경 (0) | 2024.08.12 |
[Java 중급] 불변 객체 (0) | 2024.08.12 |