StringTokenizer
]문자열이 특정 구분자(delimiter
)로 연결되어 있을 경우, 구분자를 기준으로 부분 문자열을 분리하기 위해서는
String
의 split()
메소드를 이용하거나,java.util
패키지의 StringTokenizer
클래스를 이용할 수 있다.split()
은 정규 표현식으로 구분하고, StringTokenizer
는 문자로 구분하는 차이점이 있다.
split()
메소드
String
클래스의split()
메소드는 정규 표현식을 구분자로 해서 문자열을 분리한 후, 배열에 저장하고 리턴한다.String[] result = "문자열".split("정규표현식");
예를 들어, 다음과 같은 문자열이 있다고 가정해보자.
홍길동&이수홍,박연수,김자바-최명호
특수문자를 제외하고 사람 이름만 뽑아내고 싶을 경우, &
, ,
, -
를 파이프 기호(|
)로 연결한 정규 표현식을 매개값으로 제공하면 split()
메소드는 이 기호들을 구분자로 해서 부분 문자열을 추출한다.
String[] names = text.split("&|,|-");
public class StringSplitExample {
public static void main(String[] args) {
String text = "홍길동&이수홍,박연수,김자바-최명호"
String[] names = text.split("&|,|-");
for(String name : names) {
System.out.println(name);
}
}
}
실행 결과
홍길동
이수홍
박연수
김자바
최명호
StringTokenizer
클래스문자열이 한 종류의 구분자로 연결되어 있을 경우,
StringTokenizer
클래스를 사용하면 손쉽게 문자열(토큰)을 분리해낼 수 있다.
StringTokenizer
객체를 생성할 때 첫 번째 매개값으로 전체 문자열을 주고, 두 번째 매개값으로 구분자를 주면 된다.StringTokenizer st = new StringTokenizezr("문자열", "구분자");
만약 구분자를 생략하면 공백(Space
)이 기본 구분자가 된다.
예를 들어 문자열이 /
로 구분되어 있을 경우, 다음과 같이 StringTokenizer
객체를 생성할 수 있다.
String text = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(text, "/");
StringTokenizer
객체가 생성되면 부분 문자열을 분리해낼 수 있는데, 다음 메소드들을 이용해서 전체 토큰 수
, 남아 있는 토큰 여부
를 확인한 다음, 토큰을 읽으면 된다.
nextToken()
메소드로 토큰을 하나 꺼내오면StringTokenizer
객체에는 해당 토큰이 없어진다.
만약 StringTokenizer
객체에서 더 이상 가져올 토큰이 없다면 nextToken()
메소드는 java.util.NoSuchElementException
예외를 발생시킨다. 그래서 nextToken()
메소드를 사용하기 전에 hasMoreTokens()
메소드로 꺼내올 토큰이 조사한 후 nextToken()
메소드를 호출하는 것이 좋은 코딩 방법이다.
StringTokenizer
로 토큰 분리하기public class StringTokenizerExample {
public static void main(String[] args) {
String text = "홍길동/이수홍/박연수";
//how1: 전체 토큰 수를 얻어 for문으로 루핑
StringTokenizer st = new StringTokenizer(text, "/");
int countTokens = st.countTokens();
for (int i = 0; i < countTokens; i++) {
String token = st.nextToken();
System.out.println(token);
}
System.out.println();
//how2: 남아 있는 토큰을 확인하고 while문으로 루핑
st = new StringTokenizer(text, "/");
while (st.hasMoreTokens()) {
String token = st.nextToken();
System.out.println(token);
}
}
}
실행 결과
홍길동
이수홍
박연수
홍길동
이수홍
박연수
StringBuffer, StringBuilder
클래스 ]String
클래스의 인스턴스는 한번 생성되면 변경할 수 없다. 그래서 변경이 필요할 경우 기존의 문자열을 바꿔서 새로운 문자열을 리턴한다.
이렇게 문자열을 변경하는 작업이 많을 경우
String
클래스를 사용하는 것보다는java.lang
패키지의StringBuffer
또는StringBuilder
클래스를 사용하는 것이 좋다!
이 두 클래스는 내부 버퍼에 문자열을 저장해두고, 그 안에서 추가/수정/삭제 작업을 할 수 있도록 설계되어 있다. 즉, String
처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있다.
StringBuffer
와 StringBuilder
의 사용 방법은 동일한데,
StringBuffer
는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하지만,StringBuilder
는 단일 스레드 환경에서만 사용하도록 설계되어 있다는 차이점이 있다.이번에는 StringBuilder
클래스만 살펴보고, 이후에 스레드에 대해 제대로 학습한 뒤 StringBuffer
도 정리해보려고 한다.
StringBuilder
클래스StringBuilder
클래스는 몇 가지 생성자를 제공한다.
StringBuilder()
는 16개의 문자들을 저장할 수 있는 초기 버퍼를 만든다.StringBuilder(int capacity)
생성자는 capacity
로 주어진 개수만큼 문자들을 저장할 수 있는 초기 버퍼를 만든다.StringBuilder(String str)
생성자는 str
로 주어진 매개값을 버퍼의 초기값으로 저장한다.StringBuilder
는 버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼의 크기는 그다지 중요하지 않다.
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(16);
StringBuilder sb = new StringBuilder("Java");
StringBuilder
객체가 생성되었다면, 다음의 메소드를 이용하여 버퍼 내에서 문자 추가, 삽입, 삭제 등의 작업을 할 수 있다.
StringBuilder
에서 문자열 조작public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(); //StringBuilder 객체 생성
//문자열 끝에 추가
sb.append("Java ");
sb.append("Program Study");
System.out.println(sb.toString());
//index4 위치 뒤에 2를 삽입
sb.insert(4, "2");
System.out.println(sb.toString());
//index4 위치의 문자를 6으로 변경
sb.setCharAt(4, '6');
System.out.println(sb.toString());
//index6부터 index13 '전'까지를 "Book" 문자열로 대치
sb.replace(6, 13, "Book");
System.out.println(sb.toString());
//index4부터 index5 '전'까지 삭제
sb.delete(4, 5);
System.out.println(sb.toString());
//총 문자수 얻기
int length = sb.length();
System.out.println("총 문자 수: " + length);
//버퍼에 있는 것을 String 타입으로 리턴
String result = sb.toString();
System.out.println(result);
}
}
실행 결과
Java Program Study
Java2 Program Study
Java6 Program Study
Java6 Book Study
Java Book Study
총 문자 수: 15
Java Book Study
Pattern
클래스 ]이메일, 전화번호와 같이 문자열이 정해져 있는 형식(정규 표현식: Regular Expression
)으로 구성되어 있는지 검증해야 하는 경우가 있다.
정규 표현식은 문자 또는 숫자 기호와 반복 기호가 결합된 문자열이다.
정규 표현식을 작성하는 방법은 API 도큐먼트에서
java.util.regex.Pattern
클래스를 찾아Summary of regular-expression constructs
를 참조하면 된다.
정규 표현식을 작성하는데 기본적으로 알아야 하는 기호는 다음과 같다.
Pattern
클래스
java.util.regex.Pattern
클래스의 정적 메소드인matches()
메소드를 통해 문자열을 정규 표현식으로 검증할 수 있다.
boolean result = Pattern.matches("정규식", "검증할 문자열");
첫 번째 매개값은 정규 표현식이고, 두 번째 매개값은 검증할 문자열이다. 검증 후 결과가 boolean
타입으로 리턴된다.