プログラマに優しい現実指向JVM言語 Kotlin入門

第3回 Kotlinを学ぶ

この記事を読むのに必要な時間:およそ 7 分

前回ではKotlinの開発環境構築について解説しました。今回はKotlinのプログラミング言語としての文法や機能をじっくり紹介していきます。

定番のHello World

まず紹介するのはHello Worldプログラムです。第1回でも紹介しましたが,もう一度確認しましょう。

リスト1は実行されると標準出力に「Hello,world!」と書き込んで終了するだけのプログラムです。main関数はKotlinプログラムのエントリポイントです。main関数はクラスに属さずパッケージ直下に置く必要があります。パッケージ名はJavaと同じようにドメイン名をひっくり返してピリオド.区切りのスタイルです。

リスト1 KotlinでHello World

package com.taroid.sample

fun main(args: Array<String>) {
  println("Hello, world!")
}

実際に動かすにはKotlinコンパイラやIntelliJ IDEA(+Kotlinプラグイン)などを使用します。ちょっと試してみたいときにはKotlin WebDemo注1というWebブラウザ上でKotlinコードを編集,実行できる環境がお勧めです。

注1)
Webブラウザで試せる新しい環境がローンチされました。
http://try.kotlinlang.org/

変数の使い方

今はただ世界に挨拶するだけのプログラムですが,挨拶する対象を変数として切り出してみましょうリスト2)⁠

リスト2 変数を使う

fun main(args: Array<String>) {
  val name: String = "Taro"
  println("Hello, ${name}!") // => Hello, Taro
}

nameという名前の変数に挨拶する相手の名前を代入しています(好きな名前を代入してください!)⁠変数の宣言にはvalキーワードまたはvarキーワードが必要です。valを使うとその変数は再代入,すなわち変更が不可能な変数になります。varを使うと再代入可能な変数になります。基本的にはvalを使用し,varを使うのは最小限にとどめておきましょう。

nameの宣言でStringというがアノテートされています。nameString型であることを明示しているわけです。しかし右辺の"Taro"という文字列リテラルの存在によって,nameString=文字列)ということは明白であり,型のアノテートは冗長に思えます。実際,Kotlinコンパイラはこのような場合には型の明示的なアノテートなしにnameString型だと推論してくれます。たとえばval name = "Taro"のように変数定義ができます。このようなしくみを型推論と呼びますが,Kotlinでは変数定義以外のさまざまな場所でも型推論が働きます。

さて,挨拶する相手の名前をnameという変数に代入していることがわかりました。次に挨拶文を出力するコードです。"Hello, ${name}!"Stringテンプレートと呼ばれている機能です。式を埋め込むことが可能で,その計算結果が反映された文字列を生成します。今回の場合,nameの中身が"Taro"なので"Hello, Taro!"という文字列が得られます注2)⁠

注2)
+による文字列連結でも同じ結果を得られますがStringテンプレートを使うとどのような文字列が生成されるかが一見してわかりやすくなります。

コマンドライン引数の使い方

挨拶する相手の名前を変数に定義しましたが,今は名前が固定で挨拶プログラムとしては実用的ではありません。プログラム利用者が名前を指定できると便利そうです。そこでプログラム実行時に渡されるコマンドライン引数を使います。Kotlinの場合,main関数の引数argsにコマンドライン引数が設定されていますリスト3)⁠

リスト3 コマンドライン引数に指定された名前を使う

fun main(args: Array<String>) {
  val name = args[0]
  println("Hello, ${name}!")
}

argsArray<String>からもわかるとおり文字列の配列です。0が配列の最初の要素のインデックスです。args[0]には複数渡され得るコマンドライン引数の最初の引数が代入されています。コマンドライン引数が指定されずに実行された場合,リスト3はargs[0]によりクラッシュします。

if式の使い方

そこで,argsが空の場合は,デフォルトの名前を使って挨拶するように変更します。状況によって処理を分岐する構文は,Javaでもお馴染みのif-elseですリスト4)⁠

リスト4 argsが空でないことを確認する

fun main(args: Array<String>) {
  if (args.isNotEmpty()) {
    println("Hello, ${args[0]}!")
  } else {
    println("Hello, 名無しさん!")
  }
}

isNotEmptyメソッドにより,配列が空でないかどうかを調べています。配列が空でない場合,すなわちisNotEmptytrueを返す場合はifの後に続くブロックを実行します。それ以外の場合はelseの後に続くブロックを実行します。Javaにおけるif-elseと同様に,リスト4のように分岐後のブロック内の文が1つの場合に限り波括弧{ }を省略して記述できます。

Kotlinのif-elseは式です。つまりif-elseは値を返します。それはちょうどJavaの条件演算子注3と同じ動きをします。リスト4を書き直すとリスト5のようになります。

リスト5 if-elseは式である

fun main(args: Array<String>) {
  val name = if (args.isNotEmpty()) args[0] else "名無しさん"
  println("Hello, ${name}!")
}
注3)
(condition) ? a : bと記述する,Javaで唯一の三項演算子です。

forループの使い方

複数指定されたコマンドライン引数に対し,すべてにHelloと言いたい場合にはforループを使いますリスト6)⁠

リスト6 argsの各要素に繰り返しHelloする

fun main(args: Array<String>) {
  for (name in args) {
    println("Hello, ${name}!")
  }
}

このように,Kotlinのforは,Javaにおける「拡張for文」に似ています。ループカウンタを増やして行くスタイルのループを,Kotlinのforはサポートしていません。

著者プロフィール

長澤太郎(ながさわたろう)

早稲田大学情報理工学科を2012年に卒業。同年入社したメーカー系SIerを経て,2013年にエムスリー株式会社へ入社。以来,世界の医療を変革するためソフトウェアエンジニアとして従事。

日本Kotlinユーザグループ代表,日本Javaユーザグループ幹事を務める。国内初となるKotlin入門書「Kotlinスタートブック」(リックテレコム)の著者。

ビールとディズニーが大好き。

コメント

コメントの記入