『Kotlin in Action』を読んだのでそれを自分なりにまとめてみる。[①Kotlinの基本編]
こんにちは〜
最近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
ならgetter
、var
なら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
例外の処理には、try
、catch
、finally
が使えます。
Kotlinでは、関数からスローされる例外を指定する必要はなく、使用する側でどの例外でも処理してもいいし、しなくてもいいようになっています。
また、Kotlinではtry
はif
などと同じように式として使用されるので、変数にその値を割り当てることができます。
fun readNum(reader: BufferReader) {
val num = try {
Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
// 例外が発生した場合、nullが代入される
null
}
}
最後に
今回はKotlinの基本的なところをやっていきましたが、個人的にはやっぱりwhen
がすごいいいな〜と改めて感じたので、これからもっと使いこなせるようになっていきたいと思いました。
以上!화이팅!!🔥
Discussion