일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 트랜잭션
- mybatis
- OOP
- aspect
- 스프링
- Interceptor
- MYSQL
- Spring Security
- 인터셉터
- proxy pattern
- RestControllerAdvice
- http
- request
- spring boot
- 자바
- Redis
- Filter
- 디자인패턴
- SQL
- 스프링 시큐리티
- 객체지향프로그래밍
- network
- exception
- 관점지향프로그래밍
- git
- aop
- Spring
- java
- 스프링부트
- response
- Today
- Total
장쫄깃 기술블로그
[Java] String & StringBuffer & StringBuilder 이해하기 본문
들어가며
Java에서 문자열을 다루는 대표적은 클래스로 String, StringBuffer, StringBuilder 가 있다.
연산이 많지 않을때는 특별한 이슈가 발생할 가능성이 거의 없다. 하지만 연산횟수가 많아지거나 멀티스레드, 경쟁 상태(Race Condition) 등의 상황이 자주 발생하면 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 한다.
String, StringBuffer, StringBuilder의 기본적이니 차이는 String은 불변(Immutable), StringBuffer와 StringBuilder는 가변(Mutable) 이다.
1. String
String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다.
concat 메소드 또는 + 연산자를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 한다.
즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성되고, 한번 생성된 객체의 내부 내용을 변화시킬 수 없다. (기존 객체가 제거되면 Java의 가바지 컬렉션이 회수한다.)
이러한 이유로 String 객체는 문자열 연산이 많은 경우 성능이 좋지 않다.
2. StringBuffer와 StringBuilder
StringBuffer와 StringBuilder는 String과 다르게 동작한다. 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다. StringBuffer와 StringBuilder 클래스가 제공하는 메소드는 서로 동일하다.
StringBuffer와 StringBuilder의 차이점은 동기화 여부이다.
StringBuffer는 각 메소드별로 Synchronized Keyword가 존재하여 멀티스레드 환경에서도 동기화를 지원한다. 그러나 SringBuilder는 동기화를 보장하지 않는다.
멀티스레드 환경이라면 값의 동기화 보장을 위해 StringBuffer를 사용하고, 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일스레드 환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.
정리하며
- String
- 짧은 문자열을 더할 경우
- 문자열 연산이 적고 멀티스레드 환경일 경우
- StringBuffer
- 멀티스레드 환경이거나, 개발중인 시스템이 thread-safe 인지 모를 경우
- 문자열 연산이 많은 경우
- StringBuilder
- 단일스레드이거나, 동기화를 고려하지 않아도 되는 경우
- thread-safe 와 관계 없는 프로그램을 개발할 경우
- 문자열 연산이 많은 경우
'Programming Language > Java' 카테고리의 다른 글
[Java] Java Thread 종류 (0) | 2023.06.20 |
---|---|
[Java] Atomic 변수 (0) | 2022.06.23 |
[Java] JDBC, DBCP, JNDI 이해하기 (0) | 2022.06.18 |
[Java] String Constant Pool (0) | 2022.06.12 |
[Java] Java Virtual Machine(JVM) 이란? (0) | 2022.06.12 |