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
2.1k
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
760
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.3k
#Ubie 狂気の認知施策と選考設計
ntaro
13
13k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.1k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.5k
Kotlinでサーバサイドを始めよう!
ntaro
1
1k
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.8k
Kotlin Contracts #m3kt
ntaro
4
4.2k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
510
Other Decks in Programming
See All in Programming
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
200
rage against annotate_predecessor
junk0612
0
160
為你自己學 Python - 冷知識篇
eddie
1
350
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
280
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
100
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
260
Testing Trophyは叫ばない
toms74209200
0
850
Tool Catalog Agent for Bedrock AgentCore Gateway
licux
6
2.3k
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
130
アセットのコンパイルについて
ojun9
0
120
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
140
RDoc meets YARD
okuramasafumi
4
170
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
40
2k
Navigating Team Friction
lara
189
15k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
Designing for Performance
lara
610
69k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Embracing the Ebb and Flow
colly
87
4.8k
Building an army of robots
kneath
306
46k
Speed Design
sergeychernyshev
32
1.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
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