String | StringBuilder | StringBuffer

한상우·2023년 5월 31일
0

java

목록 보기
13/16

String | StringBuilder | StringBuffer

String


String 클래스는 불변 객체

String 클래스의 문자열을 저장하는 변수가 final 키워드로 되어 있음

따라서 한 번 할당한 문자열은 변경이 불가하고 문자열을 새로 더한다면 새로운 객체가 생성되어 재할당된다

String x = "Hello"; -- 1
x = "Bye"; -- 2
x += "Bye Brother"; -- 3

3가지 x 에는 모두 다른 객체가 들어가 있다. 1번에서 할당한 객체가 2번에서 다른 객체로 할당되면서 힙 메모리에 생성되었던 Hello 객체는 참조가 사라져 GC 에 의해 나중에 제거가 될거다. 이는 메모리 관리 측면에서 좋지 않다.

또한 계속해서 객체를 생성하므로 속도도 느릴것이다.

= 연산자를 통해 String 변수에 값을 넣으면 힙 공간에 String pool 이라는 공간에 문자열이 저장될 것이고, new 를 통해 String 을 만들면 String pool 이 아닌 힙 영역에 저장된다.

= 연산자를 사용하는 방식을 String literal 이라 하는데, 이를 통해 생성한 객체는 String pool의 메모리 주소를 가리켜 같은 객체를 생성할 경우 같은 값의 주소를 가리키게 되므로 메모리를 재사용할 수 있다.

String x = "abc";
String y = "abc";
String z = new String("abc");

System.out.println(x == y); // true
System.out.println(x == z); // false

String pool 의 재사용성을 위해 String 객체는 불변하게 만들어줘야 한다.

StringBuilder


String 객체를 많이 생성하면 성능 이슈가 발생하겠지?? (물론 String pool이 있지만)

그러면 String 객체를 가변 객체로 만드는 거 어때?? JAVA에서는 StringBuilder, StringBuffer 지원

append 메소드를 통해 문자를 이어붙일 수 있다.

문자열을 담을 객체 내부 배열에 새로운 문자열이 들어갈 정도의 크기가 있으면 그대로 문자열을 삽입하지만 그렇지 않으면 배열의 크기를 증가시키고 새로운 문자열 삽입

StringBuilder x = new StringBuilder("Hello");
System.out.println(x.hashCode());
x.append("World");
System.out.println(x.hashCode());
  • hashCode = 객체의 주소값을 변환해 생성한 객체 고유한 정수값

StringBuffer


대부분의 메소드에 synchronized가 적용, 동기화 지원하는 StringBuilder라 생각하면 된다

profile
안녕하세요 ^^

0개의 댓글