Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin初心者向けハンズオン #teratail_kt
Search
Taro Nagasawa
April 15, 2017
Programming
5
1.9k
Kotlin初心者向けハンズオン #teratail_kt
このイベントで発表したスライドです。
https://kotlin.connpass.com/event/47047/
Taro Nagasawa
April 15, 2017
Tweet
Share
More Decks by Taro Nagasawa
See All by Taro Nagasawa
Android開発者のための Kotlin Multiplatform入門
ntaro
0
370
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.1k
#Ubie 狂気の認知施策と選考設計
ntaro
13
12k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.1k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.3k
Kotlinでサーバサイドを始めよう!
ntaro
1
920
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.6k
Kotlin Contracts #m3kt
ntaro
4
3.8k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
430
Other Decks in Programming
See All in Programming
距離関数を極める! / SESSIONS 2024
gam0022
0
290
NSOutlineView何もわからん:( 前編 / I Don't Understand About NSOutlineView :( Pt. 1
usagimaru
0
340
EMになってからチームの成果を最大化するために取り組んだこと/ Maximize team performance as EM
nashiusagi
0
100
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2k
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
as(型アサーション)を書く前にできること
marokanatani
10
2.7k
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
230
Click-free releases & the making of a CLI app
oheyadam
2
120
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
5
1.5k
CSC509 Lecture 12
javiergs
PRO
0
160
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.4k
Enabling DevOps and Team Topologies Through Architecture: Architecting for Fast Flow
cer
PRO
0
340
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
110
Scaling GitHub
holman
458
140k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
4 Signs Your Business is Dying
shpigford
180
21k
Docker and Python
trallard
40
3.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Transcript
Kotlin 初心者向けハンズオン 2017-04-15 @ngsw_taro
もくじ 1. Kotlinって何? 2. 開発環境の準備 3. Hello World 4. 基本的な文法
5. 関数に挑戦
• 長澤 太郎 たろーって呼んでね • @ngsw_taro 自己紹介
エムスリー株式会社 jobs.m3.com/engineer Wantedly記事 goo.gl/BxK5ZZ
自称Kotlinエバンジェリスト • Kotlin歴 5年 • 日本Kotlinユーザグループ代表 • teratailエキスパートユーザ • 講演実績多数
◦ DroidKaigi 2015, 2016, 2017 ◦ JJUG CCC 2015 Fall ◦ 福岡、京都など遠征も • 執筆実績多数 ◦ 単行本、商業誌、同人誌
1. Kotlinって何?
Q. Kotlinって何?
Q. Kotlinって何? A. プログラミング言語のひとつ
Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:
JetBrains • 2016年2月に正式リリース • Apache License ver2.0
Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:
JetBrains • 2016年2月に正式リリース • Apache License ver2.0 静的型付け: プログラムの実行前(コンパイル時)に型が決まる オブジェクト指向: Javaと同じく対象物(オブジェクト)に着目してプログラ ムを組み上げる
Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:
JetBrains • 2016年2月に正式リリース • Apache License ver2.0 Java仮想マシン(JVM)の上で動作する「Javaバイトコード」 にコンパイルされるようなプログラミング言語
Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:
JetBrains • 2016年2月に正式リリース • Apache License ver2.0 統合開発環境 IntelliJ IDEAの開発元の会社。 大きな後ろ盾があることを意味する。
Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:
JetBrains • 2016年2月に正式リリース • Apache License ver2.0 新しい言語です!現在 ver1.1.1
Q. Kotlinって何? A. プログラミング言語のひとつ • 静的型付けオブジェクト指向言語 • いわゆる「JVM言語」 • 開発元:
JetBrains • 2016年2月に正式リリース • Apache License ver2.0 オープンソースです。 ソースコードを自由に入手・改造できる!
Q. JVM言語?
Q. JVM言語? A. JVMサイコーだけどJava言語はチョット...
Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持
◦ 古い文法が存在する ◦ 型安全性に問題あり
Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持
◦ 古い文法が存在する ◦ 型安全性に問題あり いろんなところで動いている。 JVM用コード(Javaコード)がたくさんある。 歴史長い。強い。
Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持
◦ 古い文法が存在する ◦ 型安全性に問題あり 書かなきゃいけないコードが無駄に多い。
Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持
◦ 古い文法が存在する ◦ 型安全性に問題あり めっちゃバグるんですけど。 そもそもの言語仕様がアレなのでは。
Q. JVM言語? A. JVMサイコーだけどJava言語はチョット... • 冗長、ボイラープレートの嵐 • nullポインタのデリファレンス問題 • 後方互換性の維持
◦ 古い文法が存在する ◦ 型安全性に問題あり 今は使うべきでない文法が存在する。 削除してくれればいいのに...そういうわけにも。
Q. なんでKotlin?
Q. なんでKotlin? A. いいこといっぱいだから!
Q. なんでKotlin? A. いいこといっぱいだから! • Javaよりも安全、簡潔なコードを書ける • Javaエンジニアにとって、学習コストが低そう ◦ 精神的なハードルもやや低めっぽい
• JetBrainsの後ろ盾がある • 公式によるAndroidのサポート ◦ かなり真剣に取り組んでいる模様 • JSへのトランスパイル、実験段階だけどLLVM
まとめ • Kotlinは静的型付けオブジェクト指向 JVM言語 • JetBrainsにより開発されている若い言語 • JVMは魅力的だがJava言語に課題感がある → JVM言語の台頭
• KotlinはJavaよりも簡潔・安全なコードを書ける • 公式によるAndroidサポートがある
2. 開発環境の準備
いろんな開発環境 • Try Kotlin • IntelliJ IDEA + Kotlin Plugin
• CLIコンパイラ • Eclipse + Kotlin Plugin
いろんな開発環境 • Try Kotlin • IntelliJ IDEA + Kotlin Plugin
• CLIコンパイラ • Eclipse + Kotlin Plugin 今日扱うのは、この2つ
Try Kotlin • http://try.kotl.in • ブラウザ上で試せる開発環境
IntelliJ IDEA + Kotlin Plugin • Kotlinやるなら、とりあえずコレ!な環境 • Kotlin Pluginはプリインストールされているので、
IntelliJを起動したらすぐにKotlinを始められる
[課題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のバージョンを確 認する
まとめ • ブラウザさえあればすぐにKotlinを体験できる • IntelliJ IDEAを使っておけば間違いない • Pluginのアップデートをしましょう
3. Hello World
[課題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
[課題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!") }
おめでとう! これであなたも Kotlinプログラマ!
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
}
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} パッケージがファイルシステムと無関係 : srcディレクトリ直下に置いたにも関わらず、パッ ケージを切れる。
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} funキーワードで関数を定義
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} トップレベル(パッケージ直下) に関数を置ける
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} main関数がKotlinプログラムの エントリポイント
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} 変数(引数)の型は後置
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} 配列はクラスで表現。 特別な文法はない
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} Kotlin標準ライブラリの 関数呼び出し
Hello Worldに見るKotlinの特徴 package sample fun main(args: Array<String>) { println("Hello world!")
} セミコロン不要
まとめ • IntelliJでKotlin用プロジェクトを作ることができる • コードの編集から実行までは、基本的にJavaと同じ操作 • パッケージがファイルシステムと無関係 • トップレベルに関数を置くことができる •
変数の型は後置 • 文末にセミコロンは不要
4. 基本的な文法
いろんなオブジェクトをprintしてみよう! fun main(args: Array<String>) { println(123) // 整数 println(123.4) //
浮動小数点数 println(true) // 真偽値 println('A') // 文字 println("Hello") // 文字列 }
いろんなオブジェクトをprintしてみよう! fun main(args: Array<String>) { println(123) // 整数 println(123.4) //
浮動小数点数 println(true) // 真偽値 println('A') // 文字 println("Hello") // 文字列 } オブジェクトの表現を直接ソースコードに 記述したものを「リテラル」と呼ぶ
オブジェクトを操作しよう! 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と同じ感じ! 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 }
オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"
val userAge: Int = 28 println("${userName}さんは${userAge}歳です") }
オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"
val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } オブジェクトに名前を付けることで、 以降この名前でオブジェクトを参照できる
オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"
val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } このキーワードがミソ
オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"
val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } 名前(変数)
オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"
val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } 変数の型
オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName: String = "たろう"
val userAge: Int = 28 println("${userName}さんは${userAge}歳です") } 「Stringテンプレート」と呼ばれる機能により ${...}内が評価された結果が、文字列リテラルに埋め込まれる
オブジェクトに名前をつけよう! fun main(args: Array<String>) { val userName = "たろう" val
userAge = 28 println("${userName}さんは${userAge}歳です") } 型を省略することができる=型推論
条件分岐 val score = 65 if (score >= 60) {
println("合格") } else { println("失格") } Javaや他の言語と同じ感じ
ifは式(値を返すよ) val score = 65 val message = if (score
>= 60) { "合格だよ〜ん" } else { "残念、失格" } println(message) //=> 合格だよ〜ん
forループ val names = listOf("foo", "bar", "baz") for(name in names)
{ println(name) }
forループ val names = listOf("foo", "bar", "baz") for(name in names)
{ println(name) } リストを作る関数listOf
forループ val names = listOf("foo", "bar", "baz") for(name in names)
{ println(name) } Javaで言う拡張for文のイメージ
代入 val nums = listOf(1, 4, 2) var sum =
0 for(n in nums) { sum = sum + n } println(sum) //=> 7
代入 val nums = listOf(1, 4, 2) var sum =
0 for(n in nums) { sum = sum + n } println(sum) //=> 7 varにより代入可能となる sumの指す値は、場所や時間によって変化し得る
when式 val word = "one" val num = when(word) {
"zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1
when式 val word = "one" val num = when(word) {
"zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1 Javaで言うswitch文の強いやつ
when式 val word = "one" val num = when(word) {
"zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1
when式 val word = "one" val num = when(word) {
"zero" -> 0 "one" -> 1 "two" -> 2 else -> -1 } println(num) //=> 1
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 "何かがおかしい" }
when式でスッキリ fun result(score: Int): String { return when { 80
<= score && score <= 100 -> "すごい" 60 <= score && score < 80 -> "合格" 0 <= score && score < 60 -> "失格" else -> "何かがおかしい" } }
[課題4] FizzBuzz 次のようなプログラムを作成する。 • 1から100までをプリントする。ただし: ◦ 3で割り切れる数は、その数字の代わりに「Fizz」をプリントする ◦ 5で割り切れる数は、その数字の代わりに「Buzz」をプリントする ◦
3と5それぞれで割り切れる数は、その数字の代わりに 「FizzBuzz」をプリントする
まとめ • 整数リテラル、文字列リテラルはJavaに似ている • 演算子などもJavaに似ている • val, varで変数を定義できる • 変数の型は省略できる=型推論
• if-elseで条件分岐。if-elseは式である • forループは、Javaの拡張for文に似ている • listOf関数により、リストをつくることができる • when式は、強力なswitch文的なやつ
5. 関数に挑戦
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 } これが関数
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 } 関数を定義するためのキーワード
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 } 関数の名前
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 } 引数リスト
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 } 戻り値の型
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
関数入門 fun add(a: Int, b: Int): Int { return a
+ b } fun main(args: Array<String>) { val sum = add(3, 7) println(sum) //=> 10 }
[課題5] いろんな関数を作って遊ぼう 下記の様な関数を作る。 • 引数として与えられた整数を2乗した数を返す関数square • 引数として与えられた2つの整数のうち、大きい方を返す 関数max • 引数として与えられた整数が偶数の場合にtrueを、それ
以外の場合にfalseを返す関数isEven • 引数として与えられた整数の階乗を返す関数factorial ◦ 例)4の階乗 = 4 * 3 * 2 * 1
5. クラスとオブジェクト
クラスの定義 class Person(val name: String) val taro: Person = Person("Taro")
println(taro.name) //=> Taro
クラスの定義 class Person(val name: String) val taro: Person = Person("Taro")
println(taro.name) //=> Taro クラスの定義 インスタンス生成=コンストラクタ呼び出し
クラスの定義 class Person(val name: String) val taro: Person = Person("Taro")
println(taro.name) //=> Taro プライマリコンストラクタとその引数リスト
クラスの定義 class Person(val name: String) val taro: Person = Person("Taro")
println(taro.name) //=> Taro プロパティ
メソッドの定義 class Person(val name: String) { fun introduceMyself() { println("I
am ${name}") } } val taro: Person = Person("Taro") taro.introduceMyself() //=> I am Taro
メソッドの定義 class Person(val name: String) { fun introduceMyself() { println("I
am ${name}") } } val taro: Person = Person("Taro") taro.introduceMyself() //=> I am Taro 関数みたいなもん
[課題6] クラスを定義しよう • クラス名 IntPair • 2つのプロパティを持つ ◦ first: Int
◦ second: Int • 3つのメソッドを持つ ◦ sum: firstとsecondの和を返す ◦ max: fisrtとsecondのうち大きい方を返す ◦ swap: firstとsecondが逆になったIntPairオブジェクトを返す
拡張関数 fun String.hello() { println("Hello, ${this}!") } val name =
"world" name.hello() //=> Hello, world!
拡張関数 fun String.hello() { println("Hello, ${this}!") } val name =
"world" name.hello() //=> Hello, world! 普通の関数っぽい
拡張関数 fun String.hello() { println("Hello, ${this}!") } val name =
"world" name.hello() //=> Hello, world! 「クラス名.」がミソ
拡張関数 fun String.hello() { println("Hello, ${this}!") } val name =
"world" name.hello() //=> Hello, world! メソッドのようにthisが使える this: 自分自身への参照
拡張関数 fun String.hello() { println("Hello, ${this}!") } val name =
"world" name.hello() //=> Hello, world! メソッドのように呼び出せる
[課題7] 拡張関数を作ろう • 拡張関数 meet ◦ Intに対する拡張関数 ◦ Int型の引数を1つ取る ◦
自身がfirstに、引数がsecondになるIntPairオブジェクトを返す val got = 2.meet(3) println(got.first) //=> 2 println(got.second) //=> 3
まとめ • クラスやオブジェクト、インスタンスの考え方はJavaとほぼ同じ • クラスはプライマリコンストラクタを持つ • クラスはメソッドを持つことができる • クラスはプロパティを持つことができる •
プライマリコンストラクタの引数を、そのままプロパティとして宣 言することができる • インスタンス生成の際にnewのようなキーワードは不要 • 既存のクラスにメソッドを追加するような「拡張関数」というもの を定義できる
次のステップ • Kotlin Koans(Kotlin練習用プロジェクト) ◦ Edu Kotlin, Edu IntelliJ, Education
plugin coreを入れる ◦ もしくはtry.kotl.in • Kotlinを始めようハンズオン(Androidが題材) ◦ https://goo.gl/e4A26l