*JAVA*

[java] StringPool

깐부로부터 2022. 2. 7. 22:46

자꾸 까먹는거 위주로 메모...

 

String 클래스 
- 불변클래스

 

toString()

: Object의 메소드로 원래는 16진수형태의 주소값이 반환되나 String 클래스에서는 실제 담겨 있는 문자열이 반환되도록 오버라이딩 되어있다.

 

cf. 배열의 경우, to String() 참조하는 주소값 반환

따라서 Arrays.toString(배열) 써야 안에 값이 출력됨

 

 

 

 

hashCode()

: Object의 메소드로 원래는 16진수의 주소갑을 10진수 형태로 변환해서 int형으로 리턴해주는 메소드

But, String 클래스에서는 주소값을 변환해주는 것이 아닌, 실제 담긴 문자열을 기반으로 해시코드값을 만들어 반환

=> 실제 문자열을 주소값 10진수 정수형태로 반환하도록 오버라이딩! 

 

cf. String의 진짜 주소값을 알고싶다면  System.identityHashCode(참조변수명); //String 클래스 한정

 

 

생성자를 통해 문자열을 담았을 경우에 한해서.. 죽었다 깨어나도 절대  생성자를 통해서 문자열 생성하지 말것!!!!!!!!

 

 

 

 

 

 

★문자열 생성할땐 무조건 절대적으로 리터럴로 생성할것!!!!!!★

 

 

 

왜???

자바에서는 String Pool이라는 것을 제공하는데

리터럴형식으로 문자열이 생성될때 String Pool안을 확인해보고 같은 문자열이 없으면 Pool안에 새로이 문자열을 생성을 해준다. 

(new 생성자로 생성시엔 Pool영역안에 들어가지 않고 그냥 heap영역에 생성된것, 따라서 메모리낭비가 발생한다!)

만약 같은 문자열 있다면 그냥 그것을 그대로 갖다 쓴다. 때문에 위해서 리터럴로 생성한 같은 문자열의 찐주소는

같은 것이 출력된 것이다. (String들은 그냥 Pool안에서 논다.)

=> 새로 객체를 만들어도 공간(메모리)을 낭비하지 않도록 하기 위한 시스템

 


String클래스가 불변 클래스인 이유

같은 String str 변수에 또다시 "goodbye"를 대입하면

기존의 "hello"를 참조하던 주소값을 버리고 새로이 "goodbye"의 참조값을 변수에 대입하게 된다.

힙영역에 홀로 버려진 "hello"데이터는 가비지 컬렉터가 훗날 주워감... 

=> str변수가 참조하는 주소의 값을 변경할 수는 지만 아예 참조하는 주소값을 변경할 수 는 있다.

그래서 값을 변경할 수 없다 하여 불변클래스

 

 

 

기존의 문자열에 문자열이 더해지는 격이 아니라 더한값의 문자열을 힙영역에 매번 새로 생성하기때문에 주소값이 계속 바뀌어 출력 되는 것이다.