일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- vercel
- 코린이
- 제로샷-원샷-퓨샷
- 소스트리
- springboot
- java
- server비교
- node.js 초기설정
- DB
- html
- 오픈뱅킹 API
- Azure VM 생성하기
- 금융결제원 API
- 커밋메시지 변경하기
- JavaScript
- 웹 배포하기
- 자바
- 웹개발
- 알고리즘
- 자식커밋 쌍방향 재배치 오류
- branch 합치기
- css
- 미디어쿼리
- 차등프라이버시
- 내돈내산
- Azure VM
- 웹개발공부
- React
- C++
- js
- Today
- Total
Soony's House
[JAVA] String 클래스 / StringBuffer 클래스 / StringBuilder 클래스 · 비교 정리 (+StringTokenizer 클래스) 본문
[JAVA] String 클래스 / StringBuffer 클래스 / StringBuilder 클래스 · 비교 정리 (+StringTokenizer 클래스)
soonybutter 2024. 9. 3. 00:01
String , StringBuffer , StringBuilder 클래스는 자바에서 문자열을 다루는 '자료형 클래스'로 지원하는 '3가지 자료형'이다.
위 세가지 자료형은 모두 문자열을 다룰때 사용하나, 각각 쓰임새가 다르다.
:보통 성능과 상황에 따라 비교하여 선택해서 사용한다.
String 클래스 / StringBuffer클래스, StringBuilder에 대해 비교 · 정리해보자!
String 클래스
- 불변형(immutable) 자료형
- 따라서 초기 공간과 연산을 할 때 많은 시간과 자원을 사용하는 편이다.
- 불변형으로 설계하는 이유: 보안, 동기화, 캐싱(힙 공간 절약)등의 성능적 이점을 얻기 위해서이다.
- 문자열을 수정할 경우, 수정된 문자열이 새롭게 할당되어 새 주소를 넘기게 된다.
String str1 = "abc"; // "abc"
str1.toUpperCase(); // "ABC"
System.out.println(str1); // "abc"
ㄴ. str1.toUpperCase()를 해도, str1 문자열 자체는 변경되지 않는 것을 확인 할 수있다. = 불변형
String str = "hello";
str = str + " world!";
System.out.println(str); // hello world! 가 출력됨.
ㄴ. 출력되는 것은 마치 str 값이 새롭게 변경된 것처럼 보이지만, 아니다.
실제로는 메모리에 새로 "hello world!" 값을 저장한 영역을 만들고, 변수 str을 다시 참조하는 것으로 작동한다.
StringBuffer 클래스 & StringBuilder 클래스
StringBuffer 클래스와 StringBuilder 클래스는 사용 문법이 서로 동일하다. 둘의 차이는 내부적인 동작에 있다.
먼저 StringBuffer 클래스에 대해 정리해보자.
i) StringBuffer 클래스
- 가변형 자료형
- 문자열을 추가 or 변경할때 주로 사용한다.
- 'concat() 메소드'와 '+ 연산'으로 문자열을 이어붙일때 , StringBuffer 클래스는 내부의 버퍼(buffer)라는 독립적인 공간을 가져, 그곳에 문자열을 바로 추가할 수 있기 때문이다.
- 따라서 String클래스보다 공간의 낭비가 적고, 연산속도가 빠르다.
- 내부의 버퍼 크기의 기본값은 16개 문자가 저장되는 크기이다. 생성자를 통해 별도 지정할 수 도 있다.
StringBuffer str1 = new StringBuffer(); // 기본 16 버퍼 크기로 생성
// str1.capacity() - StringBuffer 변수의 배열 용량의 크기 반환
System.out.println(str1.capacity()); // 16
str1.append("1111111111111111111111111111111111111111"); // 40길이의 문자열을 append
System.out.println(str1.capacity()); // 40 (추가된 문자열 길이만큼 늘어남)
i-1) StringBuffer 내장 메소드
- StringBuffer클래스 메서드와 StringBuilder 클래스 메서드 사용법은 동일하다.
StringBuffer( )
버퍼의 길이를 지정하지 않으면 크기가 16 인 버퍼를 생성
StringBuffer(int length)
length 길이를 가진 StringBuffer 클래스의 인스턴스(buffer)를 생성
StringBuffer(String str)
지정한 문자열( str )의 길이보다 16 만큼 더 큰 버퍼를 생성
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[ ] str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
StringBuffer append(String str)
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스가 저장하고 있는 문자열의 뒤에 덧붙임
int capacity( )
StringBuffer 인스턴스의 버퍼크기 반환 (자료형의 할당된 크기를 반환)
int length( )
StringBuffer 인스턴스에 저장된 문자열의 길이 반환 (버퍼에 담긴 문자열 데이터를 반환)
char charAt(int index)
지정된 위치( index )에 있는 문자를 반환
StringBuffer delete(int start, int end)
시작위치( start )부터 끝 위치( end )사이에 있는 문자를 제거
단, end 위치의 문자는 제외(start <= x < end)
StringBuffer deleteCharAt(int index)
지정된 위치( index )의 문자를 제거
StringBuffer insert(int pos, boolean b)
StringBuffer insert(int pos, char c)
StringBuffer insert(int pos, char[ ] str)
StringBuffer insert(int pos, doule d)
StringBuffer insert(int pos, float f)
StringBuffer insert(int pos, int i)
StringBuffer insert(int pos, long l)
StringBuffer insert(int pos, Object obj)
StringBuffer insert(int pos, String str)
두 번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치( pos )에 추가
( pos 는 0부터 시작)
StringBuffer replace(int start, int end, String str)
지정된 범위( start ~ end )의 문자들을 주어진 문자열로 바꾼다.
단, end 의 위치는 범위에 포함되지 X (start <= x < end)
StringBuffer reverse( )
StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열
void setCharAt(int index, char ch)
지정된 위치( index )의 문자를 주어진 문자( ch )로 바꾼다.
void setLength(int newLength)
지정된 길이로 문자열의 길이를 변경
길이를 늘리는 경우에는 나머지 빈공간들을 널문자( \u0000 )로 채운다.
String toString( )
StringBuffer 인스턴스의 문자열을 String 으로 변환
String substring(int start)
String substring(int start, int end)
지정된 범위 내의 문자열을 String 으로 뽑아서 반환
(시작위치( start )만 지정하면 시작위치부터 끝까지 뽑아서 반환)
*출처: @Inpa Dev 티스토리
🌟
String 클래스는 값이 변경될때마다 새롭게 객체를 만드는 반면, StringBuffer 클래스와 StringBuilder 클래스는 값이 변경될 때마다 기존 문자열에 수정되어 적용됨으로, 문자를 수정, 삭제, 합치는 경우에는 StringBuilder 클래스/ StringBuffer 클래스를 사용하는 것이 더 바람직하다.
ii. StringBuffer / StringBuilder 클래스 비교
1. 두 클래스의 차이점
StringBuffer 클래스 | StringBuilder 클래스 |
멀티 스레드 환경에서 안전함. | 문자열 파싱 성능이 가장 우수함. |
스레드 safe 기능 제공 ㅇ (성능 저하 요인) |
스레드 safe 기능 제공 x |
2. 동등비교
StringBuffer 클래스/ StrtingBuilder 클래스-> String 클래스 객체와 달리 equals() 메서드를 오버로딩 X
StringBuffer sb = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("hello");
System.out.println(sb == sb2); // false
System.out.println(sb2.equals(sb)); // false
그러므로 toString() 으로 객체를 String객체로 변환 한 뒤에 equals() 로 비교 해줘야한다..
String sb_tmp = sb.toString();
String sb2_tmp = sb2.toString();
System.out.println(sb_tmp.equals(sb2_tmp)); // true
3. 문자열 합치기
🌟
- '+' 연산자로 합치기
- String.concat() 메소드 사용하기
- StringBuffer() 객체 사용하기
- StringBuilder() 객체 사용하기
String str ="hello ";
//1. + 연산자 이용
String a = str +"world!";
//2. string.concat() 메서드
String b = str.concat("world!");
//3. StringBuffer() 객체 생성
String c = new StringBuffer("hello ").appned("world!").toString();
//4. StringBuilder() 객체 생성
String d = new StringBuilder("hello ").append("world!").toString();
+참고로 이중에서 성능이 가장 좋은 것은 StringBuilder 객체와 StringBuffer 객체를 이용하는 방법이다.!
.
.
.
그러므로
문자열 연산이 많은 경우, 처음부터 "StringBuilder() 객체생성 -> 문자열로 전환 .to.String() 메서드 사용!)" 해서 다루자..
StringBuilder a = new StringBuilder();
for(int i = 0; i < 10000; i++) {
a.append(i);
}
final String b = a.toString();
StringTokenizer 클래스
- String클래스에서 제공하는 split() 메소드와 같은 기능을 하는 클래스
- 전달 받은 문자열을 구분자로 나누어 각 토큰에 저장한다.
public static void main(String[] args) {
String str ="이떡볶,22,서울특별시 양천구 목동 ,여";
StringTokenizer st = new StringTokenizer(str,",");
System.out.println(st.countTokens());
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
- countTokens() : 토큰의 개수 나타내주는 메소드

- StringTokenizer 클래스와 String의 split() 메서드의 차이점: split은 String클래스의 메소드, 추출한 문자를 배열(!=토큰)로 저장함.
- coundtToken(), nextToken(), hasMoreTokens()...
🌟문자열 자료형 총정리
String | StringBuffer | StringBuilder | |
가변 여부 | 불변 | 가변 | 가변 |
스레드 세이프(thread safe) | O | O | X |
연산속도 | 느림 | 빠름 | 아주빠름 |
사용시점 | ·문자열 추가 연산이 적으며 ·스레드 세이프 환경에서 |
·문자열 추가 연산이 많고 ·스레드 세이프 환경에서 |
·문자열 추가 연산이 많고 ·빠른 연산이 필요할때 ·단일 스레드 환경일때 |
틀린 부분이나 이상한 부분이 있으면 댓글로 지적해주세요!
감사합니다 :)
*정보 밒 자료 출처: @Inpa Dev 티스토리, pdf 자료 참고
'✶Language > Java' 카테고리의 다른 글
[JAVA] 입출력(I/O)- 스트림(Stream), 버퍼(Buffer), File입출력스트림 정리 (1) | 2024.09.07 |
---|---|
[JAVA] 자바 예외처리(Exception)- try catch문, throw, throws (13) | 2024.09.04 |
[JAVA] 상속 - super, 인터페이스(Interface), 오버라이딩(Overriding), 추상클래스(Abstract Class) (14) | 2024.08.30 |
[JAVA] 자바 메모리 구조 (0) | 2024.08.28 |
[JAVA] 접근 제어자 (private, default, protected, public) (2) | 2024.08.10 |