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

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

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

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

Taro Nagasawa

April 15, 2017
Tweet

More Decks by Taro Nagasawa

Other Decks in Programming

Transcript

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

    ◦ DroidKaigi 2015, 2016, 2017 ◦ JJUG CCC 2015 Fall ◦ 福岡、京都など遠征も • 執筆実績多数 ◦ 単行本、商業誌、同人誌
  2. Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:

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

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

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

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

    JetBrains • 2016年2月に正式リリース • Apache License ver2.0 オープンソースです。 ソースコードを自由に入手・改造できる!
  7. Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持

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

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

    ◦ 古い文法が存在する ◦ 型安全性に問題あり 今は使うべきでない文法が存在する。 削除してくれればいいのに...そういうわけにも。
  10. Q. なんでKotlin? A. いいこといっぱいだから! • Javaよりも安全、簡潔なコードを書ける • Javaエンジニアにとって、学習コストが低そう ◦ 精神的なハードルもやや低めっぽい

    • JetBrainsの後ろ盾がある • 公式によるAndroidのサポート ◦ かなり真剣に取り組んでいる模様 • JSへのトランスパイル、実験段階だけどLLVM
  11. いろんな開発環境 • Try Kotlin • IntelliJ IDEA + Kotlin Plugin

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

    • CLIコンパイラ • Eclipse + Kotlin Plugin 今日扱うのは、この2つ
  13. [課題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のバージョンを確 認する
  14. [課題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
  15. [課題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!") }
  16. Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")

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

    } トップレベル(パッケージ直下) に関数を置ける
  18. いろんなオブジェクトをprintしてみよう! fun main(args: Array<String>) { println(123) // 整数 println(123.4) //

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    <= score && score <= 100 -> "すごい" 60 <= score && score < 80 -> "合格" 0 <= score && score < 60 -> "失格" else -> "何かがおかしい" } }
  41. まとめ • 整数リテラル、文字列リテラルはJavaに似ている • 演算子などもJavaに似ている • val, varで変数を定義できる • 変数の型は省略できる=型推論

    • if-elseで条件分岐。if-elseは式である • forループは、Javaの拡張for文に似ている • listOf関数により、リストをつくることができる • when式は、強力なswitch文的なやつ
  42. 関数入門 fun add(a: Int, b: Int): Int { return a

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

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

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

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

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

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

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

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

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

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

    + b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
  53. クラスの定義 class Person(val name: String) val taro: Person = Person("Taro")

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

    println(taro.name) //=> Taro プライマリコンストラクタとその引数リスト
  55. メソッドの定義 class Person(val name: String) { fun introduceMyself() { println("I

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

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

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

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

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

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

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

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

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

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