JAVA,객체지향

String Constant Pool

25G 2021. 12. 2. 11:35

java에서 문자열을 표현할 때는 String을 사용하는데 이 String이란 이름에서 얻을 수 있는 힌트는 첫 글자가 대문자라는 점에서 클래스라는 것을 유추해 낼 수 있다.

String은 Char의 배열 형태 인데 그럼 지금 까지 배운 문법에서는 클래스를 사용하려고 메모리에 띄우기 위해선 new를 해야 한다.

왜 String은 그냥 사용해도 되는 것일까?

분명 같은 문자열을 s1과 s2에 저장을 했는데 왜 false가 나오냐면

java에서는 "=="을 사용해서 비교를 하게 되면 메모리 주소 번지를 비교한다. 즉 s1과 s2의 주소 번지가 다르기 때문에 false가 나온다.

 

처음에 java언어를 개발한 Sun이라는 회사에서 String클래스는 사용빈도가 굉장히 높을 것 같아서 String클래스만 특별히 변수를 초기화하듯이(new 생략해서) 사용할 수 있게 만들어 준 것이다.

왜 이번에는 true를 썼을까? 분명 ==은 주소를 비교하는 문법이라고 했는데 s3와 s4는 같은 주소 번지라는 것일까?

 

String ConstantPool

 

String ConstantPool(상수 풀)이라는 영역이 있다. 다음과 같이 new를 하지 않고 String을 사용하면 String ConstantPool영역에 저장이 되는데 이때 s3의 문자열과 s4의 문자열이 같다면 같은 String ConstantPool영역에 같은 주소 번지에 들어간다.

그렇다면 만약에 s3의 문자열이 달라지면 어떻게 될까?

s3 = s3 +"고기";

가 됐을 때 s4와 다른 문자열이 되기 때문에 s3의 String ConstantPool영역에 주소 번지가 다시 재배치되면서 s3==s4는 false가 된다.

 

가비지 수집 대상

 s3에 문자열을 추가한다면 어떻게 될까?

s3 = s3+"꿀맛";

이렇게 s3에 또 한 번 더 문자열을 추가하면 java에서 기존에 있던 "바다고기"가 저장돼 있던 영역을 두고  String ConstantPool영역에 다시 한번 더 주소 번지를 재배치한다.

이때 기존에 있었던 "바다고기"는 더 이상 필요 없어지기 때문에 "가비지 수집 대상" 이 된다.

가비지 수집대상은 쓰레기 수집대상이라는 뜻인데 java에 가비지 컬렉션이 작동돼서 필요 없는 주소 번지의 데이터를 다시 청소해 주는 것이다.

 

자 그럼 java에서 String의 장점은 같은 문자열은 같은 공간을 공유하기 때문에 메모리 효율이 올라간다

반대로 단점은 문자열을 변경하게 될 때마다 새로운 공간이 할당된다는 점이다. 즉 자주 변경하는데에 좋지 않다는 것

 

 

 

'JAVA,객체지향' 카테고리의 다른 글

소켓통신 개념(포트(port)개념)  (0) 2021.12.02
버퍼(Buffer)란?  (0) 2021.12.02
예외처리란?  (0) 2021.12.01
스레드란?  (0) 2021.12.01
제네릭이란?(와일드카드)  (0) 2021.11.28