[Java] String, StringBuffer, StringBuilder에 대하여

String 클래스는 불변이다

자바에는 String, StringBuffer, StringBuilder 클래스가 존재한다. 자바에서 String 클래스는 보통 불변(immutable)하다. 즉, 한 번 초기화되면 변하지 않는다. 혹자는 String 클래스도 변한다고 말하지만, 사실 그것은 변하는 게 아니라 새로 생성한 것뿐이다.

 

예를 들어, String 클래스의 concat() 메서드나 "+" 연산자를 이용해 문자열의 변화를 주더라도, 그것은 문자열이 변경됐다기보다는, 새로 생성한 것이라고 봐야 한다.

 

자세한 내용은 아래 게시글을 참조하면 좋다.

 

[JAVA] 자바 String Constant Pool 이란?, String "=="와 equals의 차이

String Constant Pool이란? 아래와 같은 코드를 살펴보자. String a = "Java"; String b = "Java"; String c = new String("Java"); // 결과 : same if(a == b) { System.out.println("same"); }else { System.out..

code-lab1.tistory.com

 

따라서, String 클래스는 기존의 값이 계속해서 변경되는 상황에서 다음과 같은 단점이 존재한다.

 

1. 새로운 문자열을 생성하는 비용

2. 기존 문자열이 Garbage Collector에 의해 Garbage Collection 되는 과정의 비용

 

예를 들어, 다음과 같은 상황을 보자.

 

String str = new String("Hello!");

for(int i=0; i<10000; i++){
	str += "z";
}

str이라는 문자열 뒤에 계속해서 새로운 문자를 추가한다면, 새로운 문자를 추가할 때마다 새로운 문자열을 생성해야 한다. 이러한 상황에는 String 클래스보다는 StringBuffer, StringBuilder 클래스를 사용하는 것이 좋다.

 

 

StringBuffer와 StringBuilder

StringBuffer와 StringBuilder 클래스는 가변(mutable)이다. 즉, 문자열을 변경할 수 있다. 

 

둘 모두  AbstractStringBuilder 추상 클래스를 상속받는데, 해당 클래스는 char 배열인 value에 값을 저장하고, 저장된 문자의 수를 int count에 저장한다. 두 클래스 모두 문자열을 담을 수 있는 용량인 capacity를 가지는데, 문자열의 크기가 이 용량을 초과하면 capacity를 2배 키우는 식으로 동작한다.

 

StringBuffer와 StringBuilder를 쓰면 문자열을 변경할 때 String 클래스보다 빠른 성능을 기대할 수 있다.

 

예를 들어, 아래와 같이 사용할 수 있다.

StringBuilder sb = new StringBuilder("Hello!");

for(int i=0; i<10000; i++){
	sb.append("z");
}

 

둘 모두 append() 메서드를 통해 문자열을 추가할 수 있고, delete() 메소드 등을 통해 문자를 삭제할 수도 있다.

자세한 메서드들은 다음을 참고하자.

 

 

StringBuffer (Java Platform SE 8 )

Inserts the string into this character sequence. The characters of the String argument are inserted, in order, into this sequence at the indicated offset, moving up any characters originally above that position and increasing the length of this sequence by

docs.oracle.com

 

 

StringBuilder (Java Platform SE 8 )

Inserts the string into this character sequence. The characters of the String argument are inserted, in order, into this sequence at the indicated offset, moving up any characters originally above that position and increasing the length of this sequence by

docs.oracle.com

 

그럼 StringBuffer와 StringBuilder의 차이점은 뭘까?

 

StringBuffer는 공통 메서드가 동기화되기 때문에 멀티 쓰레딩 환경에서는 StringBuffer를 사용하는 것이 안전하다.

하지만 그 외의 환경에서는 StringBuilder의 성능이 더 빠르기 때문에 StringBuilder를 사용하는 것이 좋다.

 

 

 

 

 


참고

1. https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html

2. https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuffer.html

반응형

댓글

Designed by JB FACTORY