まずはこれだけ!Kotlin基本文法厳選まとめ

kotlin プログラミング

Kotlinとは

Kotlin(コトリン)は、2011年に登場した、モダンなプログラミング言語である。
Androidアプリの開発言語として、Google I/O 2017で正式採用された。
ここでは、Kotlinでプログラミングするときに最低限必要となる基本文法を、厳選してまとめている。

基本文法

変数

val constNum = 1      // 定数
var variableNum = 1   // 変数
val typedNum: Int = 1 // 明示的型宣言

基本型

val byteValue:    Byte   = 1     // 8bit符号付き整数
val shortValue:   Short  = 1     // 16bit符号付き整数
val intValue:     Int    = 1     // 32bit符号付き整数
val longValue:    Long   = 1L    // 64bit符号付き整数
val floatValue:   Float  = 1.0f  // 32bit浮動小数点数
val doubleValue:  Double = 1.0   // 64bit浮動小数点数
val charValue:    Char   = 'c'   // 文字
val stringValue:  String = "str" // 文字列
val booleanValue: Boolean = true // 真偽値

数値記法

val int32 = 1      // 10進数(32bit)
val int64 = 1L     // 10進数(64bit)
val hex   = 0x1f   // 16進数
val bin   = 0b1001 // 2進数
val flt   = 1.0f   // 32bit浮動小数点数
val dbl   = 1.0    // 64bit浮動小数点数
val exp   = 1.0e8  // 指数表記(1.0 * 10^8)

文字・文字列

val character = 'c'      // 文字
val escape    = '\n'     // エスケープ文字
val unicode   = '\uFF00' // Unicode

val str = "string value" // 文字列

// トリプルクォート
val sentence =
"""
私は文章です。
    改行やインデントがそのまま反映されます。
""".trimMargin() // 先頭の空白を削除

// 文字列テンプレート
val num = 10
val msg = "numの値は$numです。" // 「numの値は10です。」と評価される
val calc = "num * 10の計算結果は${num * 10}です。" // 「num * 10の計算結果は100です。」と評価される

// 文字列へのアクセス・イテレート
val str = "abcdefg"
val c = str[2] // 'c'
for (ch in str) {
    plint(ch)
}
// output: abcdefg

ビット演算

val flags = 0b00001111
val mask  = 0b10000010
val shiftLeft   = mask shl 1     // 0b10000100(符号付左シフト)
val shiftRight  = mask shr 1     // 0b11000001(符号付右シフト)
val ushiftRight = mask ushr 1    // 0b01000001(符号なし右シフト)
val flagAnd     = flags and mask // 0b00000010(論理積)
val flagOr      = flags or mask  // 0b10001111(論理和)
val flagXor     = flags xor mask // 0b10001101(排他的論理和)
val flagInv     = flags.inv()    // 0b11110000(反転)

Nullable

var str: String = "abc" // OK(通常の文字列型)
str = null // NG(コンパイルエラー)
val len = str.length // OK(strはnullでないことが保証されているため)

var nStr: String? = "abc" // OK(Nullableな文字列型)
nStr = null // OK(Nullableな型へのnull代入)
val nLen = nStr.length // NG(nStrはnullの可能性があるため、コンパイル時にエラーを出してくれる)

// Nullableへのいろいろなアクセス方法
if (nStr != null) {
    // ここではnStrがnullでないことが保証されているため、アクセス可能
    val len1 = nStr.length
}

val len2 = nStr?.length // nStrがnullならnull、そうでなければlength
val len3 = nStr?.length ?: -1 // ?:(エルビス演算子)の左がnullなら-1、そうでなければ左

配列(固定長配列)

val fixedNums = arrayOf(1, 2, 3) // 値を指定して初期化[1, 2, 3]
val nums = Array(3, { i -> i * i }) // 値を計算して初期化[0, 1, 4]

for (num in nums) {
    print(num)
}
// output: 014

print(nums[2])
// output: 4

nums[2] = 2
print(nums[2])
// output: 2

コレクション

val list = listOf(1, 2, 3) // List<Int>(読み取り専用リスト)
list[0] = 0 // コンパイルエラー

val mList = mutableListOf(1, 2, 3) // MutableList<Int>(読み書き可能リスト)
mList[0] = 0 // 変更可
mList.add(4) // 追加
mList.removeAt(1) // 削除

val map = mapOf(0 to "Hello", 1 to "Map") // Map<Int, String>(読み取り専用マップ)
val map0 = map[0] // アクセス可
map[0] = "Bye" // コンパイルエラー

val mMap = mutableMapOf(0 to "Hello", 1 to "Mutable") // MutableMap<Int, String>(読み書き可能マップ)
val mMap0 = mMap[0] // アクセス可
mMap[0] = "Bye" // 変更可
mMap.put(2, "World") // 追加
mMap.remove(1) // 削除

制御構文

// if文
// Java等と同じく、if(){}方式
var idx = -1
var found = false
if (idx < 0) {
    found = false
}
else {
    found = true
}

// if文自体も評価されて値を持つ
val result = if (idx < 0) false else true
// result = false

// 複数行の場合は最終行が評価される
val mul =
    if (idx < 0) {
        println("not found")
        false
    }
    else {
        println("found")
        true
    }
// mul = false

// when文
// switchの代わりのようなもので、更に便利になっている
var score = 0
var rank = ""
when (score) {
    0          -> rank = "C" // 一つの値に一致
    1, 2       -> rank = "B" // 複数の値のうちどれかに一致
    in 3..99   -> rank = "A" // 指定範囲に含まれている
    100        -> "S"
    !in 0..100 -> rank = "N/A" // 指定範囲に含まれていない
    else {
        println("Assert not reachable here") // どれにも当てはまらない場合
    }
}

// for文
// Javaと少し違い、inを使ったイテレートのみ可能
val items = arrayOf("item0", "item1", "item2")
val itemMap = mapOf(0 to "item0", 1 to "item1", 2 to "item2")
// 指定範囲のイテレート
for (idx in 0..2) {
    print("$items[idx] ")
}
// item0 item1 item2

// 配列やコレクションのイテレート
for (item in items) {
    print("$item ")
}
// item0 item1 item2

// インデックスと値のペアでイテレート
for ((idx, value) in items) {
    print("$idx:$value ")
}
// 0:item0 1:item1 2:item2

// キーと値のペアでイテレート
for ((key, value) in itemMap) {
    print("$key:$value ")
}
// 0:item0 1:item1 2:item2

// while
// 基本的にJava等と同じ
var cnt = 0
while (true) {
    if (cnt >= 10) {
        break
    }
}

do {
    --cnt
} while (cnt > 0)

関数

// 関数定義にはfunキーワードを使用する
// fun funcName(): Unit {} の形
fun plus(lhs: Int, rhs: Int): Int {
    return lhs + rhs
}

// 戻り値のない関数はUnit型を返すような記法になるが、省略可能
fun hello(): Unit {
    println("Hello!!")
}
fun hey() {
    println("Hey!!")
}

// デフォルト引数も定義可能
fun settings(param1: Int = 0, param2: Int = 1, param3: Int = 2) {
    println("set $param1 $param2 $param3")
}

settings()
// output: set 0 1 2

// 名前付き引数も使える
settings(param1 = 100, param3 = 1000)
// output: set 100 1 1000

クラス

// クラス定義にはclassキーワードを使用する
class Actor(name: String) {
    // プライマリコンストラクタ
    init {
        // 引数がここで使える
        println("I'm $name.")
    }

    // セカンダリコンストラクタ
    // プライマリコンストラクタがある場合、それの呼び出し方を定義する必要がある
    constuctor(age: Int): this("unknown") {
        println("I'm $age years old.")
    }

    // セカンダリコンストラクタは複数定義可能
    constructor(gender: String): this("unknown") {
        println("I'm $gender.")
    }

    // プライマリコンストラクタの引数でプロパティを初期化可能
    val myName = name
}

// val、varをつけることで、コンストラクタの引数をそのままプロパティとして使用可能
class Speaker(val msg: String, var time: Int) {
    // openキーワードでオーバーライド可能なメソッドを定義する(デフォルトはオーバーライド不可)
    open fun speak() {
        println("$msg($time min)")
    }
}

// クラスのインスタンス化にnewキーワードはいらない
val speaker = Speaker("Hello everyone!!", 3)
speaker.speak()
// output: Hello everyone!!(3 min)

// 継承には:を使用する
class LongSpeaker(msg: String): Speaker(msg, 100) {
}

longSpeaker = LongSpeaker("Are you tired?")
longSpeaker.speak()
// output: Are you tired?(100 min)

// プロパティには自動でgetter/setterが作成され、カスタマイズも可能
class SecretSpeaker(): Speaker("", 0) {
    var completed: Boolean
    get() {
        msg = "Who?"
        return field
    }
    set(value) {
        field = value
        msg = "Completed"
    }
    override speak() {
        println(msg)
    }
}

// インターフェースの定義にはinterfaceキーワードを使用する
interface Pacemaker {
    // オーバーライドが前提なのでデフォルトでopenになっている
    fun coffeeBreak()
}

class PacemakerImpl: Pacemaker {
    override fun coffeeBreak() {
        println("Let's take coffee break!!")
    }
}

列挙型

// enum class で列挙型を定義する
enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

// 列挙型に値をもたせることができる
enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}
println("RED: $Color.RED.rgb.toString(16)")     // ff0000
println("GREEN: $Color.GREEN.rgb.toString(16)") // 00ff00
println("BLUE: $Color.BLUE.rgb.toString(16)")   // 0000ff

// 文字列から列挙型を取得する
val red = Color.valueOf("RED")
println("red: $red.toString(16)")     // ff0000

// 列挙型をイテレートする
for (color in Color.values()) {
    print("color.ordinal:color.name ")
}
// output: 0:RED 1:GREEN 2:BLUE

シングルトン

// objectキーワードで簡単にシングルトンを定義可能
object EventManager {
    val events = mutableListOf()

    fun registerEvent(eventName: String) {
        events.add(eventName)
    }

    fun executeEvents() {
        for (e in events) {
            println(e)
        }
        events.clear()
    }
}

// オブジェクト名で直接アクセス可能
EventManager.registerEvent("event1")
EventManager.registerEvent("event2")
EventManager.registerEvent("event3")
EventManager.executeEvents()
// event1
// event2
// event3

静的メンバ

// staticキーワードがなく、代わりにcompanion objectを使用する
class Util {
    companion object {
        fun squared(num: Int): Int {
            return num * num
        }

        fun cubed(num: Int): Int {
            return num * num * num
        }
    }
}

// クラス名で直接アクセス可能
println(Util.squared(2)) // 4
println(Util.cubed(2))   // 8

おわりに

まずはこれだけ!と言っておきながら、この記事の総文字数はなんと8000文字超えである。
それだけKotlinが思慮深く、あらゆることを想定して作られた奥の深い言語であると思っていただけるとありがたい。決して私のまとめる力が不足しているわけではないと願いたい。

あとは、この記事を見ながら私自身Androidアプリケーションの開発を進めていき、間違い等あればその都度修正しようと思う。

知れば知るほど、なんと考えて作られた言語だろうと思う。

参考

https://kotlinlang.org/
https://qiita.com/k5n/items/cc0377b75d8537ef8a85

コメント

  1. Hi thеre to аll, the contents рresent at this web site arе trᥙly remarkable foг
    people experience, well, keep up the nice work fellows.

タイトルとURLをコピーしました