728x90
반응형
자바에서 문자열을 비교하는 방법을 알아보고 왜 알아보게 되었는지 적는다.
문제 풀이 중에 문자열을 ==로 비교하게 되면 false가 나는 경우가 있어 찾아보게 되었다.
변수 선언
-- 리터럴 선언
String str1 = "Programming";
String str2 = "Programming";
-- new 연산자 선언
String str3 = new String("Programming");
String str4 = new String("Programming");
- 리터럴 선언: 리터럴을 사용하는 가장 큰 장점은 메모리의 효율성이다. 메모리에서 이미 해당값을 가지고 있어 별도로 객체 생성할 필요가 없다. 동일한 리터럴을 컨스턴 풀에서 하나의 참조로 관리되기 때문에 같은 내용의 문자열을 여러 번 사용해도 추가적인 메모리 할당이 발생하지 않고 동일한 값을 바라본다.
리터럴을 사용할 경우 간단하고 직관적이며 성능상 이점이 있고 불변성을 보장하여 데이터의 신뢰성을 보장하고 동시성 문제를 방지한다. - new 연산자: 각 객체가 독립적인 메모리 공간을 차지한다. 객체를 생성할 때 힙(Heap) 영역에 저장되며 다른 주소값을 받는다. 동일한 문자열이라도 각각 다른 객체로 취급되며 메모리 사용량이 늘어난다. 하지만 실행시간에 동적으로 문자열을 생성하고 수정할 수 있는 유연성을 제공한다.
동적으로 변하는 데이터 처리를 위해선 불변성을 가지지 않는 객체가 필요한 경우 사용된다.
==
String str1 = "JAVA";
String str2 = "JAVA";
String str3 = new String("JAVA");
String str4 = new String("JAVA");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str3 == str4); // false
- ==는 기본 자료형과 객체의 비교에 사용되며 기본 자료형의 경우 값을 비교하고, 객체의 경우 참조값을 비교한다.
equals()
String str1 = "JAVA";
String str2 = "JAVA";
String str3 = new String("JAVA");
String str4 = new String("JAVA");
System.out.println(str1.equals(str3)); // true
System.out.println(str2.equals(str3)); // true
System.out.println(str1.equals(str4)); // true
System.out.println(str2.equals(str4)); // true
System.out.println(str3.equals(str4)); // true
- equals()는 주소값이 다르더라도 문자열의 내용을 비교하므로 equals()로 비교하게 되면 true를 반환한다.
- 하지만 null을 비교하게 된다면 달라진다.
null
String str5 = "JAVA";
String str6 = null;
System.out.println(str5.equals(str6)); // false
try {
System.out.println(str6.equals(str5)); // NullPointerException
} catch (NullPointerException e) {
System.out.println(e.getMessage() + "은 안돼"); // null은 안돼
}
- null 값이 equals()의 매개변수로 null 값이 들어와도 가능하지만 null.equals(값) 은 불가능하다.
- NullPointerException 없이 null 값을 비교하려면 java.util.Objects 의 equals(값1, 값2)를 사용하면 된다.
import java.util.Objects
System.out.println(Objects.equals(str5, str6)); // false
System.out.println(Objects.equals(str6, str5)); // false
compareTo()
String str7 = "Hello";
String str8 = "hello";
System.out.println(str7.compareTo(str8)); // -32
- compareTo() 는 사전순으로 비교한다. 두 문자열은 각 유니코드값으로 변환되고 문자열이 같으면 0, 다르면 음수나 양수로 반환된다.
- 음수면 비교값보다 앞에 있고 양수면 뒤에 있다.
System.out.println(str7.compareToIgnoreCase(str8)); // 0
- 대소문자 상관없이 비교하려면 compareToIgnoreCase()를 사용하면 된다.
728x90
반응형
'개발 > JAVA' 카테고리의 다른 글
JAVA-LOMBOK 롬복 (0) | 2024.11.13 |
---|---|
JAVA-ORACLE 연동 feat.IntelliJ (0) | 2024.05.14 |
[annotation] @Autowired와 @Qualifier (0) | 2024.04.24 |
25. JAVA JDBC (Java Database Connectivity) - 3 (0) | 2020.06.08 |
24. JAVA JDBC (Java Database Connectivity) - 2 (0) | 2020.06.08 |