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
260
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.1k
#Ubie 狂気の認知施策と選考設計
ntaro
13
12k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.3k
Kotlinでサーバサイドを始めよう!
ntaro
1
900
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.5k
Kotlin Contracts #m3kt
ntaro
4
3.7k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
420
Other Decks in Programming
See All in Programming
労務ドメインを快適に開発する方法 / How to Comfortably Develop in the Labor Domain
yuki21
1
250
オートマトン学習しろ / Do automata learning
makenowjust
3
120
令和トラベルにおけるLLM活用事例:社内ツール開発から得た学びと実践
ippo012
0
120
Rechartsで楽にゴリゴリにカスタマイズする!
10tera
1
160
メモリ最適化を究める!iOSアプリ開発における5つの重要なポイント
yhirakawa333
0
410
Kotlin 2.0が与えるAndroid開発の進化
masayukisuda
1
280
Scala アプリケーションのビルドを改善してデプロイ時間を 1/4 にした話 | How I improved the build of my Scala application and reduced deployment time by 4x
nomadblacky
1
160
『ドメイン駆動設計をはじめよう』中核の業務領域
masuda220
PRO
5
960
Hono・Prisma・AWSでGeoなAPI開発
nokonoko1203
5
670
GraphQLの魅力を引き出すAndroidクライアント実装
morux2
3
320
事業フェーズの変化に対応する 開発生産性向上のゼロイチ
masaygggg
0
180
Amazon Neptuneで始める初めてのグラフDB ー グラフDBを使う意味を考える ー
satoshi256kbyte
2
250
Featured
See All Featured
Side Projects
sachag
451
42k
Practical Orchestrator
shlominoach
185
10k
Building a Modern Day E-commerce SEO Strategy
aleyda
36
6.8k
Optimizing for Happiness
mojombo
375
69k
Designing with Data
zakiwarfel
98
5k
How To Stay Up To Date on Web Technology
chriscoyier
786
250k
Designing Experiences People Love
moore
138
23k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.2k
No one is an island. Learnings from fostering a developers community.
thoeni
18
2.9k
Git: the NoSQL Database
bkeepers
PRO
425
64k
Rebuilding a faster, lazier Slack
samanthasiow
78
8.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
36
2k
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