Table of Contents
코틀린 독학 13번째 Java Scanner를 사용한 표준 입력
readln()
때로는 표준 입력에서 데이터를 읽는 데 사용하기에 충분하지 않은 경우도 있습니다 . 예를 들어 데이터 흐름에서만 찾 거나 한 단어씩 순차적으로 데이터를 읽고 이러한 읽기를 단계별로 제어하는 등의 readln()
복잡한 작업에는 적합하지 않습니다 . 이 주제에서는 Kotlin에서도 사용할 수 있는 Java 도구 중 하나인 .Integers
Doubles
Scanner
자바 스캐너란 무엇입니까?
스캐너는 표준 입력에서 데이터를 얻는 또 다른 방법입니다. 다른 Java 라이브러리와 상호 운용이 가능하므로 Kotlin에서 직접 액세스할 수 있습니다. Scanner
프로그램이 표준 입력에서 다양한 유형 (문자열, 숫자 등)의 값을 읽을 수 있도록 합니다.
이를 사용하려면 소스 코드가 포함된 파일 상단에 다음 import 문을 추가해야 합니다.
import java.util.Scanner
또는
import java.util.*
Scanner
두 가지 방법 중 하나를 사용하여 프로그램에 추가할 수 있습니다 . 가져오기에 대해서는 나중에 자세히 다루겠습니다.
다음으로 초기화되는 변수를 만들어 보겠습니다 Scanner
.
val scanner = Scanner(System.`in`)
이 줄에는 표준 입력 스트림을System.`in`
나타내는 객체가 있습니다 . 이를 내부 데이터 소스로 래핑하고 이를 사용하여 작업할 수 있는 편리한 방법 세트를 제공합니다. 물론 변수를 만드는 대신 코드에서 사용할 수 있지만 단일 변수를 사용하는 것이 더 편리하고 읽기 쉬운 방법입니다.scanner
Scanner(System.`in`)
scanner
이제 표준 입력에서 데이터를 읽을 수 있습니다.
val line = scanner.nextLine() // read a whole line, e.g., "Hello, Kotlin"
val num = scanner.nextInt() // read a number, e.g., 123
val string = scanner.next() // read a string, e.g., "Hello"
scanner.next()
한 줄도 읽지 않고 한 단어 만 읽습니다 . 사용자가 를 입력하면 Hello, Kotlin
로 읽혀집니다 Hello,
.
전화를 걸 scanner.nextLine()
거나 scanner.nextInt()
비슷한 것을 하면 프로그램은 입력 데이터를 예상합니다. 다음은 올바른 입력 데이터의 예입니다.
Hello, Kotlin
123 Hello
아래 입력 예도 유효합니다.
Hello, Kotlin
123
Hello
scanner.next()
또는 숫자가 scanner.nextLine()
새 줄에 있는 경우를 사용하여 숫자를 문자열로 읽을 수 있습니다 .
또한 이 Scanner
유형은 다른 유형의 값을 읽기 위한 여러 메서드(함수)를 제공합니다. 자세한 내용은 클래스 스캐너 문서를 참조하세요 .
아래 프로그램은 두 개의 숫자를 읽고 이를 두 개의 다른 라인에 역순으로 출력합니다.
import java.util.Scanner // a class (type) from the Java standard library
fun main() {
val scanner = Scanner(System.`in`) // reads data
val num1 = scanner.nextInt() // reads the first number
val num2 = scanner.nextInt() // reads the second number
println(num2) // prints the second number
println(num1) // prints the first number
}
좋아, 이제 데이터를 읽었으므로 Scanner
더 이상 필요하지 않습니다. 를 사용했을 때 readln()
우리는 코드를 진행하고 더 멀리 나아갔습니다. 그러나 Scanner
PC 자원을 항상 소모할 수 있습니다. close()
이를 중지하려면 취소하는 메소드를 사용해야 합니다 Scanner
. 🙂
scanner.close()
이제 우리는 좋습니다.
맞춤 구분 기호
한 가지 중요한 점은 .NET 파일에 데이터를 직접 입력할 수 있다는 것입니다 Scanner
. 보자:
val scanner = Scanner("123_456")
하지만 공백이나 새 줄이 없으면 어떻게 다음 단어를 읽을 수 있습니까? 이러한 경우 Scanner
편리한 도구가 있습니다 — useDelimiter()
. 도움을 받으면 , 등의 메서드에 대한 구분 기호를 사용자 정의할 수 있습니다 next()
. nextInt()
구분 기호의 기본값은 공백입니다.
이러한 단어와 정수를 별도로 읽으려면 새로운 구분 기호를 설정해야 합니다 "_"
.
scanner.useDelimiter("_")
이제 다음 데이터를 읽을 수 있습니다.
println(scanner.nextInt()) // 123
println(scanner.nextInt()) // 456
시원한!
다음 요소 확인
스캐너에 다음과 같은 데이터가 있다고 가정합니다.
val scanner = Scanner("Hello, Kotlin!")
이제 우리는 여러 단어를 읽으려고 노력합니다.
val word1 = scanner.next()
val word2 = scanner.next()
val word3 = scanner.next()
세 번째 단어를 읽으려고 하면 예외가 발생하고 프로그램이 중단됩니다. 그걸로 우리는 무엇을 할 수 있나요? 허, Scanner
이런 상황에 대한 나름의 방법이 있습니다. 이를 hasNext()
( hasNextInt()
, 등)이라고 합니다.
if (scanner.hasNext()) val word1 = scanner.next() // Hello,
if (scanner.hasNext()) val word2 = scanner.next() // Kotlin!
if (scanner.hasNext()) val word3 = scanner.next() // It doesn't work but also doesn't make error
이제 데이터 흐름이 종료되면 데이터를 읽을 수도 있고 읽지 않을 수도 있습니다.
결론
이 주제에서는 표준 입력을 읽는 두 번째 방법인 Java에 대해 논의했습니다 Scanner
. 복잡한 데이터를 읽고 내용을 필터링하는 편리한 방법입니다. 기억해야 할 사항은 다음과 같습니다.
Scanner
필요하지 않은 경우 항상 를 사용하십시오readln()
.- 다양한 유형의 데이터를 읽기 위해 Scanner에는
next()
,nextInt()
및 와 같은 메서드가 있습니다nextLine()
. - 이상한 구분 기호가 포함된 입력이 있는 경우 메소드를 사용하십시오
useDelimiter()
. - 입력에 포함된 단어 수를 모르는 경우 메소드를 사용하십시오
hasNext()
.
이제 코드의 흐름이 어느정도 익숙해진것을 느낄 수 있습니다. 대충 이런 코드 다음에는 이런 코드가 와야한다 같은것을 알 수 있어용. 그리고 이 코드ㅡ
외웁시다! val scanner = Scanner(Systeem. ` in `)
조금 투박하게 하면 위의 코드대로 하고 solution에는 아래과 같은 코드로 나와있습니다.
while 문을 썼는데요, hasNextInt()는 scanner가 정수를 가져올 수 있는지 여부를 확인하여 ‘true’또는 ‘false’값을 반환합니다. 그다음 println을 사용하여 출력하도록 했습니다.