[Java] 문자열 비교하기 equals()와 ==

이병수·2024년 1월 3일
0

Java

목록 보기
11/27
post-thumbnail
post-custom-banner

문자열 비교


String studentName1 = "abcd";
String studentName2 = "abcd";

boolean isTrue = studentName1.equals(studentName2); // true? false?

문자열을 비교할 때, equals() 메서드와 == 의 차이에 대해 궁금한 적이 있다.

일단 정리하자면

== 연산자

비교하고자 하는 두개의 대상의 주소값을 비교


String 클래스의 equals() 메서드

비교하고자 하는 두개의 대상의 값 자체를 비교


기본 타입으로 int, double, char 형등은 그 자체의 값, Call by Value 형태로 가지고 있기 때문에 주소값이 없다.

하지만 String은 클래스 타입이므로 주소값이 부여되는, Call by Reference 형태를 가지고 있다.

String name1 = new String("abcd");
String name2 = new String("abcd");

그렇기 때문에 현재 name1와 name2의 주소값이 서로 다르게 된다.

이럴 경우 값 자체를 비교하는 메서드인 String.eqauls() 메서드를 사용하여 비교하면 된다.

String name1 = new String("abcd");
String name2 = new String("abcd");

boolean isTrue = name1.equals(name2); // true

하지만 또 다른 중요한 것은 String 변수 생성 시 주소 할당에 대한 것이다.

위에서는 new 연산자를 이용한 방식이고, 또 다른 방법은 리터럴을 이용한 방식 이다.


  • 리터럴을 사용하게 되면 heap 영역 안의 String pool이라는 영역에 생성하게 된다.

  • 그래서 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출된다.

  • intern() 메서드는 주어진 문자열이 string constant pool 에 존재하는지 검색하고 있다면 그 주소값을 반환, 없다면 해당 풀에 넣고 새로운 주소값을 반환한다.

String name1 = "abcd";
String name2 = new String("abcd");

boolean isTrue = (name1==name2) ? true : false;   // false

그렇기 때문에 이때는 false값을 반환한다.


참고

https://velog.io/@ilil1/%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-equals%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://studywithus.tistory.com/88

profile
백엔드 개발자가 되고 싶어요
post-custom-banner

0개의 댓글