Kotlinの設計におけるJavaとの相互運用性を現役エンジニアが解説【初心者向け】

初心者向けにKotlinの設計におけるJavaとの相互運用性について解説しています。ここではKotlin同様Android開発に使われるJavaとの互換性や比較について見ていきます。それぞれの言語の特徴と相互運用を学びましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Kotlinの設計におけるJavaとの相互運用性について解説します。

 

本記事はTechAcademyのAndroidアプリ開発オンラインブートキャンプの内容をもとに解説しています。

田島悠介

今回は、Androidアプリ開発に関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Kotlinの設計におけるJavaとの相互運用性について詳しく説明していくね!

大石ゆかり

お願いします!

 

Kotlinの設計におけるJavaとの相互運用性

KotlinはJavaプログラミング言語と100%互換性があるよう設計されています。よって既存のJavaのコードをKotlinから呼び出したり、またその逆を行なうことが簡単に行えます。

また、Androidアプリの開発環境である Android Studio には、JavaのコードをKotlinに変換するツールも用意されています。

この記事では、実際のソースコードをもとに、KotlinとJavaとの比較、相互運用について確認していきます。まずは作成するクラス(ソースコード)の概要です。なお、実行する際は、KotlinとJavaを両方記述できるAndroid Studio で行いましょう。

クラス名 Kotlin/Java 概要
Animal Java 抽象クラス
Dog Java Animalを継承したクラス
Cat Kotlin

それぞれのソースコードは以下となります。

Animal.java

abstract public class Animal {
    abstract public void hello();
}

Dog.java

import android.util.Log;

class Dog extends Animal{
    // ageを格納するフィールド
    private int age;
    // nameを格納するフィールド
    private String name;

    // ageを取得するgetter
    public int getAge(){
        return this.age;
    }
    // ageを設定するsetter
    public void setAge(int value){
        this.age = value;
    }

    // nameを取得するgetter
    public String getName(){
        return this.name;
    }

    //コンストラクタ
    public Dog(String name, int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public void hello(){
        Log.d("kotlin", "こんにちは!わたしは" + this.name + "だワン!年は" + this.age + "だワン!");
    }
}

Cat.kt

import android.util.Log

class Cat(val name: String, var age: Int): Animal() {
    override fun hello() {
        Log.d("kotlin", "こんにちは!わたしは${this.name}だニャー!年は${this.age}だニャー!")
    }
}

また、上記のクラスを利用するKotlinのコードは以下となります。

val dog = Dog("ポチ", 8)
val cat = Cat("ミケ", 3)
dog.hello()
cat.hello()

val dog2 = Dog(null, 10)
// val cat2 = Cat(null, 10) // Null Safetyによりビルドエラーになる

 

KotlinとJavaの比較

DogクラスとCatクラスは、ほとんど同じ機能を実装しています。コード量の違いに驚いたことでしょう。Kotlinはオブジェクト指向プログラミングの考え方や基本的なデータ型をJavaと共通しながら、より効率よくコードが書けるよう改善されています。それではKotlin と Java の違いをいくつか確認して行きましょう。

 

継承の記述方法

extendキーワードの代わりに「:」に続けて継承元のクラスを記述します。クラス、インタフェースとも同様です。

class Cat(val name: String, var age: Int): Animal() {

 

プロパティ

メンバー(フィールド)とgetter/setterの代わりにプロパティを使用します。またプロパティはクラス名の後ろに続けて記述することができます。getter/setterの記述は不要です。読み取り専用にしたい場合はvalを使用します。

class Cat(val name: String, var age: Int): Animal() {

 

override、funキーワード

@overrideアノテーションの代わりに、overrideキーワードを使用します。また Kotlin では継承される側のクラスでは明示的に open を指定する必要があります。またユーザー定義関数を作成する場合には「fun」キーワードを使用します。

override fun hello() {

 

文字列テンプレート

文字列中に「${変数}」と記述することで、変数の値を埋め込むことができます。

"こんにちは!わたしは${this.name}だニャー!年は${this.age}だニャー!"

 

Null Safety

呼び出し元のコードを確認します。Dogクラスはnameにnullを設定できるのに対し、Catクラスには設定できません。これは Kotlin が null許容クラスとそうでないクラスを明示的に分けているからです。これを Null Safety といいます。この仕様によりNullPointerExceptionの発生を抑制することができます。

val dog2 = Dog(null, 10)
// val cat2 = Cat(null, 10) // Null Safetyによりビルドエラーになる

 

この他、KotlinとJavaにはいくつかの違いがあります。詳しくは公式ドキュメントを参考にしてください。

https://kotlinlang.org/docs/reference/comparison-to-java.html

 

[PR] Androidアプリの開発で挫折しない学習方法を動画で公開中

KotlinとJavaの相互運用

今回のコードではKotlinからJavaのコードを呼び出しています。

val dog = Dog("ポチ", 8)
dog.hello()

また同様にJavaからKotlinのコードを呼び出すことも可能です。

Cat cat = new Cat("たま", 15);
cat.hello();

このように、KotlinとJavaは相互運用することが可能です。既存のJavaのコードを生かしながら部分的にKotlinを導入するなど、リスクをおさえた導入が可能というメリットがあります。

 

この記事を監修してくれた方

太田和樹(おおたかずき)
ITベンチャー企業のPM兼エンジニア

普段は主に、Web系アプリケーション開発のプロジェクトマネージャーとプログラミング講師を行っている。守備範囲はフロントエンド、モバイル、サーバサイド、データサイエンティストと幅広い。その幅広い知見を生かして、複数の領域を組み合わせた新しい提案をするのが得意。

開発実績:画像認識技術を活用した駐車場混雑状況把握(実証実験)、音声認識を活用したヘルプデスク支援システム、Pepperを遠隔操作するアプリの開発、大規模基幹系システムの開発・導入マネジメント

地方在住。仕事のほとんどをリモートオフィスで行う。通勤で消耗する代わりに趣味のDIYや家庭菜園、家族との時間を楽しんでいる。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

他にもAndroidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオンの書籍レビュー記事も合わせてご覧ください。

TechAcademyでは、初心者でも最短4週間でオリジナルアプリが作れるAndroidアプリ開発講座(オンラインブートキャンプ)を開催しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルアプリを開発することが可能です。