Slide 1

Slide 1 text

Kotlin 初心者向けハンズオン 2017-04-15 @ngsw_taro

Slide 2

Slide 2 text

もくじ 1. Kotlinって何? 2. 開発環境の準備 3. Hello World 4. 基本的な文法 5. 関数に挑戦

Slide 3

Slide 3 text

● 長澤 太郎 たろーって呼んでね ● @ngsw_taro 自己紹介

Slide 4

Slide 4 text

エムスリー株式会社 jobs.m3.com/engineer Wantedly記事 goo.gl/BxK5ZZ

Slide 5

Slide 5 text

自称Kotlinエバンジェリスト ● Kotlin歴 5年 ● 日本Kotlinユーザグループ代表 ● teratailエキスパートユーザ ● 講演実績多数 ○ DroidKaigi 2015, 2016, 2017 ○ JJUG CCC 2015 Fall ○ 福岡、京都など遠征も ● 執筆実績多数 ○ 単行本、商業誌、同人誌

Slide 6

Slide 6 text

1. Kotlinって何?

Slide 7

Slide 7 text

Q. Kotlinって何?

Slide 8

Slide 8 text

Q. Kotlinって何? A. プログラミング言語のひとつ

Slide 9

Slide 9 text

Q. Kotlinって何? A. プログラミング言語のひとつ ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Q. Kotlinって何? A. プログラミング言語のひとつ ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0 統合開発環境 IntelliJ IDEAの開発元の会社。 大きな後ろ盾があることを意味する。

Slide 13

Slide 13 text

Q. Kotlinって何? A. プログラミング言語のひとつ ● 静的型付けオブジェクト指向言語 ● いわゆる「JVM言語」 ● 開発元: JetBrains ● 2016年2月に正式リリース ● Apache License ver2.0 新しい言語です!現在 ver1.1.1

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Q. JVM言語?

Slide 16

Slide 16 text

Q. JVM言語? A. JVMサイコーだけどJava言語はチョット...

Slide 17

Slide 17 text

Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... ● 冗長、ボイラープレートの嵐 ● nullポインタのデリファレンス問題 ● 後方互換性の維持 ○ 古い文法が存在する ○ 型安全性に問題あり

Slide 18

Slide 18 text

Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... ● 冗長、ボイラープレートの嵐 ● nullポインタのデリファレンス問題 ● 後方互換性の維持 ○ 古い文法が存在する ○ 型安全性に問題あり いろんなところで動いている。 JVM用コード(Javaコード)がたくさんある。 歴史長い。強い。

Slide 19

Slide 19 text

Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... ● 冗長、ボイラープレートの嵐 ● nullポインタのデリファレンス問題 ● 後方互換性の維持 ○ 古い文法が存在する ○ 型安全性に問題あり 書かなきゃいけないコードが無駄に多い。

Slide 20

Slide 20 text

Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... ● 冗長、ボイラープレートの嵐 ● nullポインタのデリファレンス問題 ● 後方互換性の維持 ○ 古い文法が存在する ○ 型安全性に問題あり めっちゃバグるんですけど。 そもそもの言語仕様がアレなのでは。

Slide 21

Slide 21 text

Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... ● 冗長、ボイラープレートの嵐 ● nullポインタのデリファレンス問題 ● 後方互換性の維持 ○ 古い文法が存在する ○ 型安全性に問題あり 今は使うべきでない文法が存在する。 削除してくれればいいのに...そういうわけにも。

Slide 22

Slide 22 text

Q. なんでKotlin?

Slide 23

Slide 23 text

Q. なんでKotlin? A. いいこといっぱいだから!

Slide 24

Slide 24 text

Q. なんでKotlin? A. いいこといっぱいだから! ● Javaよりも安全、簡潔なコードを書ける ● Javaエンジニアにとって、学習コストが低そう ○ 精神的なハードルもやや低めっぽい ● JetBrainsの後ろ盾がある ● 公式によるAndroidのサポート ○ かなり真剣に取り組んでいる模様 ● JSへのトランスパイル、実験段階だけどLLVM

Slide 25

Slide 25 text

まとめ ● Kotlinは静的型付けオブジェクト指向 JVM言語 ● JetBrainsにより開発されている若い言語 ● JVMは魅力的だがJava言語に課題感がある → JVM言語の台頭 ● KotlinはJavaよりも簡潔・安全なコードを書ける ● 公式によるAndroidサポートがある

Slide 26

Slide 26 text

2. 開発環境の準備

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

いろんな開発環境 ● Try Kotlin ● IntelliJ IDEA + Kotlin Plugin ● CLIコンパイラ ● Eclipse + Kotlin Plugin 今日扱うのは、この2つ

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

IntelliJ IDEA + Kotlin Plugin ● Kotlinやるなら、とりあえずコレ!な環境 ● Kotlin Pluginはプリインストールされているので、 IntelliJを起動したらすぐにKotlinを始められる

Slide 31

Slide 31 text

[課題1] Kotlin Pluginをアップデートしよう 下記手順で、Kotlin Pluginのバージョンを「1.1.1-release-*」へ アップデートする。 1. ↓ 「command + , 」 or 左上「IntelliJ IDEA」から 2. Preferencesを開き、Plugins画面を表示させる 3. Plugin一覧から「Kotlin」を探し、選択する 4. 青い「Update」ボタンをクリックする 5. ダウンロードが終わるのを待つ 6. IntelliJを再起動する 7. 再度Plugins画面を表示し、Kotlin Pluginのバージョンを確 認する

Slide 32

Slide 32 text

まとめ ● ブラウザさえあればすぐにKotlinを体験できる ● IntelliJ IDEAを使っておけば間違いない ● Pluginのアップデートをしましょう

Slide 33

Slide 33 text

3. Hello World

Slide 34

Slide 34 text

[課題2] Kotlinプロジェクトを新規作成する 1. 「Create New Project」 or 「File -> New -> Project…」 2. 「Kotlin」と「Kotlin (JVM)」を選択してNext 3. Project nameを「HelloWorld」 4. Kotlin runtimeで「Create...」クリック 5. 表示されたダイアログで「OK」クリック 6. Finish

Slide 35

Slide 35 text

[課題3] KotlinでHello Worldをしよう 1. 「src」を選択してコンテキストメニューを開く 2. New -> Kotlin File/Class 3. Nameに「main」と入力し「OK」クリック 4. 下記コードを入力する 5. Run -> Run… -> sample.MainKt でコンパイル&実行 package sample fun main(args: Array) { println("Hello world!") }

Slide 36

Slide 36 text

おめでとう! これであなたも Kotlinプログラマ!

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

まとめ ● IntelliJでKotlin用プロジェクトを作ることができる ● コードの編集から実行までは、基本的にJavaと同じ操作 ● パッケージがファイルシステムと無関係 ● トップレベルに関数を置くことができる ● 変数の型は後置 ● 文末にセミコロンは不要

Slide 47

Slide 47 text

4. 基本的な文法

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 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 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

when式 val word = "one" val num = when(word) { "zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1

Slide 67

Slide 67 text

when式 val word = "one" val num = when(word) { "zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1 Javaで言うswitch文の強いやつ

Slide 68

Slide 68 text

when式 val word = "one" val num = when(word) { "zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1

Slide 69

Slide 69 text

when式 val word = "one" val num = when(word) { "zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1

Slide 70

Slide 70 text

if-elseたくさん問題 fun result(score: Int): String { return if (80 <= score && score <= 100) "すごい" else if (60 <= score && score < 80) "合格" else if (0 <= score && score < 60) "失格" else "何かがおかしい" }

Slide 71

Slide 71 text

when式でスッキリ fun result(score: Int): String { return when { 80 <= score && score <= 100 -> "すごい" 60 <= score && score < 80 -> "合格" 0 <= score && score < 60 -> "失格" else -> "何かがおかしい" } }

Slide 72

Slide 72 text

[課題4] FizzBuzz 次のようなプログラムを作成する。 ● 1から100までをプリントする。ただし: ○ 3で割り切れる数は、その数字の代わりに「Fizz」をプリントする ○ 5で割り切れる数は、その数字の代わりに「Buzz」をプリントする ○ 3と5それぞれで割り切れる数は、その数字の代わりに 「FizzBuzz」をプリントする

Slide 73

Slide 73 text

まとめ ● 整数リテラル、文字列リテラルはJavaに似ている ● 演算子などもJavaに似ている ● val, varで変数を定義できる ● 変数の型は省略できる=型推論 ● if-elseで条件分岐。if-elseは式である ● forループは、Javaの拡張for文に似ている ● listOf関数により、リストをつくることができる ● when式は、強力なswitch文的なやつ

Slide 74

Slide 74 text

5. 関数に挑戦

Slide 75

Slide 75 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 }

Slide 76

Slide 76 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 } これが関数

Slide 77

Slide 77 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 } 関数を定義するためのキーワード

Slide 78

Slide 78 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 } 関数の名前

Slide 79

Slide 79 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 } 引数リスト

Slide 80

Slide 80 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 } 戻り値の型

Slide 81

Slide 81 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 }

Slide 82

Slide 82 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 }

Slide 83

Slide 83 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 }

Slide 84

Slide 84 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 }

Slide 85

Slide 85 text

関数入門 fun add(a: Int, b: Int): Int { return a + b } fun main(args: Array) { val sum = add(3, 7) println(sum) //=> 10 }

Slide 86

Slide 86 text

[課題5] いろんな関数を作って遊ぼう 下記の様な関数を作る。 ● 引数として与えられた整数を2乗した数を返す関数square ● 引数として与えられた2つの整数のうち、大きい方を返す 関数max ● 引数として与えられた整数が偶数の場合にtrueを、それ 以外の場合にfalseを返す関数isEven ● 引数として与えられた整数の階乗を返す関数factorial ○ 例)4の階乗 = 4 * 3 * 2 * 1

Slide 87

Slide 87 text

5. クラスとオブジェクト

Slide 88

Slide 88 text

クラスの定義 class Person(val name: String) val taro: Person = Person("Taro") println(taro.name) //=> Taro

Slide 89

Slide 89 text

クラスの定義 class Person(val name: String) val taro: Person = Person("Taro") println(taro.name) //=> Taro クラスの定義 インスタンス生成=コンストラクタ呼び出し

Slide 90

Slide 90 text

クラスの定義 class Person(val name: String) val taro: Person = Person("Taro") println(taro.name) //=> Taro プライマリコンストラクタとその引数リスト

Slide 91

Slide 91 text

クラスの定義 class Person(val name: String) val taro: Person = Person("Taro") println(taro.name) //=> Taro プロパティ

Slide 92

Slide 92 text

メソッドの定義 class Person(val name: String) { fun introduceMyself() { println("I am ${name}") } } val taro: Person = Person("Taro") taro.introduceMyself() //=> I am Taro

Slide 93

Slide 93 text

メソッドの定義 class Person(val name: String) { fun introduceMyself() { println("I am ${name}") } } val taro: Person = Person("Taro") taro.introduceMyself() //=> I am Taro 関数みたいなもん

Slide 94

Slide 94 text

[課題6] クラスを定義しよう ● クラス名 IntPair ● 2つのプロパティを持つ ○ first: Int ○ second: Int ● 3つのメソッドを持つ ○ sum: firstとsecondの和を返す ○ max: fisrtとsecondのうち大きい方を返す ○ swap: firstとsecondが逆になったIntPairオブジェクトを返す

Slide 95

Slide 95 text

拡張関数 fun String.hello() { println("Hello, ${this}!") } val name = "world" name.hello() //=> Hello, world!

Slide 96

Slide 96 text

拡張関数 fun String.hello() { println("Hello, ${this}!") } val name = "world" name.hello() //=> Hello, world! 普通の関数っぽい

Slide 97

Slide 97 text

拡張関数 fun String.hello() { println("Hello, ${this}!") } val name = "world" name.hello() //=> Hello, world! 「クラス名.」がミソ

Slide 98

Slide 98 text

拡張関数 fun String.hello() { println("Hello, ${this}!") } val name = "world" name.hello() //=> Hello, world! メソッドのようにthisが使える this: 自分自身への参照

Slide 99

Slide 99 text

拡張関数 fun String.hello() { println("Hello, ${this}!") } val name = "world" name.hello() //=> Hello, world! メソッドのように呼び出せる

Slide 100

Slide 100 text

[課題7] 拡張関数を作ろう ● 拡張関数 meet ○ Intに対する拡張関数 ○ Int型の引数を1つ取る ○ 自身がfirstに、引数がsecondになるIntPairオブジェクトを返す val got = 2.meet(3) println(got.first) //=> 2 println(got.second) //=> 3

Slide 101

Slide 101 text

まとめ ● クラスやオブジェクト、インスタンスの考え方はJavaとほぼ同じ ● クラスはプライマリコンストラクタを持つ ● クラスはメソッドを持つことができる ● クラスはプロパティを持つことができる ● プライマリコンストラクタの引数を、そのままプロパティとして宣 言することができる ● インスタンス生成の際にnewのようなキーワードは不要 ● 既存のクラスにメソッドを追加するような「拡張関数」というもの を定義できる

Slide 102

Slide 102 text

次のステップ ● Kotlin Koans(Kotlin練習用プロジェクト) ○ Edu Kotlin, Edu IntelliJ, Education plugin coreを入れる ○ もしくはtry.kotl.in ● Kotlinを始めようハンズオン(Androidが題材) ○ https://goo.gl/e4A26l