TIL #1 [JAVA] StringBuffer 왜 쓰는가!

✔ String ?

  • JAVA에서는 String을 특별하게 취급한다.

    1. String 존재 자체는 '인스턴스'취급을 하지만 리터럴로 사용될 때 상수 풀(constant pool)에 저장이 되어 같은 애플리케이션 여러 곳에서 공유해서 사용한다

    2. String은 문자열의 값이 변경될 때마다 char배열을 새로 만들어낸다.

잠깐!
문자열 리터럴은 이중 인용 부호("")로 지정하여 사용한다.

👉 String 예시(1)

즉, String str = "Hello";
라고 하면 constant pool에 "Hello"가 만들어진다.
여기서 리터럴은 Hello 값이 된다.

👉 String 예시(2)

        String a = "";

        for (int i = 0; i < 10; i++) {
            a += i;
        }

        System.out.println(a);

보통 a에 0123456789를 더하면
a가 0123456789로 바뀔 것이다라고 생각한다!!!

과연 내 생각대로 될까? 🙄🙄
위 코드의 constant pool을 살펴보자!

아니 " " "0" "01" "012" ... 계속 만들어지네??

이것은 메모리 낭비다아아아아아아!!!!!!!!

그럼 메모리를 낭비하지 않고 문자열 값을 바꿀 수 있나요?
=> StringBuffer or StringBuilder을 사용하자! 😃

✔ StringBuffer vs StringBuilder

  • StringBuffer, StringBuilder는 String과 달리 기존에 있던 char 배열에서 추가하거나 빼는 식으로 동작한다.
  • 모두 .append() .delete()등을 이용하여 동일 객체 내에서 문자열을 변경하는 것이 가능하다.
  • 즉 가변적인이다. 그렇다면 어떤 차이가 있을까?

👉 StringBuffer

StringBuffer sb = new StringBuffer();

for(int i=0; i< 10; i++){
	sb.append(i);
}

System.out.prinln(sb);
  • StringBuffer는 동기화 키워드를 지원하여 다중 스레드 환경에서 안전성을 가지고 있다. 즉, StringBuffer은 동기화를 지원한다.

👉 StringBuilder

StringBuilder sb = new StringBuilder();

for(int i=0; i< 10; i++){
		sb.append(i);
}

System.out.prinln(sb);
  • 반대로 StringBuilder는 동기화를 지원하지 않기 때문에 다중 스레드 환경에서 사용하는 것은 적합하지 않지만 단일스레드에서의 성능은 StringBuffer보다 뛰어나다.

다중스레드? 단일스레드? 이건 배우지 않은 개념이다!
오늘은 StringBuffer와 StringBuilder 차이점만 알고 나중에 스레드에 대해서는 공부 후 업로드 해야겠다!

좋은 웹페이지 즐겨찾기