LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Kotlin

Last updated at Posted at 2018-03-21
1 / 49

logo-text.png


自己紹介

  • 政倉 智 (まさくら とも)
  • codeArts 株式会社
  • 趣味: バイク・プログラミング

Kotlin とは?

  • JetBrains 社が開発した JVM で動作するプログラム言語
  • Java の代替となり、相互呼び出しができる
  • オープンソース (2012 年~)
  • null 安全をはじめとして、既定で安全方向
  • 短く書ける

JetBrains 社って?

  • チェコ共和国に本社があるデベロッパーツールの開発・販売を手掛ける
  • IntelliJ IDEA をはじめとする統合開発環境
  • YourTrack, TeamCity などの開発のインフラ製品も

サンクトペテルブルクの R&D?


IntelliJ IDEA って?

  • 2000 年にリリースされた Java の統合開発環境
  • 有償製品だけど、愛好家が多い (OSS 無償の Community Edition あり)
  • 強力なリファクタリングとインスペクションが特徴
  • 近代的な統合開発環境の元祖みたいなもん (個人の主観です)
  • プラグインにより、様々な言語に対応


image.png

ZeroTurnaround 社調べ (2017 年)


IntelliJ をベースとした様々な統合開発環境

  • Rider - C#
  • RubyMine - Ruby
  • PHPStorm - PHP
  • WebStorm - HTML/CSS/JavaScript
  • PyCharm - Python
  • ReSharper - C# (Visual Studio 拡張)

Android Studio は IntelliJ IDEA をベースに Google さんがカスタマイズしたもの


新しい言語に乗り換えるということ


言語 C# -> Java
フレームワーク ASP.NET -> Spring
IDE Visual Studio -> IntelliJ IDEA
ビルドツール MSBuild -> Gradle
パッケージマネージャー nuget -> Maven

言語だけならまだしも...


あらゆるものを学習しなおし


使い慣れたものが使えないストレス


すべて受け入れるかあきらめるかの二択


Kotolin なら!

言語 Java -> Kotlin
フレームワーク Android -> Android
IDE Android Studio -> Android Studio
ビルドツール Gradle -> Gradle
パッケージマネージャー Maven -> Maven

プログラム言語だけを覚えればいい


ストレスフリー!

  • 同一プロジェクトに混在でき、相互呼び出し可能
    • 新しく書く部分だけ Kotlin
    • 複雑な処理は慣れている Java で
  • Java/Android の豊富なライブラリをそのまま使える

初めてでも優しい


チェックボックスを入れるだけ!


Java プロジェクトも簡単に変換できる


Java コードを Kotlin コードに変換


Java コードをコピペでも変換


ノリではじめてノリでやめられる!


Kotlin の紹介


始め方 (Android Studio)

image.png


始め方 (IntelliJ IDEA)

image.png


始め方 (IntelliJ IDEA/Gradle)

image.png


Java -> Kotlin

image.png

  • Java と Kotlin の両方が使えるようになる
  • 元のコードは Java のまま

Java ファイル -> Kotlin ファイル

image.png

Code -> Convert Java File to Kotlin File


コピペで変換する

image.png


変数

val a: Int = 1;
val a: Int = 1 // 末尾のセミコロンは省略可 (省略が普通)
val a = 1 // 型推論

a = 2 // val で宣言した変数は変更できない

var b = 1
b = 2 // var で宣言すると変更できる

null 安全

var a = 1
a = null // null は代入できない
         // Java もプリミティブ型は null にはできない

var a = "abc"
a = null // null は代入できない
         // kotlin ではオブジェクト型も null にはできない

var b? = 1 // ? を付けると null を許容するようになる
b = null

var b? = "abc"
b = null

null 安全

var a: Hoge? = null

// ... 処理

a.display() // コンパイルエラー

if (a != null) {
    a.display() // Hoge 型として扱えるようになる
}

a?.display() // null のときは関数を実行しない

a!!.display() // null のときは例外

関数

// Kotlin ではメソッドじゃなくて関数らしい

fun hello(a: Int, b: String): String {
    return "$a -> $b"
}

// 短く書ける
fun hello(a: Int, b: String): String = "$a -> $b"

// 型推論で戻り値の型を省略
fun hello(a: Int, b: String) = "$a -> $b"

// $ で変数展開できる
// """ """ ってのもある

ファイル

main.kt
// クラスなしでも書ける

package demo

val text = "Hello, world!"

fun main(args: Array<String>) {
    println(text)
}

クラス・オブジェクト

class Hoge // 最小のクラス宣言

var hoge = Hoge() // インスタンス化 (new は不要)

class Hoge {
    private val mText = "hello"

    fun display() = println(mText)
}

// シングルトンオブジェクト
object Fuga {
    private val mText = "hello"

    // アクセス修飾子なしは public
    fun display() = println(mText)
}

コンストラクタ

// 結構いろいろあるのでちゃんとしたドキュメントを!

class Hoge(text: String) {
    private val mText: String

    init {
        mText = text
    }
}

class Hoge(text: String) {
    private val mText = text
}

class Hoge(private val mText)

// セカンダリコンストラクタ
class Hoge(private val mText) {
    constructor() : this("") {
        // ここに何か書く
    }
}

val a = Hoge("hello") // プライマリ
val b = Hoge() // セカンダリ

継承

class Hoge

class Fuga : Hoge() // 既定で継承不可

// open を付けると継承可
open class Hoge

class Fuga: Hoge()

// 関数も open つけないといけない

class Foo {
    fun a() = println("a") // 継承できない
    open fun b() = println("b") // 継承できる
}

class Bar : Foo() {
    override a() = println("A") // 継承できない
    override b() = println("B") // 継承できる
}

コンパニオンオブジェクト

// Kotlin には static class は基本ない

class Hoge {
    fun display() {
        Log.d(TAG, "hello")
    }

    companion object {
        // static っぽく使える
        private const val TAG = "Hoge"

        @JvmStatic // アノテーションを付けると Java から呼び出せる (らしい)
        fun create() = Hoge()
    }
}

プロパティ

class Hoge {
    var prop1: String = "hello"
        get() {
            return field // 暗黙のバッキングフィールド
        }
        set(value) {
            field = value
        }

    var prop2 = "hello"
        get() = field
        set(value) {
            feild = value
        }

    var prop3 = "hello"
        get set

    var prop4 = "hello"
}

読み取り専用プロパティ

class Hoge {
     val prop1 = "hello" // val を使うだけ

     val prop2: String
         get() = "hello" // カスタムアクセサ

     val prop3: String
         get() { // カスタムアクセサ
             return "hello"
         }
}

拡張関数・プロパティ

// 拡張関数
fun String.displayLength() {
    println(this.length)
}

// 拡張プロパティ
val String.tooLong: Boolean
    get() = this.length > 100

"abc".displayLength() // "3" インスタンス関数っぽく呼び出せる
println("abc".tooLong) // "false" プロパティっぽく呼び出せる

おまけ

val a = 15
// if は式 (大体の言語は文)
println(if (a > 15) "大きい" else "小さい")

// or/and
if (a == 15 or b == 20) // or とか and とか
    // ...

if (result = func1()) // 代入は値を返さないのでこれはできない
    // ...               できない方が素晴らしい

// Java の相互運用機能のおかげで getter/setter をプロパティに
class MainActivity : Activity() {
    fun onCreate(/* ... */) {
        super.onCreate(/* ... */)

        val context = this.applicationContext
        // Java は this.getApplicationContext()
    }
}

リファレンス

こっち見たほうがいいよ!


まとめ


  • Kotlin イイヨ!
  • 短い! null 安全!
  • プログラム言語だけに集中できる
  • Java との併用が簡単
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up