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

はじめのKotlin

 はじめのKotlin

ABC 2017 Autumn(Android Bazaar and Conference 2017 in KAWASAKI)(http://abc.android-group.jp/2017a/ )で発表したスライドです。

14c9795d267f5b85abb98ca5e8780646?s=128

Taro Nagasawa

October 16, 2017
Tweet

Transcript

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

  2. 自己紹介 • 長澤 太郎(たろーって呼んでね) • @ngsw_taro • エムスリー株式会社 • ディズニーが大好き!

    エムスリーは 国内最大規模の 医療情報プラット フォームを開発・ 運営しています。 エンジニア募 集中!
  3. 祝☆新刊 10/6発売

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

    5. Androidで活用する
  5. 1. Kotlin概要と誕生の背景

  6. Javaっていいよね • 進化を続けるプログラミング言語 ◦ しかも後方互換性を維持 • 歴史長い、人口多い ◦ ライブラリ・フレームワークが多い ◦

    知見が多い • 高性能・高信頼性のJava仮想マシン
  7. しかしその反面、問題も... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持 ◦ 古い文法が存在する ◦

    型安全性に問題あり
  8. Kotlin誕生!

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

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

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

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

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

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

    • Apache License ver2.0 オープンソースです。 ソースコードを自由に入手・改造できる!
  15. Kotlinの特徴 簡単 文法、コードの見た目がわかりや すい。学習コストが低そう 安全 型安全、Null安全 Android Googleのお墨付き Interop KotlinからJavaコードを、Javaから

    Kotlinコードを相互に呼び出せる
  16. 2. HelloWorld

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

    Eclipse • Visual Studio Code
  18. Try Kotlin • http://try.kotl.in • ブラウザ上で試せる開発環境

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

    }
  20. package sample fun main(args: Array<String>) { println("Hello, world!") } Hello

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

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

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

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

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

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

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

    Worldに見るKotlinの特徴 セミコロン不要
  28. 3. 基本的な文法

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

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

    println(123.4) // 浮動小数点数 println(true) // 真偽値 println('A') // 文字 println("Hello") // 文字列 }
  31. オブジェクトを操作しよう! 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 }
  32. 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 } オブジェクトを操作しよう! 演算子やメソッドを呼び出したり、 だいたいJavaと同じ感じ!
  33. オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"

    val userAge: Int = 28 println("${userName}さんは${userAge}歳です") }
  34. fun main(args: Array<String>) { val userName: String = "たろう" val

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

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

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

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

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

    = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前をつけよう! 型を省略することができる=型推論
  40. 条件分岐 val score = 65 if (score >= 60) {

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

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

    { println(name) }
  43. val names = listOf("foo", "bar", "baz") for(name in names) {

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

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

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

    for(n in nums) { sum = sum + n } println(sum) //=> 7 代入 varにより代入可能となる sumの指す値は、場所や時間によって変化し得る
  47. 4. Kotlinの特徴的な機能

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

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

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

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

    文字列テンプレート
  52. Null安全 • nullの可能性のあるものと、そうでないものを厳格に 区別することでケアレスミスを防ぐ • nullの可能性のない型(NotNull) • nullの可能性のある型(Nullable) ?をつけて表現 val

    a: Int = null // コンパイルエラー val b: Int? = null // OK b.toString() // コンパイルエラー
  53. Nullableの扱いは、とことん慎重に val s: String? = getString() s.length // コンパイルエラー これを許してしまうと

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

  55. 安全呼び出し s?.length if (s != null) s.length else null 同じ

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

    if-elseは式 (評価されて値になる) foo?.bar()?.baz()?.qux() メソッドチェーンで役立つ
  57. 5. Androidで活用する

  58. 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. ビルド&実行
  59. デモ

  60. 簡単に解説 class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {

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

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

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

    setContentView(R.layout.activity_main) } } 簡単に解説 BundleのNullable型(null許容型)
  64. まとめ • Kotlin概要 ◦ 静的型付けオブジェクト指向JVM言語 ◦ JetBrains, Googleにより開発・サポート • HelloWorld

    • 基本的な文法 ◦ if-else式、for文、型推論、文字列テンプレートなど • 特徴的な機能 ◦ 拡張関数: 既存の型にメソッドを追加してるっぽく ◦ Null安全: nullの扱いを慎重に安全に