Kotlinで標準入力をする方法にはいくつかの選択肢があります。この記事では、それぞれの方法の特徴や使い方を紹介します。
main関数の引数に渡す
Kotlinでは、main関数は引数としてString型の配列を受け取ることができます。この配列には、プログラム実行時にコマンドラインから渡された引数が格納されます。例えば、以下のようなコードを実行すると、
fun main(args: Array<String>) {
for (arg in args) {
println(arg)
}
}
コマンドラインから以下のように引数を渡すと、
$ kotlinc Main.kt -include-runtime -d Main.jar
$ java -jar Main.jar hello world
以下のように出力されます。
hello
world
この方法では、シンプルな記述で入力を受け取ることができますが、実行時に引数を渡す必要があります。また、引数はすべてString型として扱われるため、数値や真偽値などに変換する場合は別途キャストを行う必要があります。
readLine関数を使う
readLine関数はKotlin標準ライブラリに含まれる関数で、標準入力から一行分のテキストを読み込むことができます。例えば、以下のようなコードを実行すると、
fun main() {
println("名前を入力してください")
val name = readLine()
println("年齢を入力してください")
val age = readLine()?.toInt()
println("名前は${name}、年齢は${age}です")
}
コマンドラインから以下のように入力すると、
名前を入力してください
Alice
年齢を入力してください
20
以下のように出力されます。
名前はAlice、年齢は20です
この方法では、プログラム実行中に任意のタイミングで入力を受け取ることができます。また、一行ごとに入力を取得するため、空白区切りや改行区切りなどの形式に対応することができます。
しかし、readLine関数はnullや型に注意して使用する必要があります。readLine関数はString?型(null許容型)を返すため、nullチェックやエルビス演算子(?:)などを使って安全に扱う必要があります。また、readLine関数は文字列として読み込むため、数値や真偽値などに変換する場合はtoIntやtoBooleanなどの拡張関数を使ってキャストする必要があります。
Scannerクラスを使う
ScannerクラスはJava標準ライブラリに含まれるクラスで、標準入力からテキストを区切り文字(デフォルトでは空白)で分割して読み込むことができます。例えば、以下のようなコードを実行すると、
import java.util.Scanner
fun main() {
val scanner = Scanner(System.`in`)
println("名前を入力してください")
val name = scanner.next()
println("年齢を入力してください")
val age = scanner.nextInt()
println("名前は${name}、年齢は${age}です")
}
コマンドラインから以下のように入力すると、
名前を入力してください
Alice
年齢を入力してください
20
以下のように出力されます。
名前はAlice、年齢は20です
この方法では、readLine関数と同様にプログラム実行中に任意のタイミングで入力を受け取ることができます。また、ScannerクラスはnextIntやnextDoubleなどのメソッドを使って、テキストを数値や真偽値などのプリミティブ型に変換することができます。
しかし、ScannerクラスはJavaのクラスであるため、Kotlinのnull安全性や拡張関数などの機能を利用することができません。また、Scannerクラスは区切り文字で分割するために正規表現を使っており、これが処理速度の低下につながる可能性があります。さらに、Scannerクラスは入力ストリームを同期する必要があるために、他の入出力と競合する可能性があります。
まとめ
Kotlinで標準入力をする方法には以下の3つがあります。
- main関数の引数に渡す
- readLine関数を使う
- Scannerクラスを使う
それぞれの方法にはメリットとデメリットがあります。用途や目的に応じて使い分けることが大切です。
ソース: Bing との会話 2023/9/24
(1) Kotlinで標準入力あれこれ - Qiita. https://qiita.com/gumimin/items/eafdf66368d7d63f737c.
(2) Kotlinで標準入力 - Qiita. https://qiita.com/yotu/items/44013287fabd8be75aa1.
(3) Kotlinで標準入力あれこれ - Qiita. https://bing.com/search?q=Kotlin%e3%81%a7%e3%81%ae%e6%a8%99%e6%ba%96%e5%85%a5%e5%8a%9b%e3%81%ae%e6%96%b9%e6%b3%95.