참고 : 김영한의 자바 입문 강의 정리한 내용
문자열 비교
문자열이 같은지 비교할 때는 ==이 아니라, .equals() 메서드를 사용해야 한다.
==를 사용하면 성공할 때도 있지만 실패할 때도 있다.
문자열 비교 예시
String str1 = "문자열1";
String str2 = "문자열2";
boolean result1 = "hello".equals("hello"); //리터럴 비교
boolean result2 = str1.equals("문자열1");//문자열 변수, 리터럴 비교
boolean result3 = str1.equals(str2);//문자열 변수 비교
System.out.println("result1 = " + result1);
System.out.println("result2 = " + result2);
System.out.println("result3 = " + result3);
실행 결과
result1 = true
result2 = true
result3 = false
Java에서 문자열 비교할 때 왜 ==가 아닌 .equals() 메서드를 사용해야 하는지? (간단하게)
- 참조(reference)가 아닌 값(value)를 비교하기 때문
- Java에서 == 연산자는 두 객채의 참조(reference)를 비교한다. 즉, 두 객체가 메모리에서 같은 위치를 가리키고 있는지를 확인한다.
- 반면 .equals() 메서드는 객체가 가진 값(value)를 비교한다. 즉, 두 객체가 동일한 데이터를 가지고 있는지 확인한다.
- 문자열 내용 비교
- 문자열 비교에서 중요한 것은 두 문자열이 같은 참조를 가지고 있는지 여부가 아니라, 동일한 내용을 가지고 있는지 여부이다.
- String 클래스에서 .equals() 메서드는 문자열의 각 문자를 비교해서 두 내용이 같은지를 판단한다.
String Pool과의 관계
String str1 = "문자열1";
String str2 = "문자열1";
String str3 = new String("문자열1");
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str3); // false
문자열 리터럴(위의 str1, str2에서 쓰인 "문자열1")은 Java의 String Pool에 저장된다. 동일한 문자열 리터럴은 같은 참조를 가지기 때문에 == 으로 비교해도 true가 나오는 것이고.
그러나 String Pool에 있지 않은 문자열이나 new 키워드로 생성된 문자열은 서로 다른 참조를 가질 수 있어서 == 으로 비교하면 false가 나올 수 있다. 즉, 항상 .equals() 메서드를 사용하는 것이 안전하다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 형변환과 오버플로우, 계산시 형변환 (0) | 2024.08.13 |
---|---|
[Java] 스코프(Scope) (0) | 2024.08.13 |
[Java] 문자열 + 숫자 (0) | 2024.08.09 |
[Java] 변수 타입 정리(자주 사용되는 것과 사용되지 않는 것) (0) | 2024.08.08 |
[Java] 초기화 하지 않은 변수를 읽는다면? (0) | 2024.08.08 |