📚

『Kotlin in Action』を読んだのでそれを自分なりにまとめてみる。[①Kotlinの基本編]

2022/01/02に公開

こんにちは〜

最近Kotlin in Actionという、Kotlinの有名な本があるのですが、それを読んですごく勉強になったので、一章ごとに自分なりにまとめて見ようと思います。

今回は、第二章の[kotlinの基本]をまとめてみます。

Kotlinのif式

Kotlinでは、ifは式であり文ではありません。
式と文の違いは、式は別の式の一部として使用できるところです。

Kotlinでは、関数の本体が一つの式しかない場合に波括弧とreturnを省略できます。

fun example(a: Int, b: Int) = if (a > b) a else b

めちゃくちゃシンプルです。

ifの中身が、一つの場合にも波括弧を省略することができます。

さらにこの関数をみてわかるのが、戻り値の型がありません。
Kotlinでは型推論があるので、式本体の関数については戻り値の型を省略することができるのです。
もちろん、式本体でない関数には戻り値の型を記述する必要があります。

Kotlinの変数

浮動小数点を持った定数を初期化式として使用した場合には、Double型で初期化されます。

// Double型
val example = 4.2

val変数

val変数は、イミュータブル(変更不可)ですがそれが指すオブジェクトは変更可能です。

// val変数として定義
val company = arrayListOf("Google")
// オブジェクトを変更する
company.add("Apple")

var変数

var変数は、変更は可能ですが型は固定されています。

var i = 42
i = "Hey!" // <- エラー

文字列テンプレート

他のスクリプト言語のように、$を変数の前におくことで文字列リテラルの中でローカル変数を参照できます。
また、${}の中であれば""も使うことができます。

fun example() {
	val fortyTwo = 42
	println("${if (fortyTwo > 42) "over" else fortyTwo}")
}

クラスとプロパティ

クラスのプロパティを宣言する時は、それに対応するアクセサも宣言されたことになります。
valならgettervarならsetterになります。

class Example(val name: String, var age: Int) {
	// 処理を記述
}

このクラスにアクセスするには以下のように記述します。

val example = Example("Mark Zuckerberg", 37)
println(example.name)
// Mark Zuckerbergと出力
println(example.age)
// 37が出力

enumとwhen

enum

Kotlinでのenumは、Javaと同様にただの値のリストではなく、enumクラスのプロパティやメソッドを宣言できます。

enumクラスにプロパティを宣言した場合には、enum定数にプロパティの値を指定する必要があります。

enum class Company(
	val president: String
) {
	Apple("Timothy Donald Cook"), Google("Sunder Pichai"),
	Facebook("Mark Zuckerberg"), Amazon("Andy Jassy");
	fun showPresident() {
		// 処理を記述
	}
}

この時に注意しなければならないのが、enumクラスの中でメソッドを宣言する場合に限り、enum定数とメソッドを分けれるように;がenum定数の列挙の最後に必要になります。

when

Kotlinのwhenは、他のプログラミング言語でいうswitch的なやつです。
whenも、ifと同じように式なので値を返します。

fun getPresident(president1: Company, president2: Company) =
    when (setOf(president1, president2)) {
		setOf(Company.Apple, Company.Google)
		    -> "Timothy Donald Cook and Sunder Pichai"
		setOf(Company.Facebook, Company.Amazon)
		    -> "Mark Zuckerberg and Andy Jassy"
		else -> "I don't know"
	}

whenの引数にpresidentを渡すことで、それに応じて値を返しています。
どの選択肢にも当てはまらなかった場合には、elseが実行されます。

setOfで関数の引数の2つの値が、それぞれ対応していた場合に値を返すようにすることができます。
この時に使用しているsetOfは、順番がたとえ違うの場合でもしっかりチェックすることができます。

Javaのswitchと違い、分岐の条件に文字列などを使うことが求められておらず、Kotlinのwhenではどのようなオブジェクトでも使用することができます。

is

Kotlinでは、isを使うことで変数が目的の型かどうかをチェックすることができます。

if (num is Int) {
	// 処理を記述
}

繰り返し処理(while, for)

while

KotlinではJavaと全く同じようにwhileを記述できます。

while (条件) {
	// 処理を記述
}

for

Kotlinでは、レンジという概念を用います。

for (i in 0..42) {
	println(i)
}

この場合、iには0から42までの数字が代入されます。
0..42..演算子で範囲を表すことができます。

さらに、Kotlinではステップというのも使えます。

for (i in 42 downTo 1 step 3) {
	println(i)
}

downToで降順にして、stepで3づつiに数値を代入しています。

マップでの繰り返し処理では、以下のように記述します。

val mapReps = TreeMap<Int, String>()
for (i in 1..10) {
	val binary = i
	mapReps[i] = binary.toBinaryString(i.toInt())
}
for ((index, binary) in mapReps) {
	println("$index = $binary")
}

上記の場合、indexはキーを保存しbinaryは値を保存しています。

in

Kotlinのinでは、その値がレンジに含まれているかどうかを判断することができます。
例えば、ある値が'A'..'Z'に含まれているかどうかを判断するために以下のように記述できます。

fun includeDigit(c: Char) = c in 'A'..'Z'

この関数の場合、戻り値はBoolean型となり、含まれている場合はtrueをそうでない場合はfalseを返します。

逆に!inでは、含まれていないことのチェックができます。

fun isNotIncludeDigit(c: Char) = c !in 'A'..'Z'

さらにin!inどちらもwhen式の中でも使用することができます。

fun digit(c: Char) =
    when (c) {
		in 'A'..'Z' -> "digit"
		else -> "is not digit"
	}

Kotlinの例外処理

try, catch, finally

例外の処理には、trycatchfinallyが使えます。
Kotlinでは、関数からスローされる例外を指定する必要はなく、使用する側でどの例外でも処理してもいいし、しなくてもいいようになっています。

また、Kotlinではtryifなどと同じように式として使用されるので、変数にその値を割り当てることができます。

fun readNum(reader: BufferReader) {
	val num = try {
		Integer.parseInt(reader.readLine())
	} catch (e: NumberFormatException) {
		// 例外が発生した場合、nullが代入される
		null
	}
}

最後に

今回はKotlinの基本的なところをやっていきましたが、個人的にはやっぱりwhenがすごいいいな〜と改めて感じたので、これからもっと使いこなせるようになっていきたいと思いました。
以上!화이팅!!🔥

Discussion