class Main {
public static void main(String[] args) {
String str1 = "Programming"; // true or false
String str2 = "Programming";
String str3 = new String("Programming");
System.out.println(str1==str2); // true
System.out.println(str1==str3); // false
System.out.println(str1.equals(str3)); // true
System.out.println(str2.equals(str3)); // true
}
}
str1==str2: str1과 str2는 모두 문자열 리터럴인 "Programming"을 가리키고 있으며, 자바에서는 문자열 리터럴은 내부적으로 상수 풀(Constant Pool)에 저장되어 재사용됩니다. 따라서 str1과 str2가 동일한 문자열 리터럴을 가리키고 있으므로 true를 출력합니다.
str1==str3: str3은 new String("Programming")을 통해 새로운 문자열 객체를 생성하고 있으며, 이 때 new 연산자를 사용하여 새로운 객체를 생성하면 항상 새로운 메모리 주소를 가리킵니다. 따라서 str1과 str3는 서로 다른 메모리 주소를 가리키고 있으므로 false를 출력합니다.
str1.equals(str3): equals 메서드는 문자열의 내용을 비교합니다. str1과 str3의 내용이 모두 "Programming"이기 때문에 true를 출력합니다.
str2.equals(str3): str2와 str3는 모두 내용이 "Programming"이므로 true를 출력합니다.
결론: == 연산자는 참조 비교를 수행하며, 두 변수가 동일한 객체를 가리키는지 확인합니다. equals 메서드는 두 문자열의 내용을 비교하여 같은지 여부를 확인합니다. 따라서 문자열 비교 시 equals 메서드를 사용하는 것이 일반적으로 안전하고 정확한 방법입니다.
'Backend > JAVA' 카테고리의 다른 글
JAVA에서 html 다루기 (Jsoup) (0) | 2023.08.16 |
---|---|
[JAVA] 패키지와 클래스 (같은 이름의 클래스 import) (0) | 2023.07.25 |
자바 메모리 구조(with Constant Pool) (0) | 2023.07.25 |
Java 객체 형변환 (mapper.convertValue) (0) | 2023.06.14 |
[JAVA] 자바 외부 파일/ 외부 프로그램/ 명령어 실행 (exec) (0) | 2023.04.26 |