[JAVA] 문자열 비교하기
JAVA에서 int와 boolean과 같은 일반적인 데이터 타입은 ==라는 연산자를 사용하여 비교한다.
하지만 문자열인 String을 비교할 때는 ==이 아닌 equals()라는 메서드를 사용해야 하는데, 이는 어떤 차이 때문일까?
1. String 변수 생성 방법
String 변수 생성에는 아래와 같이 두 가지 방법이 있다.
1) 스트링 리터럴 사용
String str1 = "eden";
2) new 연산자 사용
String str2 = new String(eden);
이 두 가지 방법에는 큰 차이점이 있는데, 1번과 같이 리터럴을 사용하게 되면 이 러터럴은 String Constant Pool, 문자열 상수 풀이라는 곳에 저장되며 이미 존재하는 문자열을 새로운 변수에 담아 선언할 경우 같은 주소를 가리키게 된다.
String str1 = "eden"; // 100번지 주소에 저장
String str2 = "Hello"; // 200번지 주소에 저장
String str3 = "eden"; // 동일한 문자열이 저장된 100번지 주소를 가르킴
그러나 2번과 같이 생성된 String 객체는 동일한 문자열이라 해도 new 연산자에 의해 생성된 다른 객체들과 동일하게 Heap 메모리에 독립적으로 저장된다.
String str1 = "eden"; // 100번지 주소에 저장
String str2 = "Hello"; // 200번지 주소에 저장
String str3 = "eden"; // 300번지 주소에 새로이 저장
2. == 연산자
== 연산자는 두 개의 대상이 참조하고 있는 주소값을 비교하기 때문에 int, boolean과 같은 기본형 타입(primitive type)은 기본적으로 대상에 주소값을 가지지 않으므로 값 자체로써 비교가 가능하지만 참조형 타입(reference type)인 String에 대해서는 주소값을 비교한다.
public class exam {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
System.out.println("str1 == str2 : " + (str1 == str2));
String str3 = new String("Hello");
System.out.println("str1 == str3 : " + (str1 == str3));
}
}
위와 같이 리터럴을 사용하여 생성된 str1과 str2, 두 객체는 동일한 주소를 가리키고 있으므로 true를 리턴하지만 생성자를 사용하여 생성된 str3 객체는 Heap 메모리에 독립적으로 생성된 객체이므로 str1, str2가 가리키는 주소와는 다르기 때문에 false를 리턴한다.
public class exam {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println("str1 == str2 : " + (str1 == str2));
}
}
위와 같이 str1과 str2, 두 객체 모두 생성자를 사용하여 생성되었지만 서로 다른 주소를 가리키고 있으므로 false를 리턴한다.
3. equals() 메서드
equals() 메서드는 객체가 가진 값 자체를 비교할 수 있으며 최상위 클래스인 Object 클래스에 내장되어 있기 때문에 모든 하위 클래스에서 오버라이드(재정의)하여 사용할 수 있다.
public class exam {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = new String("Hello");
String str3 = new String("Hello");
System.out.println("str1.equals(str2) : " + (str1.equals(str2)));
System.out.println("str2.equals(str3) : " + (str2.equals(str3)));
}
}
str1과 str2가 서로 가리키는 주소는 다르지만 값 자체는 "Hello"로 동일하므로 true를 리턴, 마찬가지로 str2와 str3 또한 가리키는 주소는 다르지만 값은 동일하므로 true를 리턴한다.
이와 같이 문자열은 생성하는 방법에 따라 가리키는 주소가 달라지므로 데이터 값 자체를 비교하는 eqauls() 메서드를 이용하여 비교하도록 합시다 🙆
Author And Source
이 문제에 관하여([JAVA] 문자열 비교하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leeeden/JAVA-문자열-비교하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)