Slide 1

Slide 1 text

2018-12-13 Developers Boost 長澤太郎 Androidからサーバーサイドまで! プログラミング言語 Kotlin の魅力

Slide 2

Slide 2 text

長澤 太郎 ● @ngsw_taro ● Ubie株式会社 ソフトウェアエンジニア ● 日本Kotlinユーザグループ代表

Slide 3

Slide 3 text

「世界中の人々を適切な医療に案内する」

Slide 4

Slide 4 text

Kotlin

Slide 5

Slide 5 text

Kotlinとは ● JetBrainsにより開発されているプログラミング言語 ○ IntelliJ IDEAの強力な機能を利用可能 ● 静的型付けオブジェクト指向言語 ○ 言語の種類としてはJavaと同じ ● JVMやAndroidを主要なターゲットとして登場したが、 JavaScriptやNativeも重要なターゲットとしている ● 2011年に発表され、安定版が2016年にリリースされた

Slide 6

Slide 6 text

1. Kotlinのここがスゴイ! 2. KotlinでAndroid開発 3. KotlinでWebアプリ開発

Slide 7

Slide 7 text

本日紹介する Kotlinのスゴイところ ● 読み書きが容易な文法 ● 演算子オーバロード ● 拡張関数

Slide 8

Slide 8 text

読み書きが容易な文法: クラスとプロパティ class 分数(val 分子: Int, val 分母: Int) val half = 分数(1, 2) println(half.分子) // 1と表示される println(half.分母) // 2と表示される

Slide 9

Slide 9 text

読み書きが容易な文法: 文字列テンプレート class 分数(val 分子: Int, val 分母: Int) { override fun toString(): String { return "${分子}/${分母}" } } val half = 分数(1, 2) println(half) // 「1/2」と表示される

Slide 10

Slide 10 text

演算子オーバロード 独自クラスにも演算子を適用可能 class 分数(val 分子: Int, val 分母: Int) { operator fun plus(that: 分数): 分数 { return 分数( 分子 * that.分母 + that.分子 * 分母, 分母 * that.分母 ) } ...略... val sum = 分数(1, 2) + 分数(1, 3) println(sum) 「5/6」と表示される

Slide 11

Slide 11 text

拡張関数 既存の型にメソッドを追加しているように見せる operator fun Int.plus(r: 分数): 分数 { return 分数( this * r.分母 + r.分子, r.分母 ) } val sum = 2 + 分数(1, 5) println(sum) 「11/5」と表示される

Slide 12

Slide 12 text

1. Kotlinのここがスゴイ! 2. KotlinでAndroid開発 3. KotlinでWebアプリ開発

Slide 13

Slide 13 text

Android開発におけるKotlinのスゴイところ ● Javaとの相互運用性 ● @Percelize ● コルーチン

Slide 14

Slide 14 text

Javaとの相互運用性: 例えばSAM変換 button.setOnClickListener(object: OnClickListener { override fun onClick(view: View) { /* クリック時の処理 */ } }) button.setOnClickListener { /* クリック時の処理 */ }

Slide 15

Slide 15 text

@Percelize Percelable対応クラスを自動実装してくれる仕組み @Percelize class User( val id: Long, val name: String ): Percelable ● Androidでオブジェクトをシリアライズする仕組み ● 仕様に沿った実装を提供する必要があり、冗長になりがち ● JavaにはあるがKotlinには存在しない概念が必要 ○ 回避策はあるがあまりスマートにならない

Slide 16

Slide 16 text

コルーチン 特にasync/awaitによる非同期処理 // コールバック方式 api.getFoo { foo -> api.getBar(foo) { bar -> show(bar) } } // コルーチン GlobalScope.launch(Dispatchers.Main) { val foo = async { api.getFoo() }.await() val bar = async { api.getBar(foo) }.await() show(bar) }

Slide 17

Slide 17 text

1. Kotlinのここがスゴイ! 2. KotlinでAndroid開発 3. KotlinでWebアプリ開発

Slide 18

Slide 18 text

Webアプリ開発におけるKotlinのスゴイところ ● Spring Framework 対応 ● Kotlin向けWAF Ktor

Slide 19

Slide 19 text

Spring Bootプロジェクトの雛形作成 Webサイト または IntelliJ IDEA で 簡単にプロジェクト雛形を作 成可能

Slide 20

Slide 20 text

アノテーションベースのいつものSpring @SpringBootApplication class DemoApplication fun main(args: Array) { runApplication(*args) } @Service class HelloWorldService { fun helloWorld(): String = "Hello, world!" } @RestController class HelloWorldController(val helloWorldService: HelloWorldService) { @GetMapping("/hello-world") fun helloWorld(): String = helloWorldService.helloWorld() }

Slide 21

Slide 21 text

KotlinDSLによるDIとルーティング設定も fun main(args: Array) { SpringApplicationBuilder() .sources(DemoApplication::class.java) .initializers(beans { bean { HelloWorldService() } bean { HelloWorldController(ref()) } bean { router { GET("/hello-world") { ref().helloWorld() } } } }) .run(*args) } Bean 登録 routing 設定

Slide 22

Slide 22 text

Kotlin向けWebアプリフレームワーク Ktor ● https://github.com/ktorio/ktor ● JetBrainsにより開発 ● 先日 1.0.0がリリースされた(現在 1.0.1) ● いわゆるマイクロ・フレームワーク ● Kotlin DSLによるルーティング設定 ● ノンブロッキング、コルーチン対応 fun main(args: Array) { embeddedServer(Netty, 8080) { routing { get("/") { call.respondText("Hello, world!", ContentType.Text.Html) } } }.start(wait = true) }

Slide 23

Slide 23 text

まとめ ● KotlinはJetBrainsに開発されている若い言語 ● 書いて楽しい!読んで快適!実践主義な文法 ● 相互運用性が高く、既存のJava資産を活かせる ● コルーチンにより、簡単なコードで軽量スレッド ● Webアプリケーション用フレームワークも充実