며칠전 알고리즘 스터디 모임에서 참여자 한 분께서
문자열 비교를 == 연산자로 했다가 프로그래머스에서 통과되지 않아 equals()로 바꾸어서 통과됐는데
왜 IDE에서는 == 연산자로 통과된건지 물어보셨음.
String 이 배열과 같이 주소를 참조하기 때문에
값을 비교하기 위해서는 equals() 메소드를 사용해야 한다는건 알고있었으나
왜 IDE에서 정상작동 하는지 이유를 몰라서 찾아봄.
String의 생성
알고 있듯이 String은 문자열 객체의 인스턴스 주소를 담고 있는 참조변수이다.
하지면 생성 방식에 따라 생성되는 메모리 영역은 달라지게 된다.
String aa = "abc";
위와 같이 리터럴로 생성하게 되면 aa 변수는 stack 메모리에 생성되고
"abc"라는 값은 heap 메모리 내에 String pool 이라는 곳에 저장되고 그 주소가 aa 변수에 저장된다고 한다.
String pool 에 저장이 될 때는 intern() 메소드가 실행이 되는데
같은 값이 있을 경우 기존의 값의 메모리 주소를, 다른 값일 경우 새롭게 객체를 생성해 값을 저장하고
그 메모리 주소를 리턴한다고 한다.
이 String pool은 HashMap의 형태이기 때문에 중복된 데이터가 저장되지 않는 특징이 있다고 함.
그래서 동일한 문자열의 경우 같은 메모리 주소를 갖게 되는 것
아마 메모리 낭비를 줄이기 위함인듯 하다.
이와 달리 new 연산자를 사용하여 생성한 경우
aa 변수는 stack에 생성되는 건 동일하지만 "abc"라는 값은 일반 heap 메모리 내에 생성되게 된다.
그래서 new 연산자를 사용하여 String 객체를 생성한 경우, 계속 새로운 인스턴스가 생성되게 된다.
결론
String aa = "abc";
String bb = "abc";
if(aa == bb) ----------- true
String aa = new String("abc");
String bb = new String("abc");
if(aa == bb) ------------ false
어쨋건 값을 비교할 때는 equals()를 사용해야 한다.
참조1 : https://aljjabaegi.tistory.com/465
Java String 에 대해 깊게 파고들어 보자~!
Java String 에 대해 깊게 파고들어 보자~! 갑자기 훅! String에 대해 파고들어볼까 합니다. String이 파고들 것이 뭣이 있나? 하시겠지만, 생각보다 깊고 깊습니다.. 그럼! 삽을 들고 파고들어보도록
aljjabaegi.tistory.com
참조2 : https://www.latera.kr/blog/2019-02-09-java-string-intern/
Java의 String.intern() 살펴보기 - Increment
며칠 전에 String 클래스 문서를 정리하면서 intern 메서드에 관해 짧게 다룬 적이 있었습니다. 그 후에 실제로 intern 메서드가 어떻게 동작하는 지 궁금해서 짧게나마 찾아본 내용을 정리해봅니다.
www.latera.kr
'Java & Spring' 카테고리의 다른 글
[Java] 배열의 선언방법 (0) | 2015.10.05 |
---|