Wanna be Brilliant Full-Stack Developer
자바 StringConstantPool 이란? 본문
기본 자료형 Int 와 Char이 있는데 int는 자바에서는 4바이트
char는 문자 하나인데 2바이트이다.
char로 데이터 하나 정의할때는 c= '가'라고 하고 메모리에 2바이트 공간에 이 데이터를 저장을 한다.
String이라는건 첫글자가 대문자로 시작하는데 이것이 힌트가 될 수 있다. 파스칼 표기법 기억나는가?
첫글자 대문자 연결된 문자는 대문자처럼 자바에서 파스칼 표기법을 사용하는건 클래스 밖에 없다.
String은 클래스니까 기본자료형이 아니다. 기본자료형이 아니라는것은 값을 들고 있는것이 아니라
주소를 가지고 있다는것 이다. 크기를 알 수가 없다. 가변적인것들이 주소를 가지고 있다.
String의 원리는 무엇인가? 배열을 배우지 않았는가?
Char배열로 만들어진것이 String이다.
Char라는건 문자를 하나만 저장할 수 있다. Char배열로 만들어진것이 String이다.
실제로 String은 원래 어떻게 쓰는가? 정의가 String s1 = new String("바다");
원래 이렇게 저장해야한다. new했으니까 heap공간에 저장한다.
원래 이것이 String이다.
근데 이 두개를 문자열로 비교를 해보면? s1과 s2가 같은가 물어보면 같지 않다고 나온다.
자바에서 ==는 무엇을 비교하는가? 주소를 비교한다. 이 두개는 주소가 다르다.
new를 두번했기 떄문에 새로운 메모리공간이 만들어지기 떄문이다.
내가 new를 한번하고 new를 한번 더하면 이 메모리 공간이 있으면
이 s1은 바다가 들어가 있고 s2도 바다가 들어 있는데 각 주소가 다르다.
s1과 s2를 비교한다는것은 5000과 100번지를 비교하는 것이기 떄문에 결과가 false가 나온다.
Sun이라는 회사에서 자바를 개발할때 String 사용이 아주 빈번할거같아서
이거를 new하기는 조금 귀찮을 수 있기 떄문에 그래서 어떤 문법을 제공하게 되었냐면
String만 유일하게 new를 하지않고
이렇게 가능하도록 하였다.
근데 여기에서 s3과 s4가 같다고 나오고 있다? 이유를 알아보자!
new를 하지 않고 String의 문법은 전부다 자바에서 이상한 영역이 하나 있다.
이영역을 String 상수 풀이라는곳이 있다.
이곳이 신기한건 무엇이냐면 내가 맨처음에 s3를 바다라고 저장을 하면
s4를 두번쨰로 저장하는데 이 값이 바다인걸 확인하면 같은 값인걸 보고
다른 장소에 가는것이 아니라 s4가 같은곳을 가르키게 한다.
둘다 500번지를 가리키니까 == 하면 같은 값(장소)이라고 true가 나온다.
정확히 몇번지를 가리키는지 궁금하다.
함수중에 hasCode()가 있는데 이걸 출력 해보자!
s3에다가 태양을 더하는 순간 메모리가 어떻게 변하는가하면
이렇게 하는순간 바다태양이라는 문자가 s3에 들어가는데 저 내용이 바다태양으로 바뀌는것이 아니라
새로운 공간이 만들어진다. s3는 바다를 가르키는것이 아니라 바다 태양을 가르킨다.
하나만 더 해보자
그러면 내가 다시 s3에다가 s3 + "달";이라고 하면
s3는 내용이 바다태양달이 되는 21번라인에서 메모리구조가 또 어떻게 바뀌는가 하면
이렇게 하는 순간 s3의 내용이 바뀌는것이 아니라 새로운 공간 바다 태양 달이 생기고
s3가 다른곳을 가르키게 된다.
예전 공간은 더이상 사용이 되지 않는 공간인데 여기는 가비지 수집공간이라고 한다.
쓰레기 수집 대상이라고 한다. 그런것들을 자바에 의해서 가비지 컬렉션이 일어난다.
가비지 컬렉션이라는것이 무엇인가? 쓰레기 수집이 일어나서 애를 메모리에서 깔끔하게 날려준다.
되게 특이하다.
StringConstantPool 장단점을 보자!
장점은 문자열이 같은 문자열이면 같은 공간을 공유해서 쓰기 때문에 메모리에 효율이 좋다.
단점도 있다. 문자열을 변경하게 되면 될때마다 새로운공간에 할당이 된다.
문자열을 자주 변경하게 될 경우에는 새로 만드는것이 좋다.
자주 변경할때느 String을 사용하지 않는것이 좋다.
String대신에 문자열을 차곡저장하기 위해서 String builder라는것을 배울것이다.
문자열을 비교할때 같은지 안같은지 비교할때 s1과 s2 s3 s4 이런걸 동일한지 확인하려고 할때
문자열 비교는 s1.equals라고해서
주소가 같아도 true가 나오고! 값까지 비교한다.
eqauls는 문자열 값자체와 주소 두개를 비교하기 떄문에 문자열을 비교할때는 이것을 사용하는것이 좋다.
'Some Memos > Java' 카테고리의 다른 글
Java BufferedReader란? (0) | 2023.04.13 |
---|---|
자바 버퍼(Stream)이란? (0) | 2023.04.06 |
자바 예외처리( 컴파일, 런타임) (0) | 2023.03.28 |
자바 동기와 비동기가 무엇인가? (0) | 2023.03.28 |
자바 스레드 실습 해보자! (0) | 2023.03.21 |