이전문제랑 다르게 0 0 을 입력해서 반복문을 종료시킨다던가 하는 그런 종료방식이 따로 설정되어 있지 않다. 이를 위해, 우선 별다른 파일 종료 조건 없이, 즉 '입력할 데이터가 더이상 존재하지 않을때' 반복문을 종료하는 방법을 알기위해 EOF(End of File)의 개념부터 집고 넘어가야 한다.
EOF의 정의
End of File의 약자로, 데이터 소스로부터 더이상 읽을 수 있는 데이터가 없음을 나타내는 용어 -새롭게 라인을 읽어왔는데 그 값이 null이면 더이상 읽을 수 없다는 것을 의미하므로 루프를 종료 입력의 개수를 모르기때문에 For문보단 While을 이용한다.
Scanner에서의 EOF방식
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) { //입력되는 형식에 따라 달리 작성
sc.nextLine();
}
while(sc.hasNextInt()) {
sc.nextInt();
}
정수형일 경우 두개의 메소드hasNextInt(), hasNext() 중 하나로 써도된다. (hasNext()가 20ms정도 더빨랐다).
여기서 시스템이 계속 입력하라고 요구한다. EOF의 입력방법은 윈도우의 경우 ctrl+Z, 리눅스 계열의 경우 ctrl+D를 눌러주면 sb가 출력된다. 하지만, IDE나 콘솔입력에서 EOF를 주고 싶을땐 어떻게 할 방법이 없어서(엔터입력은 윈도우에선 \r\n, 리눅스에선 \r 이 발생) EOF를상채를 알리는 매크로같은 단축키를 만들어야한다. (통칭 키보드 이벤트) 그 방법중에 하나가 스윙인데.. 문제는 보통 이걸 사용할때 포커스를 하지않으면 안된다. 그러니까 어떤 프로그램을 사용할 때, 거기에 키를 입력하려면 일단 거기로 이동해서 들어가야하는게 포커스인데, 이 문제에선 우리가 따로 프레임을 만들거나 그러지를 않기 때문에.. 포커스도 안만드는셈이다. 그러므로 키보드이벤트를 쓰려는 스윙도 여기선 안되는것으로 판단된다. (그냥 이클립스 써서 ctrl+z 누르고 EOF알려주는게 제일 편한 방법인듯..)
그리고 String str=br.readLine();을 while밖에서 선언해주냐 안에서 선언해주냐는 의미차이가 있다.
//매 반복마다 str에 br.readLine()을 통해 입력받은 값을 저장하고 null인지 검사
String str;
while((str = br.readLine()) != null) { ... }
//한번만 입력받고 끝내버림
str = br.readLine();
while(str != null) {...}
결과
코드3
StringTokenizer가 성능이 좋긴한데, 반복문할때마다 객체를 계속 생성해줘야해서 여기서 시간이 또 뺏길수가 있다.