Slide 1

Slide 1 text

はじめてのKotlin ABC 2017 Autumn 2017-10-14 長澤太郎 @ngsw_taro

Slide 2

Slide 2 text

自己紹介 ● 長澤 太郎(たろーって呼んでね) ● @ngsw_taro ● エムスリー株式会社 ● ディズニーが大好き! エムスリーは 国内最大規模の 医療情報プラット フォームを開発・ 運営しています。 エンジニア募 集中!

Slide 3

Slide 3 text

祝☆新刊 10/6発売

Slide 4

Slide 4 text

もくじ 1. Kotlin概要と誕生の背景 2. Hello World 3. 基本的な文法 4. Kotlinの特徴的な機能 5. Androidで活用する

Slide 5

Slide 5 text

1. Kotlin概要と誕生の背景

Slide 6

Slide 6 text

Javaっていいよね ● 進化を続けるプログラミング言語 ○ しかも後方互換性を維持 ● 歴史長い、人口多い ○ ライブラリ・フレームワークが多い ○ 知見が多い ● 高性能・高信頼性のJava仮想マシン

Slide 7

Slide 7 text

しかしその反面、問題も... ● 冗長、ボイラープレートの嵐 ● nullポインタのデリファレンス問題 ● 後方互換性の維持 ○ 古い文法が存在する ○ 型安全性に問題あり

Slide 8

Slide 8 text

Kotlin誕生!

Slide 9

Slide 9 text

Kotlinとは? ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0

Slide 10

Slide 10 text

Kotlinとは? ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0 静的型付け: プログラムの実行前(コンパイル時)に型が決まる オブジェクト指向: Javaと同じく対象物(オブジェクト)に着目してプログラ ムを組み上げる

Slide 11

Slide 11 text

Kotlinとは? ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0 Java仮想マシン(JVM)の上で動作する「Javaバイトコード」 にコンパイルされるようなプログラミング言語 JavaScriptやLLVMもターゲットに!?

Slide 12

Slide 12 text

Kotlinとは? ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0 統合開発環境 IntelliJ IDEAの開発元の会社。 Googleと共同で財団の設立。 大きな後ろ盾があることを意味する。

Slide 13

Slide 13 text

Kotlinとは? ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0 新しい言語です!現在 ver1.1.51

Slide 14

Slide 14 text

Kotlinとは? ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0 オープンソースです。 ソースコードを自由に入手・改造できる!

Slide 15

Slide 15 text

Kotlinの特徴 簡単 文法、コードの見た目がわかりや すい。学習コストが低そう 安全 型安全、Null安全 Android Googleのお墨付き Interop KotlinからJavaコードを、Javaから Kotlinコードを相互に呼び出せる

Slide 16

Slide 16 text

2. HelloWorld

Slide 17

Slide 17 text

いろんな開発環境 ● Try Kotlin ● IntelliJ IDEA ● CLIコンパイラ ● Eclipse ● Visual Studio Code

Slide 18

Slide 18 text

Try Kotlin ● http://try.kotl.in ● ブラウザ上で試せる開発環境

Slide 19

Slide 19 text

Hello Worldに見るKotlinの特徴 package sample fun main(args: Array) { println("Hello, world!") }

Slide 20

Slide 20 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 パッケージがファイルシステムと無関係 : srcディレクトリ直下に置いたにも関わらず、パッ ケージを切れる。

Slide 21

Slide 21 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 funキーワードで関数を定義

Slide 22

Slide 22 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 トップレベル(パッケージ直下) に関数を置ける

Slide 23

Slide 23 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 main関数がKotlinプログラムの エントリポイント

Slide 24

Slide 24 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 変数(引数)の型は後置

Slide 25

Slide 25 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 配列はクラスで表現。 特別な文法はない

Slide 26

Slide 26 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 Kotlin標準ライブラリの 関数呼び出し

Slide 27

Slide 27 text

package sample fun main(args: Array) { println("Hello, world!") } Hello Worldに見るKotlinの特徴 セミコロン不要

Slide 28

Slide 28 text

3. 基本的な文法

Slide 29

Slide 29 text

いろんなオブジェクトをprintしてみよう! fun main(args: Array) { println(123) // 整数 println(123.4) // 浮動小数点数 println(true) // 真偽値 println('A') // 文字 println("Hello") // 文字列 }

Slide 30

Slide 30 text

いろんなオブジェクトをprintしてみよう! オブジェクトの表現を直接ソースコードに 記述したものを「リテラル」と呼ぶ fun main(args: Array) { println(123) // 整数 println(123.4) // 浮動小数点数 println(true) // 真偽値 println('A') // 文字 println("Hello") // 文字列 }

Slide 31

Slide 31 text

オブジェクトを操作しよう! fun main(args: Array) { println(1 + 2) //=> 3 println(2 * 3) //=> 6 println(3 * 4.0) //=> 12.0 println(4 < 5) //=> true println('A'.toDigit()) //=> false println("Hi".toUpperCase()) //=> Hi }

Slide 32

Slide 32 text

fun main(args: Array) { println(1 + 2) //=> 3 println(2 * 3) //=> 6 println(3 * 4.0) //=> 12.0 println(4 < 5) //=> true println('A'.toDigit()) //=> false println("Hi".toUpperCase()) //=> HI } オブジェクトを操作しよう! 演算子やメソッドを呼び出したり、 だいたいJavaと同じ感じ!

Slide 33

Slide 33 text

オブジェクトに名前をつけよう! fun main(args: Array) { val userName: String = "たろう" val userAge: Int = 28 println("${userName}さんは${userAge}歳です") }

Slide 34

Slide 34 text

fun main(args: Array) { val userName: String = "たろう" val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前をつけよう! オブジェクトに名前を付けることで、 以降この名前でオブジェクトを参照できる

Slide 35

Slide 35 text

fun main(args: Array) { val userName: String = "たろう" val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前をつけよう! このキーワードがミソ

Slide 36

Slide 36 text

fun main(args: Array) { val userName: String = "たろう" val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前をつけよう! 名前(変数)

Slide 37

Slide 37 text

fun main(args: Array) { val userName: String = "たろう" val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前をつけよう! 変数の型

Slide 38

Slide 38 text

fun main(args: Array) { val userName: String = "たろう" val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前をつけよう! 「文字列テンプレート」と呼ばれる機能により ${...}内が評価された結果が、文字列リテラルに埋め込まれる

Slide 39

Slide 39 text

fun main(args: Array) { val userName = "たろう" val userAge = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前をつけよう! 型を省略することができる=型推論

Slide 40

Slide 40 text

条件分岐 val score = 65 if (score >= 60) { println("合格") } else { println("失格") } Javaや他の言語と同じ感じ

Slide 41

Slide 41 text

ifは式(値を返すよ) val score = 65 val message = if (score >= 60) { "合格だよ〜ん" } else { "残念、失格" } println(message) //=> 合格だよ〜ん

Slide 42

Slide 42 text

forループ val names = listOf("foo", "bar", "baz") for(name in names) { println(name) }

Slide 43

Slide 43 text

val names = listOf("foo", "bar", "baz") for(name in names) { println(name) } forループ リストを作る関数listOf

Slide 44

Slide 44 text

val names = listOf("foo", "bar", "baz") for(name in names) { println(name) } forループ Javaで言う拡張for文のイメージ

Slide 45

Slide 45 text

代入 val nums = listOf(1, 4, 2) var sum = 0 for(n in nums) { sum = sum + n } println(sum) //=> 7

Slide 46

Slide 46 text

val nums = listOf(1, 4, 2) var sum = 0 for(n in nums) { sum = sum + n } println(sum) //=> 7 代入 varにより代入可能となる sumの指す値は、場所や時間によって変化し得る

Slide 47

Slide 47 text

4. Kotlinの特徴的な機能

Slide 48

Slide 48 text

拡張関数 既存のクラスやインタフェースを変更せずに、新たにメソッドを追 加するような機能。 fun String.hello() { println("Hello, $this!") } "world".hello()

Slide 49

Slide 49 text

拡張関数 既存のクラスやインタフェースを変更せずに、新たにメソッドを追 加するような機能。 fun String.hello() { println("Hello, $this!") } "world".hello() Stringに対して 拡張関数を定義 メソッドのように呼 び出せる

Slide 50

Slide 50 text

拡張関数 既存のクラスやインタフェースを変更せずに、新たにメソッドを追 加するような機能。 fun String.hello() { println("Hello, $this!") } "world".hello() thisでレシーバ を参照できる

Slide 51

Slide 51 text

拡張関数 既存のクラスやインタフェースを変更せずに、新たにメソッドを追 加するような機能。 fun String.hello() { println("Hello, $this!") } "world".hello() 文字列テンプレート

Slide 52

Slide 52 text

Null安全 ● nullの可能性のあるものと、そうでないものを厳格に 区別することでケアレスミスを防ぐ ● nullの可能性のない型(NotNull) ● nullの可能性のある型(Nullable) ?をつけて表現 val a: Int = null // コンパイルエラー val b: Int? = null // OK b.toString() // コンパイルエラー

Slide 53

Slide 53 text

Nullableの扱いは、とことん慎重に val s: String? = getString() s.length // コンパイルエラー これを許してしまうと NPEの原因になる

Slide 54

Slide 54 text

if文などによるnullチェック if (s != null) { s.length } nullでないことが保証される文脈 ではNotNullとして扱える

Slide 55

Slide 55 text

安全呼び出し s?.length if (s != null) s.length else null 同じ if-elseは式 (評価されて値になる)

Slide 56

Slide 56 text

安全呼び出し s?.length if (s != null) s.length else null 同じ if-elseは式 (評価されて値になる) foo?.bar()?.baz()?.qux() メソッドチェーンで役立つ

Slide 57

Slide 57 text

5. Androidで活用する

Slide 58

Slide 58 text

KotlinコードをAndroidで動かす方法 1. File→New→New Project… またはStart a Android Studio project 2. すべてデフォルトの設定でOK 3. ウィザードのFinishボタンを押す 4. Tools→Kotlin→Configure Kotlin in Project 5. 「Kotlin 1.1.51」になっていることを確認してOK 6. Code→Convert Java File to Kotlin File 7. ビルド&実行

Slide 59

Slide 59 text

デモ

Slide 60

Slide 60 text

簡単に解説 class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }

Slide 61

Slide 61 text

簡単に解説 class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } 継承 + スーパクラスのコンストラクタ呼び出し

Slide 62

Slide 62 text

class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } 簡単に解説 オーバライドするために必須

Slide 63

Slide 63 text

class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } 簡単に解説 BundleのNullable型(null許容型)

Slide 64

Slide 64 text

まとめ ● Kotlin概要 ○ 静的型付けオブジェクト指向JVM言語 ○ JetBrains, Googleにより開発・サポート ● HelloWorld ● 基本的な文法 ○ if-else式、for文、型推論、文字列テンプレートなど ● 特徴的な機能 ○ 拡張関数: 既存の型にメソッドを追加してるっぽく ○ Null安全: nullの扱いを慎重に安全に