[JAVA] 문자열 비교하기

eden·2022년 4월 17일
0

JAVA

목록 보기
3/4

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() 메서드를 이용하여 비교하도록 합시다 🙆‍

0개의 댓글