개발이 너무 어려운데 일단 해볼게요.

Java & Spring

[Java] String .intern()

산당 2021. 6. 21. 14:47

며칠전 알고리즘 스터디 모임에서 참여자 한 분께서 

문자열 비교를 == 연산자로 했다가 프로그래머스에서 통과되지 않아 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