자바에서 String 외에도
StringBuffer와 StringBuilder가 있는데
보면 뭔 용도로 쓰는지 감이 안올 것이다
append를 이용해서 값을 붙일 수 있다고는 하는데
그건 String도 .concat(값) 혹은 + "값" 을 사용해
붙일 수 있어서 뭐지 싶을거다
StringBuffer와 StringBuilder는
concat 혹은 +를 하지 않으려고 사용하는 것인데
String은 불변(immutable)하기 때문에
값을 변경할 수 없다
.concat 혹은 +를 이용한 값 변경은
기존 String에 들어있던 값을 버리고
새로 값을 할당하는 것이다
따라서 concat이나 +를 많이 사용할 경우
속도가 현저히 느려지는데
String에 concat 혹은 +를 1000번 이상 하게되면
속도가 너무 느려져 비효율적이므로 그 때에는
StringBuffer나 StringBuilder를 사용하라는 것이다
StringBuffer와 StringBuilder는 변하기 때문에(mutable)
.append(), .delete() 등을 통해서 값을 변경할 수 있다
위 스크린샷을 보면 .concat을 이용한 방식이
횟수가 많아질 경우
독보적으로 느린 것을 확인할 수 있다
다음으로는 StringBuffer와 StringBuilder인데
둘 중에 뭘 쓰냐면
StringBuffer는 공통 메소드가 동기화되므로
멀티 쓰레드 환경에서는
StringBuffer를 사용하는 것이 안전하고
(값이 예상치 못하게 변경되는 것 방지)
그 외에는 StringBuilder가 성능이 뛰어나기에
StringBuilder를 사용해주면 된다
StringBuffer, StringBuilder의 주요 메소드는 다음과 같다
sb.append(값)
- StringBuffer, StringBuilder 뒤에 값을 붙인다
sb.insert(인덱스, 값)
- 특정 인덱스부터 값을 삽입한다
sb.delete(인덱스, 인덱스)
- 특정 인덱스부터 인덱스까지 값을 삭제한다
sb.indexOf(값)
- 값이 어느 인덱스에 들어있는지 확인한다
sb.substring(인덱스, 인덱스)
- 인덱스부터 인덱스까지 값을 잘라온다
sb.length()
- 길이 확인
sb.replace(인덱스, 인덱스, 값)
- 인덱스부터 인덱스까지 값으로 변경
sb.reverse()
- 글자 순서를 뒤집는다
이제 간단히 정리해 보자면
String에서 concat, + 사용 시 속도가 왜 느려지나?
String은 불변(immutable)하기 때문에
concat, + 사용 시 기존 값을 버리고 새로 할당해서
1000번 이상 수행할 경우 급격히 느려짐
StringBuffer, StringBuilder를 사용하는 이유는?
String에서 concat, +를 천번 이상 사용할 경우
속도가 급격히 느려지기 때문에 해당 상황에는
변하는(mutable) StringBuffer와 StringBuilder를 사용한다
StringBuffer, StringBuilder의 차이는?
StringBuffer는 공통 메소드 동기화로 인해
멀티 스레드 환경에서만 사용
그 외에는 StringBuilder를 사용하면 됨
예제에 사용한 코드는 아래와 같다
public static void main(String[] args) {
String s = new String("s");
s = s.concat(" 붙이기");
s = s + " 붙이기";
// String은 불변(immutable)하기 때문에
// 기존 것을 버리고 새로 할당하는 식으로 사용
StringBuffer sbuffer = new StringBuffer("SB");
sbuffer.append(" 붙이기");
StringBuilder sbuilder = new StringBuilder("SB");
sbuilder.append(" 붙이기");
// StringBuffer, StringBuilder는 변하기(mutable)하기 때문에
// 기존 것에서 append를 사용해서 값 변경 가능
sbuilder.append("붙이기"); // 삽입
sbuilder.insert(0, "ASDASD"); // 중간에 삽입
sbuilder.delete(3, 7); // 자르기
sbuilder.indexOf("ASDB"); // index 확인
sbuilder.substring(0, 4); // 자르기
sbuilder.length(); // 길이 확인
sbuilder.replace(0, 4, "CCCC"); // 글자 바꾸기(0부터 4번째 글자를 날리고 CCCC로 변경)
System.out.println(sbuilder);
System.out.println(sbuilder.indexOf("붙이기붙이기"));
System.out.println(sbuilder.substring(0, 4)); // substring 예제
System.out.println(sbuilder.reverse()); // 순서 뒤집기
System.out.println(sbuilder.length()); // length 예제
}
'Language > Java' 카테고리의 다른 글
자바 컬렉션 프레임워크가 뭔말? (0) | 2020.04.19 |
---|---|
자바 Iterator 개념부터 사용 방법까지 (1) | 2020.04.19 |
자바 파라미터 개념부터 예제까지 (0) | 2020.03.26 |
자바 삼항연산자 개념부터 예제까지 (0) | 2020.03.23 |
자바 명명규칙 가이드 (0) | 2020.03.16 |
댓글