String값을 비교할 때는 왜 ==가 아닌 .equals()함수를 써야할까? 그 이유를 알려면 문자열을 저장하는 방법부터 이해해야한다. 우선 우리가 String a = "hi"라고 하였다가 a = "hello"로 한다면 문자열의 값이 바뀌었다고 생각할 수 있지만 사실 그렇지 않다. String은 primitive 자료형이 아니기 때문에 a는 hi라는 객체를 가르키고 있다가 hello라는 객체를 가리키는 것으로 변경된 것에 불과하다.
그러면 String a = "Hi"와 String a = new String("Hi")는 어떤 차이가 있는 것일까? String a = "Hi" 이 방식으로 a를 만들면 이는 intern()함수를 통해 자동으로 String pool이라는 곳에 저장된다. String Pool이라는 것은 이미 만들어진 문자열을 메모리 절약을 위해 중복으로 여러 번 만들지 않고 공통된 하나를 참조하기위해 만들어진 힙 안의 메모리 영역이다. 따라서 중간에 a = "hello"로 바꿔도 기존의 "Hi"가 사라지는 것이 아니라 "hello"가 String pool에 추가되는 것이다. 반면에 String a = new String("Hi")은 String pool이 아닌 다른 heap 공간에 저장된다. 따라서 같은 문자열이더라도 String pool에 저장되었는가 아니면 다른 공간에 저장되었느냐에 따라 String 변수들이 가르키고 있는 값들이 전혀 달라지게 되는 것이다.
이에 따라 문자열들을 비교할 때 단순 ==으로 비교하기가 곤란한 것이다. 왜냐면 문자열 변수들이 가르키고 있는 값들이 내용은 같더라도 전혀 달라질 수 있기 때문이다. 따라서 가르키고 있는 값이 아닌 그 안의 내용물들을 비교하는 .equals()함수를 활용하는 것이 바람직하다.
참조한 사이트 : 아메리카노가 그렇게 맛있답니다 여러분 :: String을 저장하는 두 가지 방법과 String pool (tistory.com)
'자바' 카테고리의 다른 글
JPA 연관관계 (0) | 2022.02.20 |
---|---|
JPA란 무엇인가? (0) | 2022.02.06 |
Spring이란? Spring Boot란? (0) | 2022.01.28 |
JVM이란? 객체지향프로그래밍이란? (0) | 2022.01.23 |
해시맵(Hash Map)이란? (0) | 2022.01.18 |