[JAVA-2] StringBuilder와 StringBuffer의 차이

StringBuilder와 StringBuffer의 차이


😱 이번에는?

  • StringBuilder와 StringBuffer는 무슨 차이 입니다!

🛒 들어가면서

  • JAVA에서 문자를 다룰 수 있는 기술을 다양하게 존재합니다! 그중에서 String, StringBuffer, StringBuilder가 가장 많이 사용되는 방법이라고 생각합니당.
  • 각각의 기능들은 비슷한 기능을 제공하지만, 실제로 안을 보면 사뭇 다름을 알 수 있어요!
  • String, StringBuffer, StringBuilder를 하나씩 풀어나가며 이번 과제를 진행하겠습니당당당!!

😆 불변 객체와 가변 객체

  1. 불변 객체
    • 불변 객체 immutable object는 생성 후 그 상태를 바꿀 수 없는 객체
    • 불변 객체는 String, Integer, Boolean과 같은 Class도 있지만, 사용자가 직접 final로 원시타입을 생성하여 불변 객체를 만들 수 있습니다!
    public class Person {
    	private final String name;
        private final int age;
        
        public Person(String name, int age){
        	this.name = name;
            this.age = age;
        }
    }
  1. 가변 객체
    • 가변 객체 mutable object는 생성 후에도 상태를 변경할 수 있는 개체
    • int, char, boolean 등 원시타입 필드를 가진 클래스는 가변 객체입니다!
    • 하지만, 원시타입 필드에 final을 붙여서 불변 객체로 만들 수도 있습니다.
    public class Person {
    	private String name;
        private int age;
        
        public Person(String name, int age){
        	this.name = name;
            this.age = age;
        }
    }

🖊String

처음 알고리즘 문제를 풀었을 때, 항상 String을 사용했던 것 같습니다! 그런데 어느 순간부터 String을 사용한 연산을 하면, 메모리를 너무 많이 잡아먹어 문제를 해결하지 못했던 것 같아요..ㅜㅜㅜ

  1. String은 무엇인가?
  • String은 원시 타입이 아닙니다!
  • 문자열을 가진 객체입니다!
  1. String은 불변 객체입니다!
  • 가변 객체와 다르게 한번 생성하면 그 값을 바꿀 수 없습니다!
    + 하지만, 재할당은 가능합니다!
  1. String을 생성하는 방법!
String index = new String("예시");
String index = "예시";
  1. String이 제공하는 Method
equals
indexOf
replaceAll
substring
toUpperCase

결국, 불변객체를 사용해야 하는 경우 String을 사용하는 것은 좋지만, 값이 계속 바뀌는 상황일 경우에는 지양하는 것이 좋다!

🥳 StringBuffer

처음 무작정 코딩테스트를 위해 StringBuffer를 사용했던 경험이 있습니다. 면접때 면접관님이 StringBuffer를 사용한 이유와 StringBuilder와의 차이점을 물으셨지만.. 결국 완벽한 답을 하지 못한 경험이 있습니다.

  • String과 다르게 StringBuffer는 가변 객체입니다!
  • 기존에 할방받은 공간에 새로운 데이터가 쌓이고, 추가 데이터가 공간보다 커지게 되면, 기존의 버퍼 크기를 늘립니다!!
  • StringBuffer는 동기화 Synchronized를 지원합니다!
    + 여러 스레드가 하나의 자원을 사용하려고 할때 다른 스레드의 접근을 막는 것이 동기화 입니다!!
    • 동기화를 지원하기 때문에 StringBuffer는 멀티스레드 환경에 쓰입니다!
      • 물론 멀티스레드 환경이 아니더라도 사용할 수 있지만, 그럴 경우에는 StringBuilder가 더 효율적입니다.
    • 동기화를 지원하는 `StringBuffer"는 멀티스레드 환경에서 안전하게 자원을 사용할 수 있음을 보장합니다!!

😩 StringBuilder

알고리즘 문제를 풀때, StringBuffer보다 StringBuilder가 더 빠르다는 말을 들었습니다. 혹해서 아직까지 StringBuilder를 가끔 사용하고 있는 것 같습니다. 이번 기회에 StringBuilder를 탐구하겠습니당!!

  • StringBuilderStringBuffer와 마찬가지로 가변 객체입니다!
  • 하지만 동기화를 지원하지 않는 다는 가장 큰 차이점이 존재합니다!
  • 동기화를 지원하지 않는 StringBuilder를 사용하는 가장 큰 이유는
    + StringBuffer보다 단일 스레드 환경에서 빠른 속도를 보여주기 때문입니다!

🎲 결론

String은 불변 객체이고, StringBuffer와 StringBuilder는 가변 객체이다

단일 스레드 환경에서 StringBuilder는 제일 좋은 성능을 발휘한다.

StringBuffer는 Synchronized를 지원하지만, StringBuilder는 지원하지 않는다.

StringBuffer는 멀티 스레드 환경에서 안정성 보장한다.

상황에 맞추어 StringBuffer와 StringBuilder를 사용해야 하며, 무엇이 좋은지는 그 상환이 판단한다.

간혹, String이 StringBuffer와 StringBuilder보다 좋은 성능을 보일 떄 도 있다!


📚 Reference

좋은 웹페이지 즐겨찾기