Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin初心者向けハンズオン #teratail_kt

Kotlin初心者向けハンズオン #teratail_kt

このイベントで発表したスライドです。
https://kotlin.connpass.com/event/47047/

14c9795d267f5b85abb98ca5e8780646?s=128

Taro Nagasawa

April 15, 2017
Tweet

Transcript

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

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

    5. 関数に挑戦
  3. • 長澤 太郎 たろーって呼んでね • @ngsw_taro 自己紹介

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

  5. 自称Kotlinエバンジェリスト • Kotlin歴 5年 • 日本Kotlinユーザグループ代表 • teratailエキスパートユーザ • 講演実績多数

    ◦ DroidKaigi 2015, 2016, 2017 ◦ JJUG CCC 2015 Fall ◦ 福岡、京都など遠征も • 執筆実績多数 ◦ 単行本、商業誌、同人誌
  6. 1. Kotlinって何?

  7. Q. Kotlinって何?

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

  9. Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:

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

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

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

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

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

    JetBrains • 2016年2月に正式リリース • Apache License ver2.0 オープンソースです。 ソースコードを自由に入手・改造できる!
  15. Q. JVM言語?

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

  17. Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持

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

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

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

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

    ◦ 古い文法が存在する ◦ 型安全性に問題あり 今は使うべきでない文法が存在する。 削除してくれればいいのに...そういうわけにも。
  22. Q. なんでKotlin?

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

  24. Q. なんでKotlin? A. いいこといっぱいだから! • Javaよりも安全、簡潔なコードを書ける • Javaエンジニアにとって、学習コストが低そう ◦ 精神的なハードルもやや低めっぽい

    • JetBrainsの後ろ盾がある • 公式によるAndroidのサポート ◦ かなり真剣に取り組んでいる模様 • JSへのトランスパイル、実験段階だけどLLVM
  25. まとめ • Kotlinは静的型付けオブジェクト指向 JVM言語 • JetBrainsにより開発されている若い言語 • JVMは魅力的だがJava言語に課題感がある → JVM言語の台頭

    • KotlinはJavaよりも簡潔・安全なコードを書ける • 公式によるAndroidサポートがある
  26. 2. 開発環境の準備

  27. いろんな開発環境 • Try Kotlin • IntelliJ IDEA + Kotlin Plugin

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

    • CLIコンパイラ • Eclipse + Kotlin Plugin 今日扱うのは、この2つ
  29. Try Kotlin • http://try.kotl.in • ブラウザ上で試せる開発環境

  30. IntelliJ IDEA + Kotlin Plugin • Kotlinやるなら、とりあえずコレ!な環境 • Kotlin Pluginはプリインストールされているので、

    IntelliJを起動したらすぐにKotlinを始められる
  31. [課題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のバージョンを確 認する
  32. まとめ • ブラウザさえあればすぐにKotlinを体験できる • IntelliJ IDEAを使っておけば間違いない • Pluginのアップデートをしましょう

  33. 3. Hello World

  34. [課題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
  35. [課題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<String>) { println("Hello world!") }
  36. おめでとう! これであなたも Kotlinプログラマ!

  37. Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")

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

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

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

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

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

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

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

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

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

    変数の型は後置 • 文末にセミコロンは不要
  47. 4. 基本的な文法

  48. いろんなオブジェクトをprintしてみよう! fun main(args: Array<String>) { println(123) // 整数 println(123.4) //

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

    浮動小数点数 println(true) // 真偽値 println('A') // 文字 println("Hello") // 文字列 } オブジェクトの表現を直接ソースコードに 記述したものを「リテラル」と呼ぶ
  50. オブジェクトを操作しよう! fun main(args: Array<String>) { 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 }
  51. オブジェクトを操作しよう! 演算子やメソッドを呼び出したり、 だいたいJavaと同じ感じ! fun main(args: Array<String>) { 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 }
  52. オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"

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

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

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

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

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

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

    userAge = 28 println("${userName}さんは${userAge}歳です") } 型を省略することができる=型推論
  59. 条件分岐 val score = 65 if (score >= 60) {

    println("合格") } else { println("失格") } Javaや他の言語と同じ感じ
  60. ifは式(値を返すよ) val score = 65 val message = if (score

    >= 60) { "合格だよ〜ん" } else { "残念、失格" } println(message) //=> 合格だよ〜ん
  61. forループ val names = listOf("foo", "bar", "baz") for(name in names)

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

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

    { println(name) } Javaで言う拡張for文のイメージ
  64. 代入 val nums = listOf(1, 4, 2) var sum =

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

    0 for(n in nums) { sum = sum + n } println(sum) //=> 7 varにより代入可能となる sumの指す値は、場所や時間によって変化し得る
  66. when式 val word = "one" val num = when(word) {

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

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

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

    "zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1
  70. 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 "何かがおかしい" }
  71. when式でスッキリ fun result(score: Int): String { return when { 80

    <= score && score <= 100 -> "すごい" 60 <= score && score < 80 -> "合格" 0 <= score && score < 60 -> "失格" else -> "何かがおかしい" } }
  72. [課題4] FizzBuzz 次のようなプログラムを作成する。 • 1から100までをプリントする。ただし: ◦ 3で割り切れる数は、その数字の代わりに「Fizz」をプリントする ◦ 5で割り切れる数は、その数字の代わりに「Buzz」をプリントする ◦

    3と5それぞれで割り切れる数は、その数字の代わりに 「FizzBuzz」をプリントする
  73. まとめ • 整数リテラル、文字列リテラルはJavaに似ている • 演算子などもJavaに似ている • val, varで変数を定義できる • 変数の型は省略できる=型推論

    • if-elseで条件分岐。if-elseは式である • forループは、Javaの拡張for文に似ている • listOf関数により、リストをつくることができる • when式は、強力なswitch文的なやつ
  74. 5. 関数に挑戦

  75. 関数入門 fun add(a: Int, b: Int): Int { return a

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

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

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

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

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

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

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

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

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

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

    + b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
  86. [課題5] いろんな関数を作って遊ぼう 下記の様な関数を作る。 • 引数として与えられた整数を2乗した数を返す関数square • 引数として与えられた2つの整数のうち、大きい方を返す 関数max • 引数として与えられた整数が偶数の場合にtrueを、それ

    以外の場合にfalseを返す関数isEven • 引数として与えられた整数の階乗を返す関数factorial ◦ 例)4の階乗 = 4 * 3 * 2 * 1
  87. 5. クラスとオブジェクト

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

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

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

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

    println(taro.name) //=> Taro プロパティ
  92. メソッドの定義 class Person(val name: String) { fun introduceMyself() { println("I

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

    am ${name}") } } val taro: Person = Person("Taro") taro.introduceMyself() //=> I am Taro 関数みたいなもん
  94. [課題6] クラスを定義しよう • クラス名 IntPair • 2つのプロパティを持つ ◦ first: Int

    ◦ second: Int • 3つのメソッドを持つ ◦ sum: firstとsecondの和を返す ◦ max: fisrtとsecondのうち大きい方を返す ◦ swap: firstとsecondが逆になったIntPairオブジェクトを返す
  95. 拡張関数 fun String.hello() { println("Hello, ${this}!") } val name =

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

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

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

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

    "world" name.hello() //=> Hello, world! メソッドのように呼び出せる
  100. [課題7] 拡張関数を作ろう • 拡張関数 meet ◦ Intに対する拡張関数 ◦ Int型の引数を1つ取る ◦

    自身がfirstに、引数がsecondになるIntPairオブジェクトを返す val got = 2.meet(3) println(got.first) //=> 2 println(got.second) //=> 3
  101. まとめ • クラスやオブジェクト、インスタンスの考え方はJavaとほぼ同じ • クラスはプライマリコンストラクタを持つ • クラスはメソッドを持つことができる • クラスはプロパティを持つことができる •

    プライマリコンストラクタの引数を、そのままプロパティとして宣 言することができる • インスタンス生成の際にnewのようなキーワードは不要 • 既存のクラスにメソッドを追加するような「拡張関数」というもの を定義できる
  102. 次のステップ • Kotlin Koans(Kotlin練習用プロジェクト) ◦ Edu Kotlin, Edu IntelliJ, Education

    plugin coreを入れる ◦ もしくはtry.kotl.in • Kotlinを始めようハンズオン(Androidが題材) ◦ https://goo.gl/e4A26l