String 클래스에는 선언하는 방법이 두가지있다
위 사진의 첫번째 방법이 우리가 흔히 사용하던 방법이고
두번째 방법이 객체를 생성해서 Heap메모리에 저장하는 방법이다
두 방식의 차이점은
첫번째 방식은 상수 풀(String pool) 이라는 곳에 저장하는 방식이고
두번째는 Heap 메모리에 저장하는 방식이라서
서로 다른 주소에 저장된다는것이 다른점이다
이를 확인하기 위한 코드를 작성해보자.
먼저 객체를 생성하는 방식의 두 변수 str1 과 str2의 주소를 비교해보았다
heap메모리에 저장하는 방식은 생성될때마다 새로운 주소에 저장하기때문에
서로 다른주소라고 출력된다
그렇다면 바로 선언하는 방식은 어떨까?
바로 선언하는 방식은 String클래스에서 tostring 메소드가 작동하는방식이라서
string pool이라는 곳에 저장이된다 string pool에서는 한번 들어온 문자열을 저장하는방식이라서
그 저장된값은 불변으로 새로운 변수가 선언이되도 그 주소를 재활용하는 기능을 하게된다
따라서 str3 와 str4는 같은 주소값을 가지게된다고 출력이된다.
객체로 선언한 str1과 그냥 선언한 str4를 equals로 비교한다면 어떻게될까?
equals는 문자열 값으로 비교하는 기능이기때문에 주소값은 상관없이
결과값만 같다면 true를 출력하게된다
따라서 str1과 str4는 true라고 출력하게 된다.
String buffer
String 타입은 객체를 생성할때 값을 변경하려면 메모리 주소를 변경해야한다
이럴때에 메모리 소비를 줄이기 위해서 String buffer를 활용하면된다
위와 같이 StringBuffer 타입 bufferStr이라는 변수를 선언하고 Hello라는 매개변수를 입력하고
출력하면 정상적으로 Hello라는 메세지가 뜬다
그렇다면 내가 문자를 더해서 HelloWorld라는 문자로 바꾸면 주소가 바뀔까?
알아보기위해 buffer의 메소드 .append를 활용하여 str2("World")를 추가해보자
다시 출력해보면 HelloWorld가 출력이된다
주소값을 출력해보면 똑같은 주소가 뜬다
이와 같은 사실로 StringBuffer가 문자를 변경할때엔 효율적이란것을 알수있다.
'Java' 카테고리의 다른 글
예외 처리 (0) | 2024.05.02 |
---|---|
Object 클래스 (1) | 2024.04.29 |
인터페이스 (0) | 2024.04.26 |
추상클래스 (1) | 2024.04.26 |
다형성의 활용(연습문제) (0) | 2024.04.24 |