기술(Tech, IT)/자바(Java)

[Java] String, StringBuilder, StringBuffer

Daniel803 2021. 7. 6. 15:53

1. 불변성(Immutable)

 불변성(Immutable): String

 가변성(Mutable): StringBuilder, StringBuffer

 

 String은 한번 생성되면 더는 변경이 불가능한 불변하는 객체(Immutable object)로 생성이 된다. 하여 두 String 객체를 연결해줄 경우 새로운 String 객체가 생성되는 것을 예제1) HashCode를 통해 확인할 수 있다. 예제2) 역시 한번 생성된 String 객체는 바뀌지 않지만, StringBuilder와 StringBuffer는 바뀌는 것을 확인할 수 있다. String은 불변하는 객체이므로, 문자열을 붙이거나(Concatenation, '+'), 뽑아내는(substring) 작업을 할 경우 새로운 String 객체를 생성하고 기존 String 객체는 Garbage collection이 일어난다. 이것은 무거운 작업으로 Heap에 많은 Garbage를 남기게 되고 이를 위해 Java는 String 작업을 할 수 있는 StringBuilder와 StringBuffer 클래스를 제공한다.

 

예제1)

public static void main(String[] args) {
	String s = "A";
	System.out.println(s.hashCode());
	s += "B";
	System.out.println(s.hashCode());
}

출력:

65
2081

 

예제2)

public static void concat1(String s) {
	s = s + "B";
}

public static void concat2(StringBuilder sb) {
	sb.append("B");
}
 
public static void concat3(StringBuffer sbf) {
	sbf.append("B");
}

public static void main(String[] args) {
	String s = "A";
	// String s = new String("A"); 역시 같은 결과 출력
	concat1(s);
	System.out.println("String: " + s);
 
	StringBuilder sb = new StringBuilder("A");
	concat2(sb);
	System.out.println("StringBuilder: " + sb);
 
	StringBuffer sbf = new StringBuffer("A");
	concat3(sbf);
	System.out.println("StringBuffer: " + sbf);
}

출력:

String: A
StringBuilder: AB
StringBuffer: AB

 

2. 비교(Equality)

 String의 경우 Object 클래스의 equals() 메소드를 Override해 두 String 객체를 비교할 수 있지만, StringBuilder와 StringBuffer는 equals() 메소드를 Override하지 않아 비교에 사용할 수 없다.

public static void main(String[] args) {
	String S = "A";

	String s1 = new String(S);
	String s2 = new String(S);
	System.out.println(s1.equals(s2));
 
	StringBuilder sb1 = new StringBuilder(S);
	StringBuilder sb2 = new StringBuilder(S);
	System.out.println(sb1.equals(sb2));
		
	StringBuffer sbf1 = new StringBuffer(S);
	StringBuffer sbf2 = new StringBuffer(S);
	System.out.println(sbf1.equals(sbf2));
}

출력:

true
false
false

 

3. 성능(Performance), 쓰레드 환경(Thread environment)

 우선 기본적으로 String과 StringBuilder는 동기화 되지않는(Non-syncrhonized) 객체로 멀티 쓰레드 환경(Multi-threaded environment)에서 사용하기 적합하고, StringBuffer는 동기화(Synchronized) 객체로 쓰레드 안전(Thread safe)하다. 따라서 멀티 쓰레드 환경에선 여러 쓰레드(Multi thread)가 접근해 처리가 가능한 StringBuilder가 StringBuffer에 비해 더 빠른 처리 속도를 보이고, 사용되는 메모리의 크기는 같다.

(싱글 쓰레드 환경(Single-threaded)에서도 StringBuilder가 StringBuffer보다 더 좋은 성능을 보인다.)

 

public static void main(String[] args) {
	long startTime = System.currentTimeMillis();
	long startMemory=Runtime.getRuntime().freeMemory();
	StringBuilder sb = new StringBuilder();
	// StringBuffer sb = new StringBuffer();

	for(int i = 0; i<1000000; i++){
		sb.append(":").append(i);
	}
	long endTime = System.currentTimeMillis();
	long endMemory=Runtime.getRuntime().freeMemory();
	System.out.println("Time: "+(endTime-startTime));
	System.out.println("Memory:"+(startMemory-endMemory));
}

출력:

// StringBuilder

Time: 55
Memory:22315024

// StringBuffer

Time: 88
Memory:22315024

 

4. 변환(Conversion)

 (1) String에서 StringBuilder 또는 StringBuffer로

  String 객체를 StringBuilder 또는 StringBuffer 객체로 변환 시 StringBuilder와 StringBuffer의 생성자를 사용하면 된다.

public static void main(String[] args) {
	String s = "A";
	StringBuilder sb = new StringBuilder(s);
	StringBuffer sbf = new StringBuffer(s);
}

 (2) String Builder 또는 StringBuffer에서 String으로

  StringBuilder 또는 StringBuffer 객체를 String 객체로 변환 시 toString() 메소드를 사용하면 된다.

public static void main(String[] args) {
	StringBuilder sb = new StringBuilder("A");
	String s = sb.toString();
	StringBuffer sbf = new StringBuffer("B");
	s = sbf.toString();
}

 (3) StringBuilder를 StringBuffer로 혹은 반대로

  StringBuilder 객체를 StringBuffer 객체로 혹은 그 반대로 변환 시 toString() 메소드를 통해 각 객체를 String 객체로 변환 후 다시 변환하고자 하는 객체의 생성자를 사용하면 된다.

public static void main(String[] args) {
	StringBuilder sb = new StringBuilder("A");
	String s = sb.toString();
	StringBuffer sbf = new StringBuffer(s);
}

 

출처

- https://www.techiedelight.com/difference-between-string-stringbuilder-java/

- https://www.geeksforgeeks.org/string-vs-stringbuilder-vs-stringbuffer-in-java/

 

String vs StringBuilder vs StringBuffer in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

- https://www.javatpoint.com/difference-between-stringbuffer-and-stringbuilder

 

Difference between StringBuffer and StringBuilder - javatpoint

Difference between StringBuffer and StringBuilder in java, let's see the StringBuffer vs StringBuilder in java with examples, there is given a list of main differences between StringBuffer and StringBuilder.

www.javatpoint.com

- https://www.journaldev.com/538/string-vs-stringbuffer-vs-stringbuilder

 

String vs StringBuffer vs StringBuilder - JournalDev

StringBuffer and StringBuilder classes are used to manipulate Strings in Java. Learn about the difference between string buffer and string builder objects.

www.journaldev.com

 

'기술(Tech, IT) > 자바(Java)' 카테고리의 다른 글

[Java] 전역 변수(Global variable)  (0) 2022.09.18
[Java] 생성자(Constructor)  (0) 2022.09.14
[Java] JAR(Java Archive)  (0) 2021.09.18
[Java] instanceof  (0) 2021.08.23
[Java] ArrayList  (0) 2021.07.05