[Java] 문자열과 String클래스

김용준·2022년 9월 13일
0

Java Basic

목록 보기
10/22

비교 연산자 ==를 다룰 때, 문자열을 비교하고자 한다면 비교 연산자==보다는 equals()메소드를 사용해야한다고 했었다. 그 이유에 대해 보다 자세히 알아보도록 하자.

문자열 생성

Java에서는 문자열을 생성하는 방법이 아래와 같이 두 가지가 있다. 첫 번째 방법은 리터럴 생성 방식이고, 두 번째는 new 연산자를 통해 생성하는 방법이다.

String name1 = "Java"
String name2 = new String("Java")

두 방법은 "Java"라는 문자열이 메모리에 할당되는 영역에 서로 차이가 있다. 리터럴 생성 방식은 문자열이 String Constant Pool에 할당이 되고, 객체를 생성하는 방법은 Heap영역에 할당이 된다.

Java의 메모리 영역에 대해서는 나중에 자세히 다루기로 하자. 일단 두 방법의 메모리 할당 영역에 차이가 있다는 것만 알아둔다.

아래 그림과 같이 리터럴 생성방식은 문자열의 내용이 같다면 같은 객체를 참조하게 된다. 즉, 변수이름이 달라도 같은 주소값을 참조한다. 그러나 new 연산자를 이용한 방법은 문자열이 같아도 서로 다른 객체를 생성한다.


문자열 비교

문자열 비교에는 두 가지 방법이 있다. 비교 연산자 ==를 이용하는 방법과 String클래스의 equals()메소드를 이용하는 방법이다.

비교 연산자==는 참조변수에 대해 변수의 주소값을 비교한다. 따라서 리터럴로 생성한 문자열은 내용이 같다면 연산결과가 true이지만 new연산자로 생성한 문자열은 내용이 같아도 각각의 주소값을 가지므로 연산결과가 false이다.

반면, equals()메소드는 주소가 아니라 문자열의 내용을 비교한다. 따라서 어떤 방식으로 생성한 문자열이든 연산결과는 true이다.

public class StringDemo {

	public static void main(String[] args) {
		
		String str1 = "Java";
		String str2 = "Java";
		String str3 = new String("Java");
		String str4 = new String("Java");

		// == 연산자는 참조변수에 대해서 변수의 주소값을 비교한다.
		System.out.println(str1 == str2);		// true. str1과 str2는 같은 주소값을 가진다.
		System.out.println(str3 == str4);		// false. str3과 str4는 서로 다른 주소값을 가진다.
		System.out.println(str1 == str3);		// false. str1과 str3은 서로 다른 주소값을 가진다.
		
		// equals() 메소드는 참조변수가 참조하는 String 객체의 문자열을 비교한다.
		System.out.println(str1.equals(str2));	// true. str1과 str2는 내용이 동일한 문자열을 가진다.
		System.out.println(str3.equals(str4));	// true. str3과 str4는 내용이 동일한 문자열을 가진다.
		System.out.println(str1.equals(str3));	// true. str3과 str4는 내용이 동일한 문자열을 가진다.
	}
}
profile
차선이 모여 최선이 된다.

0개의 댓글