일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- Spring
- 자바의정석
- 스프링MVC
- 서블릿
- 스프링 부트와 JPA
- inflearn
- 스프링
- 이것이자바다
- DispatcherServlet
- 스프링 핵심원리
- 김영한
- 분석함수
- 자바의정석 연습문제
- java
- 제네릭
- 계층 쿼리
- 시큐어코딩
- Python
- 인프런
- Java의정석
- Numpy
- Secure Coding
- 불친절한SQL프로그래밍
- 스프링입문
- docker
- JPA
- 자바연습문제
- 불친절한 SQL 프로그래밍
- 자바공부
- REGEXP_SUBSTR
- Today
- Total
Continuous Challenge
[이것이 자바다] 문자열 클래스 (String, StringBuilder, StringBuffer) 본문
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)을 갖는다.
[참고]
'Study > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] 와일드카드 타입 파라미터 (0) | 2023.04.03 |
---|---|
[이것이 자바다] 제한된 타입 파라미터 (0) | 2023.04.03 |
[이것이 자바다] 제네릭 메소드 (0) | 2023.04.03 |
[이것이 자바다] 제네릭 타입 (0) | 2023.03.21 |
[이것이 자바다] 제네릭이란? (0) | 2023.03.15 |