[Kotlin] Scanner vs Buffereader 그리고 StringTokenizer

Minjun Kim·2023년 8월 8일
0

Kotlin

목록 보기
6/10
post-thumbnail

개요


백준에서 알고리즘 문제 풀이 중에 입력값 처리에 문제가 발생했다.

문제에서 던져주는 입력값을 readLine() 으로 받을 수 없어 계속 컴파일 에러가 발생했다.

구글링한 결과 readLine() 의 경우, 아래와 같은 공백 구분이 불가능한 듯하다. 아님 말고

[input]
1 2
  • 그래서 입력값을 처리할 수 있는 ScannerBuffereader 에 대해 정리 해보려 한다.

Scanner와 Buffereader

입력값을 받는 클래스

ScannerBuffereader 둘 다 입력 처리 클래스이다.

이 둘의 가장 큰 차이점은 바로 속도 다.

이름내용
Scanner입력을 받는 즉시 처리
Buffereader입력을 버퍼에 모아 특정 타이밍에 처리

때문에 Buffereader 쪽의 처리 속도가 더 빠르다.

그 외의 중요한 특징들은 아래 [참고 사이트]로

🔎 [참고 사이트]

velog.io/@langoustine
studywithus.tistory


Scanner 사용법

fun main(args:Array<String>) {
	val sc = Scanner(System.`in`)

	val name = sc.nextLine()
	val age = sc.nextInt()

	println("name: $name, age: $age")
}


fun main(args: Array<String>) = with(Scanner(System.`in`)) {
    val name = nextLine()
    val age = nextInt()

    println("name: $name, age: $age")
}

Buffereader 사용법

fun main(args:Array<String>) {
	val br = BufferedReader(InputStreamReader(System.`in`))

	val name = br.readLine()
	val age = br.readLine().toInt()

	println("name: $name, age: $age")
}


fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val name = readLine()
    val age = readLine().toInt()

    println("name: $name, age: $age")
}

Buffereader의 단점

  • Scanner는 nextInt(), nextDouble() 등으로 공백 구분과 동시에 자료형 지정도 가능하다.
    그러나 Buffereader는 readLine()만 사용할 수 있고, 이는 무조건 입력값을 String 자료형으로 받는다.

  • 따라서 필요 시에 형변환이 요구되며 공백 구분을 할 수 없다.
    즉, 띄어쓰기된 Integer를 가공하기 위해서는 StringTokenizer 를 사용해야 한다.


StringTokenizer

지정한 구분자로 문자열을 쪼개주는 클래스

  • 쪼개진 문자열을 토큰(token)이라고 부른다.
[input] 10 20 30 40 50


fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val arr = ArrayList<Int>()
    val st = StringTokenizer(readLine())

    while (st.hasMoreTokens()) {
        arr.add(st.nextToken().toInt())
    }
    println("Contents Of an Array: $arr")
}

output: Contents Of Array: [10, 20, 30, 40, 50]

생성자

이름내용
StringTokenizer(String str)문자열을 기본(default) delim으로 분리, 기본 delimiter는 공백 문자들인 " \t\n\r\t"을 의미한다.
StringTokenizer(String str, String delim)지정 delim으로 문자열 분리
StringTokenizer(String str, String delim,boolean returnDelims)지정 delim으로 분리 + delim까지 token으로 포함, returnDelims가 true/포함, false/불포함

속성

  • int countTokens()
- 남아있는 token 개수를 반환, 전체 token 개수가 아닌 현재 남아있는 token 개수를 반환한다.

  • boolean hasMoreElements()
  • boolean hasMoreTokens()
- 사용할 수 있는 토큰이 남아있는 경우 true 를 반환.

- 더 이상 사용할 토큰이 남아있지 않은 경우 false 를 반환.

- 확인 결과만 반환할 뿐 실제 내용을 읽어들이는 헤드(▼)를 이동시키지 않는다.

- 두가지 메소드는 모두 같은 값을 반환한다.

  • Object nextElement()
  • String nextToken()
- 두가지 메소드 모두 반환형만 다른, 같은 객체를 반환.

- 다음 토큰을 얻어오며 헤드(▼)를 이동시킨다.

- 구분자를 변경하여도 다음 호출 시에 바뀐 구분자를 이용하여 토큰을 분리한다.

🔎 [참고 사이트]

reakwon.tistory
velog.io/@hyojin_j

profile
응애 나 아기 뉴비

0개의 댓글