StringTokenizer, StringBuilder, StringBuffer

StringTokenizer

StringTokenizer 클래스는 문자열을 구분자(delimiter)를 기준으로 분리하는 데 사용되는 Jaca 내장 클래스이다. 구분자는 문자열에서 분리하고자 하는 구분 기호를 의미한다. 

 

 

토큰(Token)
자바에서 토큰(Token)은 코드를 해석하고 처리하는 과정에서 최소 단위로 쪼개어진 문자열을 의미한다. 토큰의 용도를 아래와 같다.
1. 자바 프로그램에서 소스 코드를 구문 분석하는 데 사용이 된다. 예를 들어, 자바 컴파일러는 소스 코드를 토큰으로 분리하여 이를 분석하고 컴파일한다.
2. 자바에서 제공하는 Scanner 클래스와 같은 입력 스트림 클래스에서 입력을 읽어들이는 데 사용된다. Scanner 클래스는 입력 스트림에서 토큰 단위로 데이터를 읽어들일 수 있다. _

 

StringTokenizer 클래스는 java.util 패키지에 속해 있으며, 다음과 같이 생성자를 사용하여 초기화 할 수 있다. 

StringTokenizer st = new StringTokenizer(str, delimiter);

여기서 str은 분리하고자 하는 문자열이고, delimiter는 구분자이다. delimiter는 하나 이상의 문자로 구성될 수 있으며, 여러 개의 구분자를 지정할 수도 있다.

StringTokenizer st = new StringTokenizer(s, " ", true);

위의 코드는 StringTokenizer 객체를 생성하는데 사용되며, s라는 문자열을 분리하고자 할 때 사용이 된다. 이 때, 공백을 기준으로 분리하며, 공백도 토큰으로 처리하도록 true를 두 번째 인자로 전달한다. 따라서 이 코드는 공백과 문자를 기준으로 s 문자열을 분리하여 StringTokenizer 객체를 생성하고, 이 객체의 nextToken() 메소드를 호출할 때마다 문자열과 공백을 다음 토큰을 반환합니다.

 

method

StringTokenizer 클래스에서 제공하는 메소드는 아래와 같습니다.

  • hasMoreTokens() : 토큰이 더 존재하는지 여부를 반환합니다. (boolean)
  • hasMoreElements() : 내부적으로 hasMoreTokens() 메서드를 호출하는 동작 방식, 방환 결과는 hasMoreTokens() 메서드와 같다. (boolean)
  • nextToken() : 다음 토큰을 반환합니다. (String)
  • nextToken(delimiter) : 매개변수로 전달받은 구분 기호를 기준으로 분활된 다음 토큰을 문자열로 반환합니다. (String)
  • nextElement() : 내부적으로 nextToken() 메서드를 호출하지만, 반환 타입이 Object라는 차이점이 있습니다. (Object)
  • countTokens() : 남아 있는 토큰의 수를 반환합니다. (int)

StringBuilder 와 StringBuffer

StringBuilder와 StringBuffer는 문자열을 조작하고 수정하는 데 사용되는 클래스이다. 이들 클래스는 문자열을 다루는 데 유용한 메소드를 많이 제공하며, 문자열 연산 시 메모리를 효율적으로 관리할 수 있도록 구현되어 있다.

 

StringBuilder와 StringBuffer는 모두 java.lang 패키지에서 제공되며, 상당히 유사한 기능을 제공을 한다. 두 클래스 모두 내부적으로 가변 문자열 버퍼를 유지하며, 문자열 조작 시 해당 버퍼 내부에서 작업을 수행하고 있다. 이러한 방식으로 문자열 조작을 수행하므로, 메모리 사용을 줄일 수 있으며 문자열 조작 속도도 빠르다.

 

그러나 StringBuilder와 StringBuffer의 가장 큰 차이점은 동기화(synchronization) 여부이다. StringBuffer는 동기화된(synchronized) 메소드를 제공하여 멀티 스레드 환경에서 안전하게 사용할 수 있도록 구현되어 있다. 따라서 멀티 스레드 환경에서 문자열을 조작해야 한다면, StringBuffer를 사용하는 것이 좋다. 그러나 단일 스레드 환경에서는 StringBuilder를 사용하는 것이 더 빠르다.

 

Buffer란
Buffer란, 일시적인 데이터를 보관하고 처리하는 데 사용되는 메모리 영역을 말한다. 일반적으로 입출력(I/O) 작업이나 네트워크 통신 등에서 데이터를 처리하고 전송하기 위해 사용된다. 

Buffer는 데이터를 일시적으로 저장해두었다가 필요할 때 처리하고 전송하는데, 이 때 데이터를 처리하는 과정에서 자주 사용되는 메모리 영역을 미리 할당해 놓고 관리한다. 이를 통해서 데이터 처리 속도를 높이고 시스템의 부하를 줄일 수 있다.

 

method

StringBuffer와 Stringbuilder에서 제공하는 아래와 같습니다.

  • append() : 문자열을 현재 문자열 뒤에 추가합니다. 
StringBuffer sb = new StringBuffer("Hello");
sb.append(" world!");
System.out.println(sb.toString());  // 출력 결과: "Hello world!"
  • capacity() : StringBuffer 객체의 내부 버퍼 크기를 반환합니다. 
  • char-At() : 지정된 위치릐 문자를 반환합니다. 
StringBuffer sb = new StringBuffer("Hello");
char c = sb.charAt(1);
System.out.println(c);  // 출력 결과: 'e'
  • delete() : 지정된 위치에서부터 지정된 개수만큼 문자를 삭제합니다. 
StringBuffer sb = new StringBuffer("Hello world!");
sb.delete(5, 11);
System.out.println(sb.toString());  // 출력 결과: "Hello!"
  • delete-CharAt() : 지정된 위치의 문자를 삭제합니다. 
StringBuffer sb = new StringBuffer("Hello world!");
sb.deleteCharAt(5);
System.out.println(sb.toString());  // 출력 결과: "Helloworld!"
  • ensureCapacity(): StringBuffer 객체의 내부 버퍼 크기를 적어도 지정된 크기 이상으로 설정합니다.
  • getChars(): 지정된 위치에서부터 지정된 길이만큼의 문자를 문자 배열에 복사합니다.
StringBuffer sb = new StringBuffer("Hello world!");
char[] arr = new char[5];
sb.getChars(0, 5, arr, 0);
System.out.println(arr);  // 출력 결과: "Hello"
  • indexOf(): 지정된 문자열이 처음으로 나타나는 위치를 반환합니다.
StringBuffer sb = new StringBuffer("Hello world!");
int index = sb.indexOf("world");
System.out.println(index);  // 출력 결과: 6
  • insert(): 문자열을 지정된 위치에 삽입합니다.
StringBuffer sb = new StringBuffer("Hello");
sb.insert(5, " world!");
System.out.println(sb.toString());  // 출력 결과: "Hello world!"
  • lastIndexOf(): 지정된 문자열이 마지막으로 나타나는 위치를 반환합니다.
StringBuffer sb = new StringBuffer("Hello world!");
int index = sb.lastIndexOf("o");
System.out.println(index);  // 출력 결과: 7
  • length(): 문자열의 길이를 반환합니다.
StringBuffer sb = new StringBuffer("Hello");
int len = sb.length();
System.out.println(len);  // 출력 결과: 5
  • replace(): 지정된 범위 내의 문자열을 다른 문자열로 대체합니다.
StringBuffer sb = new StringBuffer("Hello world!");
sb.replace(6, 11, "Java");
System.out.println(sb.toString());  // 출력 결과: "Hello Java!"
  • reverse(): 문자열을 역순으로 뒤집습니다.
StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb.toString());  // 출력 결과: "olleH"
  • setCharAt(): 지정된 위치의 문자를 다른 문자로 변경합니다.
StringBuffer sb = new StringBuffer("Hello");
sb.setCharAt(1, 'a');
System.out.println(sb.toString());  // 출력 결과: "Hallo"
  • setLength(): 문자열의 길이를 변경합니다.
StringBuffer sb = new StringBuffer("Hello world!");
sb.setLength(5);
System.out.println(sb.toString());  // 출력 결과: "Hello"
  • substring(): 지정된 범위의 문자열을 반환합니다.
StringBuffer sb = new StringBuffer("Hello world!");
String sub1 = sb.substring(6);
String sub2 = sb.substring(0, 5);
System.out.println(sub1);  // 출력 결과: "world!"
System.out.println(sub2);  // 출력 결과: "Hello"
  • toString(): StringBuffer 객체의 문자열 표현을 반환합니다.
StringBuffer sb = new StringBuffer("Hello");
String str = sb.toString();
System.out.println(str);  // 출력 결과: "Hello"
  • trimToSize(): StringBuffer 객체의 내부 버퍼 크기를 현재 문자열의 길이에 맞게 조정합니다.

 

'Language > Java' 카테고리의 다른 글

JVM(Java Virtual Machine)  (0) 2023.04.03
BigInteger, BigDecimal  (0) 2023.03.29
정규식(Regular Expression)  (0) 2023.03.25
(Java)10진법 <--> n집법 변환  (0) 2023.03.16
Chapter7. 객체지향 프로그래밍II  (0) 2022.12.04