To Dare Is To Do!
StringBuffer, StringBuilder, string 본문
개요
Java 에서 문자열을 다루는 대표적인 클래스로 연산이 많지 않을 때는 위에 나열된 어떤 동기화 방법을 사용하더라도 큰 문제가 발생할 가능성은 적으나 연산 횟수가 많아지거나 멀티스레드 환경에서 Race condition 등의 상황이 자주 발생한다면, 각 동기화 방법의 특징을 이해하고 상황에 맞는 적절한 방법을 사용해야 함
String
- 불변 객체로 한 번 생성되면 그 값을 변경할 수 없음
- 더하기 연산을 하여 문자를 이어 붙일 때는 새로운 객체가 생성되어 재 할당됨
public class StringExample { public static void main(String[] args) { String str = "Hello"; System.out.println(str.hashCode()); // 99162322 str += " World"; // 새로운 객체 생성 System.out.println(str); // Hello World System.out.println(str.hashCode()); // 1776255224 } }
- 불변성 때문에 여러 스레드에서 안전하게 사용할 수 있음
- String 객체는 불변하기 때문에, 문자열 연산이 빈번하게 발생하는 상황에서는 성능 저하의 원인이 될 수 있음
- String객체 새로 생성시 heap 메모리 사용량 증가, 가비지 컬렉션의 부하 커짐
(리터럴울 통해 생성될 시 인스턴스 메모리의 공간 절대 변하지 않음)
- 문자열 리터럴은 String Pool에 저장되어 메모리 사용을 최적화 함
- String Pool
사용 시기
- 문자열 변경이 거의 없는 경우
- 멀티스레드 환경에서 문자열을 안전하게 사용해야 하는 경우
- 문자열 리터럴을 많이 사용하는 경우
String 클래스의 주요 메서드
StringBuilder
- 문자열을 변경할 수 있는 가변객체
- 동기화를 지원하지 않아 스레드에서 안전하지 않아 ****단일 스레드에서만 안전하게 사용할 수 있음
- 동기화가 없으므로 StringBuffer보다 빠른성능을 보여줌
- public class StringBuilderExample { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 동일 객체에서 변경 System.out.println(sb.toString()); // Hello World } }
사용 시기
- 단일 스레드 환경에서 문자열을 빈번하게 변경해야 하는 경우
- 문자열의 추가, 삭제, 변경이 자주 발생하는 경우
- 웹 애플리케이션에서 사용자의 입력을 처리하거나, 파일에서 데이터를 읽어오는 경우와 같이 문자열의 변경이 빈번하게 발생하는 상황에서는 StringBuilder의 사용을 고려
- 문자열 이어 붙이는 작업이 많을 시 사용
StringBuffer
- 문자열을 변경할 수 있는 가변객체
- 내부적으로 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있음
- 동기화로 인한 오버헤드가 있을 수 있음 (성능문제)
- 모든 메소드에 대해 synchronized를 통해 blocking을 거는 것은 성능 상으로 좋지 않음
- 여러 동기화 메소드로 이루어진 하나의 메소드를 여러 스레드가 호출할 때는 스레드 안전하지 않을 수 있음
public class StringBufferExample { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 동일 객체에서 변경 System.out.println(sb.toString()); // Hello World } }
사용 시기
- 문자열 변경이 거의 없는 경우
- 문자열 리터럴을 많이 사용하는 경우
- 멀티스레드 환경에서 문자열을 안전하게 사용해야 하는 경우
각 클래스의 차이
특성 | String | StringBuffer | StringBuilder |
불변성 | 불변 | 가변 | 가변 |
쓰레드 안전성 | 안전 | 안전 | 안전하지 않음 |
성능 | 동기화 없음으로 빠름 | 동기화로 인해 느림 | 동기화 없음으로 매우 빠름 |
사용 시기 | 문자열 변경이 거의 없는 경우 | 멀티스레드 환경에서 문자열 변경 | 단일 스레드 환경에서 문자열 변경 |
'Java' 카테고리의 다른 글
thread pool (3) | 2024.08.06 |
---|---|
hashcode(), equals() (0) | 2024.08.04 |
동일성과 동등성 (0) | 2024.07.30 |
Call by value와 Call by reference (0) | 2024.07.29 |
추상클래스와 인터페이스 (0) | 2024.07.27 |