自己紹介
- 政倉 智 (まさくら とも)
- codeArts 株式会社
- 趣味: バイク・プログラミング
Kotlin とは?
- JetBrains 社が開発した JVM で動作するプログラム言語
- Java の代替となり、相互呼び出しができる
- オープンソース (2012 年~)
- null 安全をはじめとして、既定で安全方向
- 短く書ける
JetBrains 社って?
- チェコ共和国に本社があるデベロッパーツールの開発・販売を手掛ける
- IntelliJ IDEA をはじめとする統合開発環境
- YourTrack, TeamCity などの開発のインフラ製品も
IntelliJ IDEA って?
- 2000 年にリリースされた Java の統合開発環境
- 有償製品だけど、愛好家が多い (OSS 無償の Community Edition あり)
- 強力なリファクタリングとインスペクションが特徴
- 近代的な統合開発環境の元祖みたいなもん (個人の主観です)
- プラグインにより、様々な言語に対応
IntelliJ をベースとした様々な統合開発環境
- Rider - C#
- RubyMine - Ruby
- PHPStorm - PHP
- WebStorm - HTML/CSS/JavaScript
- PyCharm - Python
- ReSharper - C# (Visual Studio 拡張)
Android Studio は IntelliJ IDEA をベースに Google さんがカスタマイズしたもの
新しい言語に乗り換えるということ
言語 | C# | -> | Java |
フレームワーク | ASP.NET | -> | Spring |
IDE | Visual Studio | -> | IntelliJ IDEA |
ビルドツール | MSBuild | -> | Gradle |
パッケージマネージャー | nuget | -> | Maven |
言語だけならまだしも...
あらゆるものを学習しなおし
使い慣れたものが使えないストレス
すべて受け入れるかあきらめるかの二択
Kotolin なら!
言語 | Java | -> | Kotlin |
フレームワーク | Android | -> | Android |
IDE | Android Studio | -> | Android Studio |
ビルドツール | Gradle | -> | Gradle |
パッケージマネージャー | Maven | -> | Maven |
プログラム言語だけを覚えればいい
ストレスフリー!
- 同一プロジェクトに混在でき、相互呼び出し可能
- 新しく書く部分だけ Kotlin
- 複雑な処理は慣れている Java で
- Java/Android の豊富なライブラリをそのまま使える
初めてでも優しい
チェックボックスを入れるだけ!
Java プロジェクトも簡単に変換できる
Java コードを Kotlin コードに変換
Java コードをコピペでも変換
ノリではじめてノリでやめられる!
Kotlin の紹介
始め方 (Android Studio)
始め方 (IntelliJ IDEA)
始め方 (IntelliJ IDEA/Gradle)
Java -> Kotlin
- Java と Kotlin の両方が使えるようになる
- 元のコードは Java のまま
Java ファイル -> Kotlin ファイル
Code
-> Convert Java File to Kotlin File
コピペで変換する
変数
val a: Int = 1;
val a: Int = 1 // 末尾のセミコロンは省略可 (省略が普通)
val a = 1 // 型推論
a = 2 // val で宣言した変数は変更できない
var b = 1
b = 2 // var で宣言すると変更できる
null 安全
var a = 1
a = null // null は代入できない
// Java もプリミティブ型は null にはできない
var a = "abc"
a = null // null は代入できない
// kotlin ではオブジェクト型も null にはできない
var b? = 1 // ? を付けると null を許容するようになる
b = null
var b? = "abc"
b = null
null 安全
var a: Hoge? = null
// ... 処理
a.display() // コンパイルエラー
if (a != null) {
a.display() // Hoge 型として扱えるようになる
}
a?.display() // null のときは関数を実行しない
a!!.display() // null のときは例外
関数
// Kotlin ではメソッドじゃなくて関数らしい
fun hello(a: Int, b: String): String {
return "$a -> $b"
}
// 短く書ける
fun hello(a: Int, b: String): String = "$a -> $b"
// 型推論で戻り値の型を省略
fun hello(a: Int, b: String) = "$a -> $b"
// $ で変数展開できる
// """ """ ってのもある
ファイル
main.kt
// クラスなしでも書ける
package demo
val text = "Hello, world!"
fun main(args: Array<String>) {
println(text)
}
クラス・オブジェクト
class Hoge // 最小のクラス宣言
var hoge = Hoge() // インスタンス化 (new は不要)
class Hoge {
private val mText = "hello"
fun display() = println(mText)
}
// シングルトンオブジェクト
object Fuga {
private val mText = "hello"
// アクセス修飾子なしは public
fun display() = println(mText)
}
コンストラクタ
// 結構いろいろあるのでちゃんとしたドキュメントを!
class Hoge(text: String) {
private val mText: String
init {
mText = text
}
}
class Hoge(text: String) {
private val mText = text
}
class Hoge(private val mText)
// セカンダリコンストラクタ
class Hoge(private val mText) {
constructor() : this("") {
// ここに何か書く
}
}
val a = Hoge("hello") // プライマリ
val b = Hoge() // セカンダリ
継承
class Hoge
class Fuga : Hoge() // 既定で継承不可
// open を付けると継承可
open class Hoge
class Fuga: Hoge()
// 関数も open つけないといけない
class Foo {
fun a() = println("a") // 継承できない
open fun b() = println("b") // 継承できる
}
class Bar : Foo() {
override a() = println("A") // 継承できない
override b() = println("B") // 継承できる
}
コンパニオンオブジェクト
// Kotlin には static class は基本ない
class Hoge {
fun display() {
Log.d(TAG, "hello")
}
companion object {
// static っぽく使える
private const val TAG = "Hoge"
@JvmStatic // アノテーションを付けると Java から呼び出せる (らしい)
fun create() = Hoge()
}
}
プロパティ
class Hoge {
var prop1: String = "hello"
get() {
return field // 暗黙のバッキングフィールド
}
set(value) {
field = value
}
var prop2 = "hello"
get() = field
set(value) {
feild = value
}
var prop3 = "hello"
get set
var prop4 = "hello"
}
読み取り専用プロパティ
class Hoge {
val prop1 = "hello" // val を使うだけ
val prop2: String
get() = "hello" // カスタムアクセサ
val prop3: String
get() { // カスタムアクセサ
return "hello"
}
}
拡張関数・プロパティ
// 拡張関数
fun String.displayLength() {
println(this.length)
}
// 拡張プロパティ
val String.tooLong: Boolean
get() = this.length > 100
"abc".displayLength() // "3" インスタンス関数っぽく呼び出せる
println("abc".tooLong) // "false" プロパティっぽく呼び出せる
おまけ
val a = 15
// if は式 (大体の言語は文)
println(if (a > 15) "大きい" else "小さい")
// or/and
if (a == 15 or b == 20) // or とか and とか
// ...
if (result = func1()) // 代入は値を返さないのでこれはできない
// ... できない方が素晴らしい
// Java の相互運用機能のおかげで getter/setter をプロパティに
class MainActivity : Activity() {
fun onCreate(/* ... */) {
super.onCreate(/* ... */)
val context = this.applicationContext
// Java は this.getApplicationContext()
}
}
リファレンス
こっち見たほうがいいよ!
まとめ
- Kotlin イイヨ!
- 短い! null 安全!
- プログラム言語だけに集中できる
- Java との併用が簡単