StringTokenizer
사용자가 지정하는 구분자를 경계로 데이터를 분리한다. 구분자를 생략하면 공백과 탭을 기본 구분자로 사용하며
구분자로 구분된 데이터를 Token이라 부른다.
BufferedReader 클래스의 메서드로 입력을 읽어들일땐 라인 단위로 읽어들일 수 밖에 없다. 꼭 BufferedReader 클래스
뿐만 아니라도 콤마, 공백을 기준으로 분리하거나 특정 문자에 따라 문자열을 나누고 싶을 때 StringTokenizer를 사용한다.
StringTokenizer 생성자
StringTokenizer를 생성하는 방식은 3가지가 있다.
//1. 공백 또는 탭으로 문자열 분리
StringTokenizer st = new StringTokenizer(문자열);
//2. 구분자(ex: 콤마, 점)를 기준으로 문자열을 분리
StringTokenizer st = new StringTokenizer(문자열, 구분자);
/* 3. 구분자를 기준으로 문자열을 분리할 때 구분자도 토큰으로 넣는다. (true)
* 구분자를 분리된 문자열 토큰에 포함 시키지 않는다. (false)
* (디폴트 : false)
*/
StringTokenizer st = new StringTokenizer(문자열 , 구분자 , true/false);
사용 예시
// 1번예시
String str1 = "사과 배 복숭아 밤 대추";
StringTokenizer st1 = new StringTokenizer(str1);
// hasMoreTokens() : StinrgTokenizer 클래스 객체에 다음 토큰이 있으면 true, 없으면 false를 리턴한다.
while (st1.hasMoreTokens()) { //다음에 읽어들일 토큰이 있는가?
// nextToken() : StringTokenizer 클래스 객체에서 다음 토큰을 읽어들인다.
System.out.println(st1.nextToken());
}
System.out.println("=============================");
// 2번예시
// 문자열이 ","로 구분된 경우
String str2 = "사과,배,복숭아,밤,대추";
StringTokenizer st2 = new StringTokenizer(str2,",");
// StringTokenizer 클래스 생성자의 2번째 인수로 구분자를 지정할 수 있다.
while (st2.hasMoreTokens()) {
System.out.println(st2.nextToken());
}
System.out.println("=============================");
// 2번예시
// 문자열이 ","와 "."로 구분된 경우
String str3 = "사과.배,복숭아.밤,대추";
StringTokenizer st3 = new StringTokenizer(str3,",.");
// StringTokenizer 클래스 생성자의 2번째 인수로 구분자를 여러개 지정할 수 있다.
while (st3.hasMoreTokens()) {
System.out.println(st3.nextToken());
}
System.out.println("=============================");
StringTokenizer 메서드
리턴값 | 메서드명 | 역할 |
boolean | hasMoreTokens() | 남아있는 토큰이 있으면 true를 리턴, 더 이상 토큰이 없으면 false 리턴 |
String | nextToken() | 객체에서 다음 토큰을 읽어들인다. |
String | nextToken(String delim) | delim 기준으로 다음 토큰을 반환 |
boolean | hasMoreElements() | hasMoreTokens와 동일한데 엘리먼트보다 토큰으로 된 메서드를 주로 사용 |
Object | nextElement() | nextToken 메서드와 동일하지만 문자열이 아닌 객체를 리턴 |
int | countTokens() | 총 토큰의 개수를 리턴 |
DecimalFormat Class
일상에서 가장 많이 쓰이는 진수인 10진수를 형식화하는 역할을 하는 클래스이다.
이 클래스는 NumberFormat을 상속하고있으며 10진수를 다양한 형식에 맞게 출력해줄 수 있다.
DecimalFormat은 java.text 패키지 안에 존재하므로 따로 import 해야한다.
DecimalFormat은 문자'#'과 '0'이 숫자를 나타내는데 쓰이며 쉼표, 마침표, 대시 등으로 숫자 형식을 나타낼 수 있다.
Format | 설명 |
0 | 10진수, 값이 없는 자리는 0으로 채움 |
# | 10진수, 값이 없는 자리는 나타나지 않음 |
. | 소수점을 이하 나타냄 |
- | 음수 부호를 나타냄 |
, | 단위 구분자를 나타냄 |
E | 지수 기호를 나타냄, E 이후 0를 써서 표현(ex E0) |
% | 퍼센트 기호 |
' | escape문자, 만약 #을 문자로 나타내고 싶다면 '#' 으로 표현 |
그외 문자 | 문자로 취급 |
- DecimalFormat을 사용하는 방법은 생성자를 사용해 형식을 지정해주는 방법이 있다
DecimalFormat format=new DecimalFormat("###,###.#######");
format.applyPattern("###,###.#######");
중요한 것은 우리가 패턴을 적용하고 난 후 형식에 맞는 문자열을 뽑아와야 한다. 이때 format이라는 메서드를 사용한다.
double n = 11223344.5678;
String formattedStr = format.format(n);
이제 StringTokenizer와 DecimalFormat을 이용해 과일의 값이 담긴 문자열을 '과일(?,???원)'으로 출력하도록 해보자
// 문자열이 ","와 "="로 구분된 경우
String str4 = "사과=3000,배=2200,복숭아=900,밤=1000,대추=2200";
// StringTokenizer 클래스 생성자의 3번째 인수로 구분자를 토큰에 포함시키는 여부를 지정할 수 있다.
// 생략시 기본값은 flase이고 구분자를 토큰에 포함시키지 않는다.
StringTokenizer st4 = new StringTokenizer(str4,",=",true);
// 사과(1,100원) 으로 출력하게 만들기
DecimalFormat df = new DecimalFormat("#,##0원");
while (st4.hasMoreTokens()) {
String str = st4.nextToken();
if (str.equals("=")) {
System.out.print("(");
}else if (str.equals(",")) {
System.out.println(")");
}else {
try { //가장먼저 사과가 출력되는데 문자열은 정수로 바꿀수 없기 때문에 오류가 난다. 이때 예외처리를 해준다.
System.out.print(df.format(Integer.parseInt(str)));
}catch (NumberFormatException e) {
System.out.println(str);
}
}
}
System.out.println(")");
- ,과 =이 들어가는 자리에 괄호를 넣어야 하기 때문에 StringTokenizer에서 구분자를 토큰에 포함시키도록
true로 지정한다. - 천의 자리에 콤마를 넣는 형식으로 DecimalFormat 생성자를 사용해 df를 생성한다.
- st4에 남아있는 토큰이 있으면 while문을 실행하고 다음 토큰을 읽어들인 후 str에 저장한다.
- 저장된 값이 =과 같으면 그 자리에 ( 를 출력하고 ,와 같으면 ) 를 출력한다. 가장 먼저 사과가 출력되는데 문자열은
정수로 바꿀 수 없기 때문에 오류가 난다. 이때 예외처리를 해준다.
실행결과

'JAVA > JAVA2' 카테고리의 다른 글
[java2] #37 - extends, Override, super (0) | 2022.11.24 |
---|---|
[java2] #36 - PrintWriter (Text File Write Test) (0) | 2022.11.23 |
[java2] #34 - Memo Project (0) | 2022.11.19 |
[java2] #33 - varargs (가변인자) (0) | 2022.11.19 |
[java2] #32 - Date, Calendar, SimpleDateFormat Class (1) | 2022.11.17 |