본문 바로가기
아카이브/자바의 정석

9장 java.lang패키지와 유용한 클래스 20201024

by nineteen 2020. 10. 24.
반응형

정규식은 다음에 하겠다

 

 

java.util.Scanner클래스

 

Scanner는 화면, 파일, 문자열과 같은 입력소스로부터 데이터를 읽을 수 있다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Scanner;
 
class ScannerEx1 {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String[] argArr = null;
        
        while(true) {
            String prompt = ">>";
            System.out.print(prompt);
            
            String input = s.nextLine();    // 라인단위로 입력받음
            
            input = input.trim();            // 입력받은 값에서 불필요한 앞뒤 공백 제거
            argArr = input.split(" ");        // 입력받은 내용의 공백을 구분자로 잘라서 argArr배열에 저장
            
            String command = argArr[0].trim();
            
            if("".equals(command))    continue;    
            
            command = command.toLowerCase();// 소문자로
            
            if(command.equals("q"))
                System.exit(0);
            else {
                for(int i=0; i<argArr.length; i++)
                    System.out.println(argArr[i]);
            }
        }
    }
}
 
cs

출력

>> HELLO
HELLO
>>G
G
>>Q

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package useful;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
 
class ScannerEx2 {
    public static void main(String[] args) throws Exception {    
        // txt파일은 CH09에 저장되어야함 (CH09/src/useful X)
        Scanner sc = new Scanner(new File("data2.txt"));
        int sum=0;
        int cnt=0;
        
        while(sc.hasNextInt()) {
            sum += sc.nextInt();
            cnt++;
        }
        System.out.println("sum="+sum);
        System.out.println("average="+(double)sum/cnt);
    }
 
}
 
cs

출력

sum=1500
average=300.0

 

 

Scanner에서 txt파일로부터 데이터를 읽어와 합과 평군을 계산

(data2.txt에는 100 200 300 400 500이 저장되어있음)

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package useful;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
 
public class ScannerEx3 {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(new File("data3.txt"));
        int cnt = 0;
        int totalSum = 0;
        
        while(sc.hasNextInt()) {
            // data3.txt에서 한줄을 가져와 line에 저장
            String line = sc.nextLine();
            // line에 저장된 문자열을 ","기호로 구분해서 sc2에 저장
            Scanner sc2 = new Scanner(line).useDelimiter(",");
            int sum=0;
            
            while(sc2.hasNextInt()) {
                sum += sc2.nextInt();
            }
            System.out.println(line + ", sum = " + sum);
            totalSum += sum;
            cnt++;
        }
        System.out.println("Line: " + cnt + ", Total: " + totalSum);
    }
 
}
 
cs

 

출력

100,100,100, sum = 300
200,200,200, sum = 600
300,300,300, sum = 900
400,400,400, sum = 1200
500,500,500, sum = 1500
Line: 5, Total: 4500

 

 

 

 

 

 

 

 

java.util.StringTokenizer클래스

 

StringTokenizer는 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개 문자열로 자르는데 사용

 

String의 split(String regex)이나 Scanner의 useDelimiter(String pattern)과 유사

1
2
String[] result = "100,200,300,400".split(",");
Scanner sc2 = new Scanner("100,200,300,400").useDelimiter(",");
cs

 

StringTokenizer는 구분자로 단 하나의 문자 밖에 사용하지 못하기 때문에 보다 복잡한 형태의 구분자로 문자열을 나누어야 할 때는 정규식을 사용하는 메소드를 사용해야 함

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.StringTokenizer;
 
class StringTokenizerEx1 {
    public static void main(String[] args) {
        String source = "100,200,300,400";
        StringTokenizer st = new StringTokenizer(source, ",");    // String을 ','기준으로 자름
        
        // StringTokenizer에 토큰이 있는지?
        while(st.hasMoreTokens()) {
            System.out.println(st.nextToken());    // 있으면 토큰반환, 토큰이 없을때 까지 반복
        }
    }
}
 
cs

출력

100
200
300
400

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.StringTokenizer;
 
class StringTokenizerEx2 {
    public static void main(String[] args) {
        String expression = "x=100*(200+300)/2";
        // true로 인해 구분자도 출력되게 함
        StringTokenizer st = new StringTokenizer(expression, "+-*/=()"true);
        
        while(st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }
 
    }
 
}
 
cs

출력

x
=
100
*
(
200
+
300
)
/
2

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.StringTokenizer;
 
class StringTokenizerEx3 {
    public static void main(String[] args) {
        String source = "1,김천재,100,100,100|2,박수재,95,80,90|3,이자바,80,90,90";
        
        // 첫번째 구분자, '|'기준으로 문자열 분리
        StringTokenizer st = new StringTokenizer(source, "|");
        
        while(st.hasMoreTokens()) {
            String token = st.nextToken();
            
            // 두번째 구분자, ','기준으로 문자열 분리 후, 출력
            StringTokenizer st2 = new StringTokenizer(token, ",");
            while(st2.hasMoreTokens()) {
                System.out.println(st2.nextToken());
            }
            System.out.println("--------");
        }
    }
}
cs

출력

1
김천재
100
100
100
--------
2
박수재
95
80
90
--------
3
이자바
80
90
90
--------