Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

거인의 코딩일지

String VS StringBuilder VS StringBuffer 본문

코딩/JAVA

String VS StringBuilder VS StringBuffer

코딩거인 2023. 8. 10. 09:58
728x90
Java 에서 String 클래스는 불변성을 가지고 있다. 그래서 변하지 않는 문자열을 자주 사용하는 경우에는 좋은 성능을 기대 할 수 있지만! 문자열에 대한 변경이 자주 일어나는 프로그램에서 String 만 사용하게된다면 효율적인 성능을 기대하기 어렵다. 
문자열에 대한 변경이 자주 일어나는 프로그램에서는 StringBuilder, StringBuffer 을 사용하여 효율적인 성능을 보일 수 있다.
 String VS StringBuilder && StringBuffer

Java에서 String 객체는 한번 값이 할당 되면 그 공간은 변하지 않는다. 하지만 StringBuilder 이나 StringBuffer 객체는 한번 값이 할당 되면 할당 된 공간이 변하는 특성을 가지고 있다.

여기서 할당된 공간이 변하지 않는 특성은 불변성(Immutable) 이라 하고,
할당된 공간이 변하는 특성은 가변성(mutable) 라고 한다.

String == 불변성을 갖는다 == Immutable 하다

StringBuilder && StringBuffer == 가변성을 갖는다 == mutable 하다

String Constant Pool
String strA = "abc";
String strB = new String("abc");
String strC = "abc";
String strD = new String("abc");

System.out.println(strA==strB); //false
System.out.println(strA==strC); //true
System.out.println(strB==strD); //false

변수들 모두 "abc" 라는 문자열을 가지고 있는데 결과가 다른 이유는 String 타입 할당 방식에 따른 저장 방식이 다르기 때문이다.

String 변수에 값을 할당하는 방법은 2가지가 있다.

  1. 리터럴 변수에 대입하는 방법
  2. new 키워드를 사용하는 방법
리터럴 값으로 값을 할당하는 경우

String을 리터럴 값으로 할당하는 경우엔 Heap 메모리 영역안의 특별한 메모리 공간인 String constant pool 에 저장됨

만약 String constant pool 에 존재하는리터럴 값을 사용하게 된다면 새롭게 리터럴 값을 만들어 String constant pool에 저장하는 것이 아닌 현재 존재하는 값을 사용하게 된다.

위의 사진과 같은 이유로 System.out.println(strA==strC); 의 실행 결과가 true 가 나오게 되는 것이다.

new 키워드로 값을 할당하는 경우

new 키워드를 통해 String 변수에 값을 할당하게 되면 일반적인 객체와 동일하게 Heap 영역에 동적을 ㅗ메모리 공간이 할당되게 된다.

마찬가지로 같은 문자열이더라도 new 키워드를 한번 더 사용하게 된다면 같은 값이지만 다른 메모리공간 즉 Heap 영역 안 에 참조하게 된다.

위의 사진과 같은 이유로 System.out.println(strB==strD); 에서 false 를 출력하게 되는 것이다.

  • strA  → Heap → String Constant Pool
  • strB  → Heap 
StringBuilder VS StringBuffer

StringBuilder 과 StringBuffer 은 둘다 크기가 유연하게 변하는 가변성을 갖는다.

두개의 기능은 동일하지만 한가지의 차이점이 존재하는데 그건 바로 동기화(Synchronization)이다!

StringBuilder는 동기화를 지원하지 않는 반면, StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작을 할 수 있다.

!!결론!!
  •  String 를 사용해야 할 때 
     String는 불변성을 가지고 있음으로 변하지 않는 문자열을 자주 사용할 때 사용한다.

  •  StringBuilder을 사용해야 할 때
     StringBuilder는 동기화를 지원하지 않는 반면, 속도면에선 StringBuffer 보다 성능이 좋기에  단일 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우 StringBuilder를 사용하는 것이 성능면에서 유리하게 될 것 이다.
  • StringBuffer 을 사용해야 할 때
    StringBuffer 는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있기에 멀티스레드 환경과 문자열의 추가 , 수정, 삭제 등이 빈번이 발생하는 경우 String를 사용하는것이 성능면에서 유리하게 될 것 이다.

 

참고문서

https://velog.io/@heoseungyeon/StringBuilder%EC%99%80-StringBuffer%EB%8A%94-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EB%8A%94%EA%B0%80

728x90

'코딩 > JAVA' 카테고리의 다른 글

[Spring] @NoArgsConsructor, @RequiredArgsConstructor, @AllArgsConstructor  (0) 2023.08.22
Math.sqrt() 제곱근 구하기  (0) 2023.08.14
[Collection]Set_기초  (0) 2023.04.09
[Collection] List_기초  (0) 2023.04.09
[Collection] 기초 개념!  (0) 2023.04.09