おはようエンジニア

まともなエンジニアになりたい

『Kotlinイン・アクション』第2章を読む (その1)

はじめに

Kotlinイン・アクション第2章「Kotlinの基本」を読んでいきます。 

今回は以下2点を中心に書いていこうと思います。

  • 知らなかったこと
  • そのうち忘れそうなこと  

関数

  • mainはトップレベルに宣言できる
    • main用にクラス作らなくてもいい
  • 「ブロック本体」と「式本体」がある
    • 式本体は「波括弧」「return文」「戻り値の型」を省略できる  
// ブロック本体を持つ
fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}
// 式本体を持つ
fun max(a: Int, b: Int) = if (a > b) a else b

変数

  • 変数宣言のキーワードは2つ
    • val (value) はイミュータブルな変数 = Javaのfinal変数
    • var(variable) はミュータブルな変数
  • 文字列テンプレートの機能で文字列に変数を埋め込むことができる
    • 単純な場合 -> "Hello, $name!"
    • 複雑な場合 -> "Hello, ${args[0]!}" (どんなケースが複雑な場合に該当する?)

クラス

  • コンストラクタの中でフィールドを宣言できる
    • class Person(val name: String) でOK
    • ↑のように実装コードがないクラスは値オブジェクトと呼ばれる
  • Kotlin のデフォルトの可視性は public
    • Javapackage private

プロパティ

  • 「プロパティ」=「フィールド」+「アクセサメソッド(getter/setter)」
    • Kotlin ではプロパティは第一級の言語機能(変数や関数と同列)
  • プロパティの宣言はvalまたはvarを使う
    • valでプロパティを宣言するとgetterも宣言される
    • varでプロパティを宣言するとgetter/setterも宣言される
  • 宣言されたgetter/setterはJavaでは命名規則に従って名前決まる
    • プロパティ名name --> getter: getName(), setter: setName()
    • プロパティ名isMarried --> getter: isMarried(), setter: setMarried()
  • カスタムアクセサ
    • ↓のように実装できる。isSquareとget()の間に別の変数を宣言したりするとエラーになる
class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() {
            return height == width
        }
}

パッケージ

  • 全ファイルの冒頭にpackage文を持つことができる
    • 例: package geometry.shapes
  • 別のパッケージに宣言されているものを使う場合はimport
    • 例: import geometry.shapes.createRandomRectangle
    • インポート時はクラスと関数を区別しない
  • packageの階層構造とディレクトリ構造は同じでなくてよい

おわりに

構文を見ているやはり簡潔でわかりやすいと感じました。

getter/setterの命名規則はちょっとクセがありそうなのでプロパティの命名には注意したいと思います。

個人的にはvalとvarが似ているのがちょっと気になりました。実際にはvalを使うケースが多いように思うので、使ってみるとそんなに気にならないかもしれません。

後半は次の記事で書きたいと思います。