Continuous Challenge

[이것이 자바다] 문자열 클래스 (String, StringBuilder, StringBuffer) 본문

Study/이것이 자바다

[이것이 자바다] 문자열 클래스 (String, StringBuilder, StringBuffer)

응굥 2023. 3. 8. 22:32
728x90
728x90

String 클래스

String 클래스는 문자열을 저장하고 조작할 때 사용한다.

 

ex) 네트워크 통신으로 얻은 byte 배열을 원래 문자열로 변환하는 경우

//기본 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성
String str = new String(byte[] bytes);
//특정 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성
String str = new String(byte[] bytes, String charsetName);

 

import java.util.Arrays;

public class BytesToStringExample {
	public static void main(String[] args) throws Exception  {
		String data = "자바";
		
		//String -> byte 배열(기본: UTF-8 인코딩)
		byte[] arr1 = data.getBytes();
		//byte[] arr1 = data.getBytes("UTF-8");
		System.out.println("arr1: " + Arrays.toString(arr1));
		
		//byte 배열 -> String(기본: UTF-8 디코딩)
		String str1 = new String(arr1);
		//String str1 = new String(arr1, "UTF-8");
		System.out.println("str1: " + str1);
		
		//String -> byte 배열(EUC-KR 인코딩)
		byte[] arr2 = data.getBytes("EUC-KR");
		System.out.println("arr2: " + Arrays.toString(arr2));
		
		//byte 배열 -> String(기본: UTF-8 디코딩)
		String str2 = new String(arr2, "EUC-KR");
		System.out.println("str2: " + str2);
	}
}

 

String은 내부 문자열을 수정할 수 없다. 새로운 String 객체를 생성하는 것이다.

문자열의 + 연산은 새로운 String 객체가 생성되고 이전 객체는 계속 버려지는 것이기 때문에 효율성이 좋다고 볼 수 없다.
(이전 객체는 Garbage로 남아있다가 GC(Garbage Collection)에 의해 사라지게 된다.)

잦은 문자열 변경 작업을 해야 한다면 String 보다는 StringBuilder를 사용하는 것이 좋다.

 

StringBuilder 클래스

StringBuilder는 내부 버퍼(데이터를 저장하는 메모리)에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계되어 있다.

append, insert, delete, replace 등의 메서드를 제공하는데 이 메서드들은 StringBuilder를 다시 리턴하기 때문에 연이어서 다른 메서드를 호출할 수 있는 메서드 체이닝 패턴을 사용할 수 있다.

public class StringBuilderExample {
	public static void main(String[] args) {
		String data = new StringBuilder()
				.append("DEF")
				.insert(0, "ABC")
				.delete(3, 4)
				.toString();
		System.out.println(data);
	}
}

 

String vs. StringBuilder/StringBuffer 

String은 불변(immutable)의 속성을 갖는다.

StringBuilder 와 StringBuffer는 가변(mutable)의 속성을 갖는다.

 

StringBuilder 는 동기화를 지원하지 않는다. 단일스레드에 적합하다. (단일스레드에서의 성능은 StringBuffer보다 뛰어나다.)

StringBuffer는 동기화를 지원한다. 멀티스레드 환경에서 안전하다.(thread-safe)

String도 불변성을 가지므로 멀티스레드 환경에서 안전성(thread-safe)을 갖는다.


[참고]

https://ifuwanna.tistory.com/221

728x90
728x90
Comments