HwangHub

[Java] 문자열 비교 ==, equals() 본문

DEV-STUDY/Java

[Java] 문자열 비교 ==, equals()

HwangJerry 2023. 6. 28. 13:01

문자열 String

자바에서는 String이라는 객체를 통해서 문자열을 저장한다. 하지만 유독 문자열은 다른 자바 객체와는 다르게 구현되어 있다.

 

인간이 자바를 통해 가장 많이 사용하는 객체인 String은 우리가 일반적으로 객체를 생성할 때 사용하는 new 연산자를 사용하지 않고 바로 문자열 값을 할당하여 사용한다. (new 연산자를 사용해서 객체를 생성할 순 있지만, 권장하지 않는다.)

 

String 변수에 값을 바로 할당하여 생성하는 것을 문자열 리터럴 생성이라고 부른다.

public void string() {
    String name = "lxxjn0"; // 문자열 리터럴 생성
    String name1 = new String("lxxjn0"); // new 연산자를 이용한 문자열 생성
}

 

String Constant Pool이라는 문자열 리터럴만을 위한 공간이 Heap의 일부에 할당되어 있고, String 변수에 문자열 값을 바로 대입하는 경우 String Constant Pool에 저장된다. 하지만, new 연산자를 사용하는 경우에는 다른 객체와 마찬가지로 메모리의 일반적인 heap 영역에 할당된다.

 

public void string() {
    String name = "lxxjn0";
    String name1 = "lxxjn0";
    String name2 = new String("lxxjn0");
    String name3 = new String("lxxjn0");
}

위 코드를 통해 생성된 각 문자열 객체들이 Heap에 어떻게 할당되는지를 표현한 그림은 다음과 같다.

출처 : https://tecoble.techcourse.co.kr/post/2020-09-07-dive-into-java-string/

문자열 비교 연산

문자열은 객체이기 때문에 참조형 타입이다. 따라서 같은 곳을 가리키고 있지 않는 이상 ==연산이 작동하지 않는다. 따라서 name == name1을 수행한다면 true가 나오지만, name==name2를 하면 false가 나오게 되며, name2==name3도 마찬가지로 false가 나오게 된다.

 

따라서 좀 더 안전하고 확실하게 문자열의 내용이 일치하는지 확인하기 위해서는 .equals()을 사용해야 한다.

String name = "hello";
String name1 = new String("hello);

System.out.println(name == name1); 		// false
System.out.println(name.equals(name1)); // true

 

참조:

 

Java의 문자열을 파해치자!

문자와 문자열 자바 프로그램이 실행되는 동안 가장 많이 생성되는 객체가 무엇인지 아는가? 그것은 바로 문자열(String) 객체이다. 문자열은 문자의 배열이다. “abc”라는 문자열은 ‘a’,‘b’,

tecoble.techcourse.co.kr

 

Comments