본문 바로가기

개발/Java,Jsp

[Java/Jsp] String 비교 ==, equals() 차이점

필자가 개발 공부를 시작한 지 얼마 안됐을 때, 비교 연산자 "==" 만으로만 모든 비교를 하려고 했다.

String 또한 마찬가지로 if (str1 == str2) 문을 작성했는데 값이 같은데도 불구하고 계속 false 처리가 됐다.

나중에 되어서야 equals() 함수를 사용해야 한다는 걸 알았지만 그 때는 두 방법의 차이점을 알지 못했다.

 

먼저, ==와 equals()함수의 차이점을 알기 위해선 String의 생성 방식과 메모리 구조에 대해 알아야 한다.

메모리 구조는 나중에 상세히 다루기로 하고 이번 편에서는 String을 생성하면 Heap에 저장된다 라고만 알고 있으면 된다.

그럼 String의 생성 방식부터 알아보자.

 

 

 

String 생성 방식


Java에서 String의 생성 방식은 크게 2가지가 있다.

먼저 리터럴을 통해 String을 생성하게 되면 Heap 영역 안에 있는 String pool 영역에 저장된다.

리터럴을 통해 생성하면 String 내부적으로 intern()이라는 함수를 호출한다.

intern() 함수는 저장하고자 하는 문자열을 String pool영역에서 검색하여,

문자열이 String pool 영역에 있다면 해당 주소값을 리턴하고, 없으면 새로운 주소값을 리턴한다.

 

그리고 new String()를 통해 String을 생성하면 Heap 영역에 저장된다.

String str1 = "aaa";
String str2 = "aaa";
String str3 = new String("aaa");

위 코드는 각각 리터럴과 new String()으로 String 객체를 생성한 코드이고,

리터럴로 생성한 str1, str2String pool 영역에 저장될 것이며, str3Heap 영역에 저장될 것이다.

그럼 차례대로 어떻게 메모리에 올라오는 지 확인해보자.

 

String 생성

 

먼저 str1String pool 영역새로 메모리를 할당받아 "aaa"값이 저장된다.

str2는 이미 "aaa"값이 String pool 영역에 올라와 있기 때문에 새로 메모리를 할당하지 않고 "aaa"의 주소를 참조한다.

마지막으로 str3Heap 영역새로 메모리를 할당받아 "aaa"값이 저장된다.

 

그렇다면 실제로 위와 같이 저장되는 지 주소값을 출력해보자.

 

주소값

str1과 str2의 주소값이 같고 str3은 다른 주소인 것을 확인할 수 있다.

 

 

 

 

==와 equals()의 차이점


결론부터 말하자면,

==는 주소값 비교이고 equals() 함수는 값 비교다.

풀어서 말하자면 ==는 객체가 같은 주소를 참조하고 있는지 비교하는 것이고

equals() 함수는 객체가 같은 값인지 비교하는 함수다.

 

위 예제를 통해 간단한 예를 들어보자.

 

System.out.println("str1 == str2 : " + (str1 == str2));
System.out.println("str1.equals(str2) : " + str1.equals(str2));
System.out.println("str1 == str3 : " + (str1 == str3));
System.out.println("str1.equals(str3) : " + str1.equals(str3));

첫 번째는 str1과 str2이 같은 주소값을 참조하고 있으니 true가 나올 것이다.

두 번째는 str1과 str2이 같은 값을 갖고 있어 true가 나올 것이다.

세 번째는 str1과 str3이 다른 주소값을 참조하고 있으니 false가 나올 것이다.

네 번째는 str1과 str3이 같은 값을 갖고 있어 true가 나올 것이다.

 

예상한 대로 값이 나오는지 실제로 출력해보자.

 

값이 잘 나오는 걸 확인할 수 있다.

 


 

Summary

String 생성 방식은 리터럴로 생성하는 방식과 new String()으로 생성하는 방식이 있다.

리터럴로 생성하면 Heap 영역 안에 있는 String pool에 저장된다.

new String()으로 생성하면 Heap 영역에 저장된다.

 

==주소값을 비교하고 equals() 함수는 값을 비교한다.

'개발 > Java,Jsp' 카테고리의 다른 글

[Java/Jsp] MVC 1, MVC 2 차이 및 장단점  (2) 2020.06.20