100세까지 코딩
[자바 공부] 문자열 (String, StringBuffer, StringBuilder) 본문
한눈에 정리
String | StringBuffer | StringBuilder | |
가변 여부 | X | O | O |
연산 속도 | 느림 | 중간 | 빠름 |
동기화 | O | O | X |
스레드 세이프 | O | O | X |
저장 위치 | String pool | Heap | Heap |
1) String
문자열을 대표하기 때문에 조작에 필요한 대부분의 기능들을 제공한다.
또한, 레퍼런스형 변수이지만 기본 자료형처럼 선언할 수 있다.
String은 다른 클래스와 달리 한번 메모리 공간에 할당되면 불변이다.
즉, +연산이나 replace등 문자열을 조작하면 새로운 String 객체를 만들어 바뀐 문자열을 저장하고
그 객체를 참조한다. 그리하여 문자열 연산이 많은 경우 성능이 좋지 않다.
간단하게 사용할 수 있고 동기화를 통한 스레드 세이프를 지원한다는 장점이 있다.
2) StringBuffer vs StringBuilder
이 객체들은 자신의 저장 용량(default: 16문자)를 가지고 있어 범위 내의 문자를 저장 할 수 있다.
문자열 크기가 용량을 초과하면 용량이 확장된다.
즉, 변경 가능한 문자열 객체라는 뜻이다.
StringBuffer와 StringBuilder 클래스가 제공하는 메소드는 동일하다.
유일한 차이점은 스레드 세이프(동기화) 여부이다.
StringBuffer는 각 메소드에 Synchronized가 존재하여 스레드 세이프를 지원한다.
그렇기에 멀티스레드 환경에서는 StringBuffer를 사용하는게 좋지만 연산속도가 오래걸려서
코테와 같은 단일스레드 환경에서는 StringBuilder를 사용하는 것이 좋다.
3) 정리
String은 변경이 많지 않을때 쉽게 문자열을 다룰 수 있다.
StringBuffer는 멀티 스레드 환경에서 안전이 확보되어야 할때 사용할 수 있다.
StringBuilder는 단일 스레드 환경 또는 안전 여부가 관계 없을 때 사용할 수 있다.
속도는 StringBuilder > StringBuffer > String 이니 코딩테스트는 StringBuilder를 사용하는 것이 좋다.
참고
1. JKD 1.5 String 연산
JDK 1.5 이전의 연산
- 문자열에 +, concat 등 변경 연산을 하면 문자열을 새로운 메모리에 할당해서 참조한다.
- 힙 영역에 데이터가 계속 쌓인다.
- 성능상 문제를 일으킨다.
JDK 1.5 이후의 연산
- 컴파일 단계에서 String 객체가 StringBuilder로 컴파일 되어 append()를 통해 + 가 이루어진다.
- 따라서 성능상으로 차이가 없어졌다.
- 그러나 여러 줄로 선언된 경우, 반복문을 사용하는 경우, concat()을 사용하는 경우는
매 연산마다 새로운 StringBuilder가 선언되는 문제가 있다.
2. 스레드 안전이란?
멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에
접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 말한다.
3. 동기화란?
멀티스레드 환경에서 여러 스레드가 하나의 공유자원에 동시에 접근하지 못하도록 막는것을 말한다.
'JAVA' 카테고리의 다른 글
[자바 공부] Arrays 메서드 정리 (0) | 2023.09.08 |
---|---|
[자바 공부] 형 변환 함수 차이 (parseXXX, valueOf, toString) (0) | 2023.09.04 |
[자바 공부] 상속과 바인딩 (0) | 2023.08.12 |
[자바 공부] 상속 & 생성자 (정처기 문제) (0) | 2023.08.10 |
[자바 공부] 문자열 비교 (정처기 문제) (0) | 2023.08.08 |