만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/JAVA

[Java] StringTokenizer, StringBuffer, StringBuilder 클래스 차이

D36choi 2020. 10. 3. 22:44
728x90

StringTokenizer

문자열이 특정 구분자 (이를 delimeter라 한다)로 연결 되어있으면 2가지 방법으로 문자열을 쪼갠다.

1. String.split()

2. java.util.StringTokenizer

1과 2의 차이는 1은 정규표현식(regular expression), 2는 문자로 구분을 한다는 것이다.

String.split()

class Main {  
public static void main(String\[\] args) {  
String str = "안녕하세요,만나서-반가워요";  
String\[\] tokens = str.split(",|-");


for (String token : tokens) {
  System.out.println(token);
}


}  
}  

StringTokenizer

StringTokenizer s = new StringTokenizer(str,",");  
int numOfTokens = s.countTokens();  
for(int i=0; i<numOfTokens; i++) {  
String tok = s.nextToken();  
System.out.println(tok);  
}  
  • countTokens() : return int, 구분자로 구분된 토큰들의 갯수를 리턴
  • nextToken() : return String, 다음 번 token 을 리턴.

결과. 맨 아래가 토크나이저

StringBuffer, StringBuilder

그냥 str="ABC", str+"DEF" 하면 되는거아냐?

그러면 스택영역의 데이터 변수가 가리키는 주소값이 메모리영역의 "ABC"에서 새로 생성된 "ABCDEF" 객체 로 변경되는 것이다.

ABC 객체가 ABCDEF로 바뀌는 것이 아니다. 이는 메모리의 낭비를 유도하고 프로그램 성능을 저하한다.

이 두 클래스는 내부 버퍼를 이용해 문자열의 수정 작업을 진행하므로 새 객체를 생성하지 않는다!

이 두 클래스의 차이는?

StringBuffer 는 동기화가 적용되어있어 멀티 스레드 환경에서 안전하다.

Builder 는 그렇지 않다.
StringBuilder sb = new StringBuilder(); : 기본형
StringBuilder sb = new StringBuilder(5); : 5 크기 만큼의 문자들을 저장할 수 있는 버퍼 생성. 자동으로 버퍼크기는 증가.
StringBuilder sb = new StringBuilder("d36choi"); : 문자열이 주어지는 경우엔 이 매개값을 버퍼의 초기값으로 지정.

    StringBuilder sb = new StringBuilder();
    sb.append("hi"); // 문자열을 뒤에 붙인다.
    sb.append(" i'm choi");
    System.out.println(sb.toString()); // 문자열로 출력시 toString을 이용한다.
    sb.delete(0, 2); // 2번째 문자까지 삭제.
    System.out.println(sb.toString());