티스토리 뷰

728x90

저를 포함한 초보자 분들에게 도움이 됐으면 좋겠습니다.
초보자 분들은 수박 겉핥기 식으로 알고 넘어가지 마시고, 조금이라도 왜 이렇게 프로그램이 돌아가는지알고 가시는 시간이 됐으면 좋겠습니다.

자바 뜯어보기 - 입력편(BufferedReader) 보셨는지요?
안보고 오셨다면 한번 보고 오시는 것도 좋습니다.  
http://sims-solve.tistory.com/3?category=747624

블로그 키워드를 보니 '입력'으로 유입하시는 분들이 많더라구요. 
입력방법을 크게 Scanner, BufferedReader 두가지 뜯어봤는데요. 대게 BufferReader를 많이 사용해요. 왜냐면 입력편에서 말했듯 속도를 무시 할 수 없습니다.
그래서 이번편은! 입력을 받은 걸 어떻게 처리 할 수 있는지 알아보도록 합시다.

1. 혹시 1993-05-02를 입력으로 받아 년/월/일로 나눈다면 어떻게 하실 건가요? 

(1)	public static void main(String[] args) throws IOException {
		String k = "1993-05-02";
		System.out.println(k.substring(0,4)+" "+k.substring(5,7)+" "+k.substring(8,10));
	}

혹시나 (1)코드처럼 처리 하실껀가요?
그럼 만약에 1993-5-2로 입력이 들어오면 어떻게 할껀가요?
또 다시 다르게 처리를 해줘야 합니다. 이렇게 특정 문자로 구분되어있는 문자열을 아주 쉽게 처리할 수 있는 방법을 제시하는 클래스가 있습니다. StringTokenizer라는 아주 유용할 클래스가 존재합니다.
String은 문자열을 나타내며 Tokenizer는 낱말분석이라는 뜻입니다. 즉 문자열을 분석한다는 소리죠.

StringTokenizer는 사용자가 설정한 구분문자를 기준으로 나누어 출력을 할 수 있도록 도와줍니다.
예시를 봅시다.


(2)	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(),"-");
		while(st.hasMoreTokens()) {
			System.out.print(st.nextToken());
		}
	}//최종출력 : 19930502

(2)코드와같이 사용 가능합니다. 일단 입력 BufferedReader는 우리가 일반적으로 사용하듯 만들어 주면 됩니다. new StringTokenizer(String , delim(구분문자))로 구성이 되는데 우리는 입력을 받은 것을 처리 하므로 br.readLine()을 넣어 주고 "1993-05-02"에서 "-"구분문자를 기준으로 자르고 싶으니 
구분문자를 "-"로 설정해 주면 됩니다.
자 설정은 끝났습니다. 이제 문자열을 분석해 보죠.


 (3)  public boolean hasMoreTokens() {
        newPosition = skipDelimiters(currentPosition);
        return (newPosition < maxPosition);
    }

일단은 .hasMoreTokens()입니다. (3)코드에서 보듯이 아주 간단합니다. 여기서 newPositio은 뽑아야될 문자의 위치입니다. maxPosition은 문자의 길이 - 1(0부터시작)를 뜻하구요.
즉, 뽑아야 할 문자가 있다면 true를 반환하게 됩니다. 예시로 설명드리죠.
1993-05-02가 있다면 처음 newPosition은 0입니다. nextToken()을 하게되면 구분문자"-"의 다음을 가리키게 되죠.
그럼 두번째 newPosition은 5, 같은 방법으로 하면 세번째 newPosition은 7, 네번째는 9가 됩니다.
9가되면 maxPosition과 같기에 false를 리턴하여 마무리합니다.

그 다음은 nextToken()메소드 입니다.
nextToken은 설정된 구분문자의 위치를 알아내어 문자을 처리하는 역할을 하죠.
조금 더 자세히 StringTokenizer를 뜯어볼까요?


(4)class StringTokenizer implements Enumeration {
    private int currentPosition; //현재 구분자 위치
    private int newPosition; //출력해야할 문자 첫위치
    private int maxPosition; // 문자열 크기-1
    private String str; //문자열
    private String delimiters; //구분자
    private boolean retDelims; //구분자와 함께 출력할 것인가?
    private boolean delimsChanged; //구분자의 변경이 있나?
}

기본적으로 StringTokenizer클래스 안에는 (4)코드처럼  문자들을 쪼개기위해 여러가지 변수들이 있습니다. 이 변수들을 적절하게 사용하여 문자를 출력해주는 것이죠.
변수가 어떤 역할을 하는지는 주석으로 처리해 놓았으니 참고하시길 바랍니다.

(5)  public String nextToken() {

        currentPosition = (newPosition >= 0 && !delimsChanged) ?
            newPosition : skipDelimiters(currentPosition);

        delimsChanged = false;
        newPosition = -1;

        if (currentPosition >= maxPosition)
            throw new NoSuchElementException();
        int start = currentPosition;
        currentPosition = scanToken(currentPosition);
        return str.substring(start, currentPosition);
    }

(5)코드가 nextToken 메소드인데요. scanToken을 통하여 설정한 구분자 위치를 찾아내고 
String.substring를 사용하여 구분자 전까지 문자열을 리턴해 주네요. 

이처럼 StringTokenizer를 사용하게 된다면 손쉽게 구분자가 있는 문자열들은 처리 할 수 있습니다.
필자가 가장 많이 사용하는 경우는 생각보다 " "(띄어쓰기)로 문자열을 구분하여 처리해야 하는 경우가 많은데 이 경우 StringTokenizer로 많이 처리합니다.
여러분들도 StringTokenizer로 문자열을 현명하게 처리 할 수 있길 바랍니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함