Java에서 int, boolean 등의 데이터 비교는 == 연산자를 이용해 비교합니다.
String 객체를 비교할 떈 == 연산자와 equals() 메서드를 사용하는 방법이 있는데 이 두 방법의 차이점을 정리하고자 합니다.
1 String 객체 생성 방법
==와 equals()에 대해 비교하려면 String 객체를 생성하는 방법 두 가지를 알고 있어야 합니다.
String str1 = "Hello"; // 리터럴 방식
String str3 = new String("Hello"); // new 키워드 방식
1.1 리터럴 방식으로 String 객체 생성
리터럴 방식은 문자열을 변수에 대입하여 초기화 하는 방법입니다.
String str1 = "Hello";
String str2 = "Hello";
리터럴 방식을 사용하면 문자열 리터럴 "Hello"는 String Constant Pool 영역에 저장됩니다.
💡Constant Pool (상수 풀)
상수 풀은 힙 메모리의 한 부분으로, 자주 사용하는 리터럴을 저장하고 재사용한다.
그림으로 이해하면 힙 메모리의 한 부분에 String Constant Pool 영역이 존재하고 그 안에 Hello 문자열 리터럴이 할당되는 것입니다.
❓만약 str1과 str2처럼 동일한 문자열 "Hello" 리터럴이 여러 번 사용된다면?
String Constant Pool에 Hello가 2번 할당되는 게 아니라 이미 존재하는 "Hello"를 재사용합니다.
즉, 저장된 동일한 문자열 리터럴을 공유하는 것입니다.
1.2 new 키워드 방식으로 String 객체 생성
new 키워드를 사용해 생성한 String 객체는 힙 메모리에 저장되어 별도의 인스턴스가 됩니다.
String str3 = new String("Hello");
String str4 = new String("Hello");
그림으로 이해하면 String Constant Pool 영역이 아닌 Heap Memory 영역에 저장되고 동일한 문자열이지만 다른 객체로 구분됩니다.
2. String 객체 비교 방법
String 객체를 비교하는 방법은 == 연산자, equals() 메서드 사용하는 두 가지 방법이 있습니다.
1. ==
- 두 객체가 동일한 메모리를 참조하고 있는지 비교
2. equals()
- 두 객체의 내용이 동일한지 비교
2.1 == 연산자로 비교하기
== 연산자의 경우 두 객체가 동일한 메모리를 참조하고 있는지, 즉 같은 주소를 가지는지 확인합니다.
2.1.1 리터럴 == 리터럴
리터럴 방식의 두 객체는 String Constant Pool영역에 존재하는 Hello를 참조하고 있어 같은 주소값을 가집니다
결과는 true
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
그림으로 표현하면 리터럴 방식 설명할 때의 그림과 동일하겠죠!
2.1.2 리터럴 == new
리터럴 방식의 객체 str1은 String Constant Pool영역에 저장되고
new 키워드 방식의 객체 str3은 Heap 영역에 저장됩니다
당연히 두 객체의 다른 주소값을 가지고 결과는 false
String str1 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str3);
2.1.3 new == new
new로 생성한 객체들은 Heap영역에 저장되지만 자신만의 주소값을 가지고 있어 결과는 false
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str3 == str4);
2.2 equals() 메서드로 비교하기
equals() 메서드는 두 객체의 내용이 동일한지 비교합니다.
즉 객체의 메모리 주소가 아닌 객체가 가진 문자열 값을 기준으로 비교합니다.
리터럴 객체, new로 생성한 객체를 equals()로 비교하면 모두 true가 나오는 것을 볼 수 있습니다
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
System.out.println(str3.equals(str4)); //true
[참조] StringBuilder와 StringBuffer는 무슨 차이가 있는가?
'Programming > Java' 카테고리의 다른 글
[Java] 함수형 인터페이스 #Functional Interface (0) | 2024.08.20 |
---|---|
[Java] 람다 표현식이란? #람다식 #Lambda (0) | 2024.08.20 |