Javaからの移行経験者が感動するKotlin入門。初心者向け勉強法もくわしく解説します

ヤフー株式会社でAndroidエンジニアをしている片淵雄介(@Buchi_orz)と申します。フロントエンド、iOS、Androidなど様々なプラットフォームを経験し、現在はYahoo!ニュースのAndroidアプリを担当しています。今回はこれからKotlinを始めようとする読者に、Kotlinの魅力と最初に知っておきべきポイントを解説します。

フロントエンド、iOS、Androidと様々なプラットフォームを経験してKotlinにたどり着く

私はウェブ制作会社でのフロントエンドエンジニアからキャリアをスタートしました。以降、iOS、Androidなど様々なプラットフォームのプロダクトに携わり、2016年にヤフー株式会社にAndroidエンジニアとして参画。2019年よりYahoo!ニュースのAndroidアプリを担当しています。iOSアプリの開発とAndroid開発を比較すると、Android開発は自由度が高いと言えます。そのため、工夫のしがいもあり、そこが楽しさにつながっています。

フロントエンドは2年、iOSは2年、Androidは6年経験しています。言語としてはウェブ制作会社時代からJavaを利用しており、そのKotlin移行を行ってきました。

JavaもKotlinも触ってきてはじめてわかることなのですが、Kotlinはとてもプログラミングしやすいポイントが多く、はじめて触れた時には感動しました。5つに絞ってその魅力をお伝えしようと思います。

JavaからKotlinに移行したときの感動5つのポイント

私がKotlinを始めたのは2016年。最初はテストコードから実験的に導入を始めました。Kotlinは、Javaに比べて必要な記述量が減るので、コードを読むのも楽になりますし、Java からKotlinへのリファクタリング時にはリスト操作なんかも気持ちよく書けます。記述量は減るのですが、自由度は高いので、Android開発の醍醐味として感じている楽しさは減っておらず、むしろKotlinだとさらに工夫のしがいが出てきたと感じています。

また、JavaとKotlinは互換性もあり、導入コストは低く、導入することによるメリットのほうが多いと言えます。そこで感じた5つのポイントを紹介します。

1. データクラスで短く書ける

まず1つ目はデータクラス。

例えば、Javaで書いていたこちらのコード。

public class ToDo {    
    private final Strnig _mTitle;
    private final String _mText;

    /**
     * コンストラクタ
     */
    public ToDo(@NonNull final String aTitle,
        @Nullable final String aText) {
        _mTitle = aTitle;
        _mText = aText;
    }

    public String getTitle() {
        return _mTitle;
    }

    public String getText() {
        return _mText;
    }
}

Kotlinで書くと、ここまで短くなります。

// Nullになる可能性がある変数の場合は型の後ろに `?` がつきます (Javaだと@Nullable)
data class ToDo(
    val title: String,
    val text: String?)

Sample 01

「getter、setterはどこに…」と思われるかもしれませんが、Kotlinのdataクラスを使用した場合、ユーザーが実装する必要はなく自動的に生成してくれます。

2. Null安全でクラッシュを防げる

2つ目にNull安全。

KotlinはNull安全プログラミングとしても知られています。そのため、実行時に意図していない箇所でNullPointerExceptionが発生してアプリがクラッシュするような事態も防げます。

上記のKotlinの例でも「?」マークが2箇所ついていました。この記述により、Null許容型となり、マークをつけなかった場合はNull非許容型となります。

実際にどのように使うのか、コードで見てみましょう。

fun main(args : Array<String>) {
    // Null非許容型のToDoを生成
    val todo: ToDo = ToDo("title", "text")

    // titleプロパティはNull非許容なのでOK
    printString(todo.title)

    // textプロパティはNull許容のためエラーとなる
    printString(todo.text)

    // Null許容のパラメータの場合、Kotlinのスコープ関数を使用することで出力することが可能となる
    todo.text?.let {
        printString(it)
    }

    // Kotlinのエルビス演算子を使用することによりNullの場合、空文字を出力させることも可能となる
    printString(todo.text ?: "")
}

/**
 * Null非許容の引数textをLog出力
 */
fun printString(text: String) {
    println(text)
}

Sample 02

サンプルではあまり利点が感じられないかもしれませんが、API通信を行う際のレスポンスとして使用するときなどに威力を発揮します。

3. リスト操作を気持ちよく書ける

3つ目にリスト操作。

Kotlin独自のものではないので、真新しさを感じる方は少ないかもしれませんが、Android開発においてJavaで書いていたようなリスト操作をKotlinだと気持ちよく書けます。

例えば、Listに入っている文字列を全て大文字に変換したい場合はこうなります。

// 文字列の配列を作成
val strList: List<String> = listOf("first", "second", "third")

val newStrList: List<String> = strList.map { it.toUpperCase() }

大文字に変換するだけではなく、文字数が5文字のものを抽出したい場合も同様に簡単にできます。

// 文字列の配列を作成
val strList: List<String> = listOf("first", "second", "third")

val newStrList: List<String> = strList.map {
    it.toUpperCase()
}.filter {
    it.length == 5
}

Sample 03

他にもリスト操作をする上で便利な関数が標準で実装されているので、リスト操作をするのが楽しくなるかもしれません。

4. デフォルト引数と名前付き引数で不具合が起こるのを防ぐ

4つ目にデフォルト引数と名前付き引数。

Javaの場合だと引数の違うメソッドを用意しようとした場合、オーバーロードで実装したり、Builderパターンを使用したりするかもしません。しかし、Kotlinであれば簡単に実装することができます。

引数の順序に関しても、名前付きで呼び出すことが可能なので、意図しない箇所に値を入れてしまうような不具合を抑えることができます。

例として、id、title、text要素を持ったデータクラスNoteをみてみましょう。

// id以外はデフォルト引数を持つ
data class Note(
    val id: Int,
    val title: String = "",
    val text: String = "")

// 全ての引数を指定して生成
val hogeNote = Note(0, "hoge", "fuga")

// text以外を指定して生成
val fugaNote = Note(0, "hoge")

// title以外を指定して生成 (名前付き引数を使用する)
val piyoNote = Note(id = 0, text = "fuga")

// idのみ指定して生成
val fooNote = Note(0)

// idはデフォルト引数を持たないので以下の例はエラーとなる
val barNote = Note()

Sample 04

上記の例だと少し簡単すぎるので、以下のようにRetrofitを使用してAPI通信を行う例をみてみましょう。

// API
class NoteRepositoryImpl {
    interface Service {
        @GET(ApiUrl.NOTES)
        fun getAllNote(
            @Query("os") type: String = "android"
        ): Single<List<Note>>
    }

    fun load(): Single<List<Note>> {
        val service = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(OkHttpClient.Builder().build())
                .build()
                .create(Service::class.java)

        // 引数を指定していないのでAPI通信時にosの値はandroidとして送られる
        return service.getAllNote()
    }
}

Sample 05

このような実装をすることにより、必要な場合にはパラメータを指定、不要な場合にはパラメータを指定せずにデフォルトを使用することが可能となります。

デフォルトパラメータが変更になった場合も、呼び出し先のパラメータを変更するだけなので簡単ですね。

5. Kotlin KTXで実装量が減る

最後にKotlin KTX。

Kotlin KTXとは、Kotlinの拡張機能セット (Kotlin extensions) であり、Kotlinをもっと便利に使うことを可能にしてくれるものです。

導入も簡単で、build.gradle (ビルドツール) のdependenciesに使いたいモジュールを記述してSyncするだけで使えるようになります。

Kotlin KTX を使用しなかった場合と、使用した場合の違いをみてみましょう。

/**
 * Viewの表示・非表示
 * Core KTX
 */
// Kotlin KTXを使用しなかった場合
if (hoge > 0) {
    view.visibility = VIEW.VISIBLE
} else {
    view.visibility = VIEW.GONE
}

// Kotlin KTXを使用した場合
view.isVisible = hoge > 0

/**
 * Bundleを作成
 * Core KTX
 */
// Kotlin KTXを使用しなかった場合
val bundle = Bundle()
bundle.putString("hoge", "fuga")
bundle.putBoolean("isHoge", true)

// スコープ関数を使用した場合
val bundle = Bundle().apply {
    putString("hoge", "fuga")
    putBoolean("isHoge", true)
}

// Kotlin KTXを使用した場合
val bundle = bundleOf(
    "hoge" to "fuga",
    "isHoge" to true)

/**
 * ViewModelを生成
 * Fragment KTX
 */
// Kotlin KTXを使用しなかった場合
val viewModel by lazy {
    ViewModelProviders.of(this).get(HogeViewModel::class.java)
}

// Kotlin KTXを使用した場合
val viewModel: HogeViewModel by ViewModels()

このように、Kotlin KTXを使うことにより実装しないといけない量が削減できます。

今後も便利な拡張機能が増えていくはずです。そして、Kotlinでは簡単にこのような拡張機能を自分で作ることもできます。Javaだと面倒だった処理もKotlinだと簡単に書けるので、どんどん使っていきましょう。

以上、私がKotlinの開発を始めた際に感動したポイントを5つ紹介しました。

他にも、Javaの場合だとクラス名とファイル名を同じにしなければいけなかったのが、Kotlinだと1つのファイルに複数のクラスを書くことができたり、拡張関数という既存のクラスにユーザーが独自で拡張することができる機能があったりとJavaと比べると便利な機能がいくつも用意されています。

Kotlinの勉強を始める際のポイント

上記の5つのポイントで説明したように、Javaで実装しようと思うと少し面倒だった処理も、Kotlinだと簡単に実装することができます。必然的にコードの記述量も減りし、可読性もよくなります。Android開発では公式言語として採用されており、Kotlinを使わないという手は考えられないでしょう。

しかし、「新しくKotlinを学ぼうとしてもどこから始めたらいいかわからない」という方も少なくないでしょう。そこで、私がKotlinを学ぶにあたって参考にした書籍やWebサイトを紹介します。

Kotlinスタートブック

Kotlinスタートブック – 新しいAndroidプログラミング」、通称「赤べこ本」。Kotlin第1人者の長澤太郎さんの本です。

Kotlinの文法だけでなく、実際にどのようにKotlinを使えばいいのかがわかりやすく解説されています。これからKotlinを始めてみようという方には一番おすすめできる本です。

Kotlinイン・アクション

Kotlinイン・アクション」はKotlinを少し触ってみて、「パフォーマンス面などもう少し詳細も知りたい」という方におすすめできる書籍です。

完全に初心者の方には少し難しいかもしれませんが、Kotlinの基礎を学んだ後におすすめできる一冊です。

Kotlin公式サイト

Kotlin公式サイト」には実際にコードを触りながらKotlinの言語を学ぶことができる 「Playground」が用意されています。

公式サイトで一通りKotlinの言語仕様などを学んだ後に、上記の書籍を読んでみるという使い方も良いでしょう。

最後にーーKotlinの学習コストはそこまで高くない

実際に何らかの開発言語を学んだことのある方であれば、Kotlinの学習コストはそこまで高くないでしょう。完全にプログラミングが初めての方であっても、書籍や公式サイトなど学ぶ環境は整っており、楽しくマスターできます。

実際に業務でKotlinを使用するようになってから、コードの可読性もよくなりアプリのクラッシュも減少したように感じています。

今回は紹介できませんでしたが、Kotlin 1.3からCoroutineがStableとしてリリースされました。今後も魅力的な機能がどんどん追加されていくはす。これを機にKotlinを始めてみてはいかがでしょうか。

最後に私が開発に携わっているYahoo!ニュース アプリもぜひ使ってみてください。何か気になる点があればフィードバック頂けるととても嬉しいです。

IMG 0900

片淵雄介(@Buchi_orz
株式会社スパーズにてフロントエンドエンジニアからキャリアをスタート、株式会社DMM.comラボを経て、ヤフー株式会社に入社。女性向けメディアTRILLを担当後、現在ヤフー株式会社メディアカンパニー メディア統括本部でYahoo!ニュースのAndroidアプリを担当。

この記事を書いた人
FLEXY編集部
FLEXY編集部
ハイスキルIT人材への案件紹介サービス
FLEXYメディアは、テックメディアとしてテクノロジーの推進に役立つコンテンツを提供しています。FLEXYメディアを運営するのは、ITに関連するプロシェアリングサービスを提供するFLEXY。経営課題をITで解決するためのCTOや技術顧問のご紹介、ハイスペックエンジニアやクリエイターと企業をマッチングしています。【FLEXYのサービス詳細】求人を募集している法人様向け/お仕事をしたいご登録希望の個人様向け

今のエンジニア組織に満足されていますか?

法人のみなさまへ。flexyでは技術組織の採用支援、組織作り(人事評価、パフォーマンスマネジメント)やアーキテクチャー設計アドバイスなどエンジニアのマネジメントや上流工程にお悩みの企業様とハイスキルなCTOの皆様やTechLeadの皆様の出会いを支援しております。

FLEXYでご案内できる業務委託案件

業務委託契約・開発案件(JavaScriptメイン)

テーマ FLEXY登録画面から案件詳細の確認と直接応募が可能です
勤務日数 2-3日/週
報酬 4万円/日
必要スキル JavaScript・React
勤務地 東京都内/リモート含む
リモート

外部CTO、技術顧問

テーマ 技術アドバイザリーとして知見と経験を生かす
勤務日数 1日/週
報酬 10万円/日
必要スキル エンジニア組織立ち上げや統括のご経験、コードレビュー経験、技術的なアドバイスが出来る方
勤務地 東京
リモート 相談可

業務委託契約・インフラエンジニア

テーマ FLEXY登録画面から案件詳細の確認と直接応募が可能です
勤務日数 2-3日/週
報酬 5万円/日
必要スキル それぞれの案件により異なります
勤務地 東京
リモート 相談可

業務委託・フロントエンドエンジニア

テーマ FLEXY登録画面から案件詳細の確認と直接応募が可能です
勤務日数 週1日〜
報酬 5万/日
必要スキル それぞれの案件により異なります
勤務地 東京
リモート リモートと常駐のMIXなど

人材紹介のCTO案件(非公開求人)

テーマ CTO、技術顧問案件はFLEXYに登録後、案件をコンサルタントからご紹介します
勤務日数 業務委託から人材紹介への移行
報酬 年収800万以上
必要スキル CTOとして活躍可能な方、エンジニア組織のマネージメント経験
勤務地 東京
リモート 最初は業務委託契約で週3日などご要望に合わせます

業務委託契約・サーバサイドエンジニア

テーマ FLEXY登録画面から案件詳細の確認と直接応募が可能です
勤務日数 週2-3日
報酬 案件により異なります
必要スキル 案件により異なります
勤務地 東京都内
リモート 相談可能
個人登録

お仕事をお探しの方(無料登録)
法人の方(IT課題の相談)