[Java] 자바 문자열 비교 시 주의사항

손주현·2025년 4월 4일
0

Java 기초

목록 보기
4/13
post-thumbnail

자바에서 문자열 비교할 때 ==을 사용하면 안 되는 이유

Java에서 문자열(String)을 비교할 때 흔히 실수하는 부분 중 하나는 == 연산자를 사용하는 것이다.
하지만 ==은 문자열을 비교할 때 내용이 아닌 주소(참조값) 를 비교하므로 정확한 비교가 되지 않는다.


'==' vs '.equals()' 차이

연산자비교 대상설명
==참조(주소)두 객체가 같은 메모리 주소를 가리키는지 비교
.equals()실제 값(내용)두 객체의 내용이 같은지 비교

예제 1: 리터럴 비교 (같은 주소)

  • 문자열 리터럴은 String Pool에 저장되므로 동일한 "hello"를 참조함.
String a = "hello";
String b = "hello";

System.out.println(a == b);       // true (같은 리터럴을 참조)
System.out.println(a.equals(b));  // true

예제 2: new 키워드 사용 (다른 주소)

  • new String()은 새로운 객체를 생성하므로 같은 "hello"라도 주소가 다르다.
String a = new String("hello");
String b = new String("hello");

System.out.println(a == b);       // false (주소 다름)
System.out.println(a.equals(b));  // true (내용 같음)

⚠️ 반드시 .equals() 사용해야 하는 이유

  • ==은 주소 비교 → 값이 같아도 다른 객체면 false
  • .equals()는 값 비교 → 실제 문자열이 같으면 true
String a = "abc";
String b = "abc";
System.out.println(a == b);         // true
System.out.println(a.equals(b));    // true

String c = new String("abc");
System.out.println(a == c);         // false
System.out.println(a.equals(c));    // true

널(null) 안전한 비교 방법

  • .equals()를 사용할 때는 NPE(NullPointerException) 에 주의해야 한다.
  • 문자열이 null일 가능성이 있으면 "문자열".equals(변수) 형태로 비교
String str = null;

// 안전한 방법
"hello".equals(str); // false (null이어도 안전)

// 위험한 방법
str.equals("hello"); // ❌ NullPointerException 발생 가능
profile
Clarinetist.dev

0개의 댓글