【はじめてのAndroidアプリ開発】 JavaとKotlinを比較
Kotlin とは
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/4361053609b2c1cf6f14d76931408a9b0698e26b.14799.desktop.jpg)
Kotlin公式ページ https://kotlinlang.org/
Kotlin は、 JetBrains 社が2011年に開発した JVM(Java の仮想環境) 上で動作するプログラミング言語。 Kotlin を開発した経緯としては、 当時 JetBrains 社が開発していた IntelliJ IDEAという Java対応の統合開発ソフト(IDE)の実行速度を上げるため。そして Kotlinに100% Java との互換性を持たせることで、Java 開発者のIntelliJ IDEA利用を促し、強いては IntelliJ IDEA 売上アップを狙った、どういう経緯があります*。
Android のサポート言語として Kotlin が選ばれたのは 2017年10月。 Android Studio をインストールした時点で Kotlin を使い、 Android アプリを開発することが可能。なお Kotlin は、Swift や Ruby のように GitHub に公開されているオープンソース型プログラミング言語になります。
Java とは
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14801/cd9d294a0a8231bfce2f204d78c5515ad2d30e70.14800.desktop.jpg)
Java公式ページ https://www.oracle.com/java/
Java は、1995年にリリースされた「一度書けばどこでも動く」をキーワードに実社会に広く浸透しているプログラミング言語。ユースケースとしては、 Android アプリを始め、 Web アプリ、 デスクトップアプリ、金融システム、人工知能など幅広いジャンルで活躍中。
現在 Java 自体の管理は Oracle社が行い 、最新版は2018年9月にリリースされた Java 11。
就職転職にも強い言語として IT 業界を目指す人にとって、人気の高いプログラミング言語となっています。
仕事面でKotlinとJavaを比較
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14801/a97c19e316614827abd32870026271f83c2d8823.14802.desktop.jpg)
アプリ開発を勉強するモチベーションは人それぞれと思いますが、今回はまず各言語の求人状況を確認してみました。 求人状況を確認することで、どちらの方が社会的ニーズが高いか比較でき、学習コストの回収もイメージしやすいと思います。
求人件数の比較
|
Kotlin |
Java |
indeed |
1027 |
11867 |
クラウドワークス |
1 |
5 |
Upwork |
134 |
427 |
indeed 、
Upwork
どの求人サイトを確認しても、 Kotlin に比べて Java の方が求人数が多いことが確認できました。
ただ Indeed のアメリカ国内の求人状況を 「Kotlin Android」 「Java Android」 で検索してみると
Kotlin : Java = 995 : 5260 と日本に比べて Kotlin の割合が高いことが確認できます。
開発範囲の比較
Kotlin に比べて Java の方が開発範囲が広いと思って本項目をピックアップしたのですが、 Java と100%互換性を持つ Kotlinは、実は Java とほぼ同じ範囲で開発が可能。
Web アプリケーションについては Kotlin 製フレームワークのTornadoFXが開発を手伝ってくれ、ゲームについてはクロスプラットフォームの libGDX、 人工知能についても TensorFlow for C によって Kotlin で様々なアプリケーションを作ることが可能。
ただし Java に比べるとリリースされているフレームワークやプラットフォームの種類は少ないので、情報量や開発手段の可能性としては Java の方が勝ると思いますね。
以上より就職や転職といった仕事の面を考慮すると、 Kotlin より Java の方が目的に合った言語と考えられます。
仕事面/Java Win!
学習環境でKotlinとJavaを比較
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14801/18e0a157bc6c1cc9585e0fc6f47c03c817d2086e.14804.desktop.jpg)
何か新しいことを始めようと考えた時、とりあえずネットや本で調べると思います。また独学で学習するにしても誰かに教えてもらうにしても、その学習基盤がどれだけ整ってるかというのは調べてみないと分かりません。
学習言語を決める前に、まずは学べる環境がどれだけあるかというのをチェックしておくことも重要でしょう。
参考書について//
Kotlin も Java も同じぐらい
現在 Android アプリ開発を学ぶための参考書は、 Kotlin も Java も同じぐらいリリースされています。
YouTubeについて//
Kotlin も Java もボリュームは同じぐらいだけど....
プログラミング言語の使い方やアプリケーションの開発を学習するにあたって、 YouTube の教材を利用される方も多いと思います。
それで Kotlin と Java どちらの方が YouTube 上のコンテンツが充実しているか確認してみました。
ボリュームとしては Kotlin も Java も同じぐらいな印象を受けますが、 Kotlin の方が新しく製作された感が強く、見てみようという意欲が正直湧きます。そういった意味では、 Kotlin の方が勝ちかな、と思いますね。
Kotlin YouTubeコンテンツ / Java YouTubeコンテンツ
プログラミング・スクールや学習コンテンツについて//
同じぐらい
プログラミングスクールの学習をサポートする「ドットインストール」や「Progate」。この辺りの Kotlin 対応状況を確認してみました。
|
Kotlin |
Java |
ドットインストール |
○ |
❌ |
Progate |
❌ |
○ |
CodeCamp |
❌ |
○ |
TechAcademy |
○ |
❌ |
RainbowApps |
○ |
○ |
Progateは、 Android アプリ開発を前提とした Java の学習ではない。基本的な Java文法の学習。
PHP や Ruby などのメジャーなプログラミング言語はどのプログラミングスクールも採用しているのに比べて、 Kotlin と Java については採用状況が分かれる結果。
理由は色々あると思いますが、これから学習を進めていこうと考える者にとって、とりあえずどちらの言語も勉強できる環境はある、ということが確認できます。
Stack Overflowについて//
Javaの方が情報多い
プログラミングに関する Q&A が充実している Stack Overflow でどちらの言語の取り扱いが多いか比較していました。
Kotlin/ 20,961件*、
Java/ 227,563件*
Kotlin に比べて Java の方が歴史ある分、投稿数が多いのかもしれません。
以上、学習環境面で Kotlinと Java を比較した結果、 Java の方がネット上の情報量が多く、エラー対策も迅速に行えそうなことから、 Java の方が優位と考えます。
学習環境/Java Win!
コード面でKotlinとJavaを比較
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14801/b59fe53e2d308a121edd81ccc5b3cfe4383b4be1.14805.desktop.jpg)
Java に比べて簡潔と言われる Kotlin。実際にどれほどコードに違いがあるのか、 2つほど例を取って確認したいと思います。
Hello World
まずはプリント文の比較を Kotlin と Java で行ってみました。
【kotlin】
fun main(args: Array<String>) {
println("Hello, World!")
}
【Java】
public class SampleCode{
public static void main(String[] args){
System.out.println("Hello World!!");
}
}
明らかに Kotlin の方が記述量が少なく、シンプルなコードであることが確認できます。
次に実際にプログラムを実行する過程を確認してみました。まずは Kotlin から。
KotlinでHello World
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/927c211ce8adc96341f2070a58194916d92ff5b3.14777.desktop.jpg)
上記の Kotlin 製 Hello World のコードをコピーし、 SampleKotlin.kt に貼り付け。なお Kotlin のプログラム実行には、パソコンに Kotlin をインストールしておく必要があります。Kotlin の実行環境があるかどうかは、下記のコードをコマンドプロンプトもしくはターミナルで実行してみてください。
Kotlinの実行環境を確認するコマンド
kotlin -version
![image](//s3-ap-northeast-1.amazonaws.com/mash-
jp/production/uploads/14701/c82a071f45b1c3f33b918ad99a96172898b458d9.14778.desktop.jpg)
Kotlin プログラムを実行するためには、 Java 同様一度コンパイルする必要があります。ただ Java のようなコンパイル作業ではなく、 Javaの圧縮ファイル .jar を生成する必要が。 Kotlin でプログラムファイルをコンパイルするコマンドは以下のようになります。
kotlinc ./ファイル名.kt -include-runtime -d ファイル名.jar
今回の場合
kotlinc ./SampleKotlin.kt -include-runtime -d SampleKotlin.jar
コンパイルを実行すると先ほどまではなかった SampleKotlin.jar が新しく作成されていることが確認できます。後は SampleKotlin.jar を Kotlin で実行。
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/5ed7b17a967087fc9041a629e894187eadc1ebb4.14779.desktop.jpg)
Kotlin でプログラムを実行するコマンドは以下のようになります。
kotlin ファイル名.jar
今回の場合
kotlin SampleKotlin.jar
すると Hello World が出力されましたね。
こんなふうに Kotlin では作成した Kotlin ファイルを一旦 jar にコンパイルして、そして実行という流れになります。
Javaで Hello World
次は Java で Hello world を出力する過程を確認していきます。
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/3cb10614dcb4fe7c4e9d1485496bbeb61875326d.14780.desktop.jpg)
まずは上記でご紹介した Java 製の Hello World プログラムを新規ファイル SampleCode.java に貼り付けます。
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/de7af799043f0b02fcdf380024a0b40cfe766606.14781.desktop.jpg)
そして Java ファイルをコンパイルするために下記のコマンドを実行。
javac SampleCode.java
それと先ほどまではなかった SampleCode.class というファイルが新しく作成されました。 あとはこの SampleCode.class を実行すればいいですね。
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/a77b9c8b9dd09725f9633c3337ea36addb343751.14782.desktop.jpg)
java SampleCode
Javaの場合は Kotlin と違って、 jar ファイルを生成しなくてもプログラムを実行することが可能。
このあたりはプログラミング学習初期の段階において、 手間が少なく、コンパイル時間の短い Java の方が優位かもしれません。
nullをKotlinとJavaで比較
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14801/dd8ebb21e4f483570ef032da32e38d27b7b593cf.14806.desktop.jpg)
Javaは、 Python や Ruby のようなプログラミング言語と違って、プログラム実行前にコンパイルが必要。コンパイルすることによって、プログラム・エラーを未然に発見することができ、エラーの少ない比較的安全な言語として利用可能。
しかしそんな安全と言われる Java にも欠点が。その代表的な例が 『null』。
nullは、何も値がないということを意味し、アプリケーションを開発するにあたって、 null は避けては通れない構文の一つ。 nullの例を挙げると、ユーザー登録の入力欄で「任意」という値がありますよね。その任意の入力欄に何も入力していない場合は、 null としてデータベースにポスト。
そんな null ですが、 Java の場合はコンパイル時にエラーを発見できない場合もあります。コンパイル時にエラーが発見できなかった場合、アプリケーション実行時にエラーが発生し、ユーザーに迷惑をかけてしまうということに。
このようなアプリケーション・エラーを発生させないために、 Java の場合は null に対してデリケートになりますが、一方 Kotlin の方は Java ではコンパイル・スルーするような null エラーも、コンパイル時にエラー・キャッチ!!
コードを例に挙げてみると分かりやすいと思いますので、Java と kotlin で null の違いを比較してみました。
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/e86e671a2cb0c977a0f938076827a7b5cc6bfed3.14783.desktop.jpg)
まず Java と Kotlin それぞれで null を含むプログラムを作成してみました。プログラム内容は、文字列の字数を表示する内容となっています。どのプログラムが実行できるかわかりますでしょうか?
【上図 左の Javaプログラム SampleCode.java】
public class SampleCode{
public static void main(String[] args){
String a = "Hello Java!!";
String b = null;
System.out.println(a.length());
System.out.println(b.length());
}
}
【上図 中央の Kotlin プログラム SampleKotlin.kt】
fun main(args: Array<String>) {
val a:String = "Hello Kotlin!!"
val b:String = null
println(a.length)
println(b.length)
}
【上図 右の Kotlin プログラム SampleKotlin-2.kt】
fun main(args: Array<String>) {
val a:String = "Hello Kotlin!!"
val b:String? = null
println(a.length)
println(b?.length)
}
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/00e2ae45093c8648389681fc7dc5854f9cb842a8.14784.desktop.jpg)
まず最初に Java プログラムを実行してみました(上図)。するとコンパイルは実行できるものの、プログラム実行時にエラーが発生。
Exception in thread "main" java.lang.NullPointerException
at SampleCode.main(SampleCode.java:7)
エラー内容は、例外発生ということですね。このように Java プログラムの場合は、 null の取り扱いを正しく行わなかった場合、エラーを未然に発見することができない場合もあります。
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/73f6aa06dc273c82c06bac4f57215ecc3fe57dc3.14785.desktop.jpg)
今度は先ほど実行した Java のプログラムを、 Kotlin に書き換えて実行してみました(上図)。すると Kotlin の場合は、コンパイル時でエラーが発生。プログラムを実行することができません。
SampleKotlin.kt:3:20: error: null can not be a value of a non-null type String
val b:String = null
またエラー内容を確認すると、 null の設定が正しくないと表示されています。このように kotlin は、 Java ではコンパイル時に発見できなかった null エラーをコンパイル時に発見することができ、アプリケーションエラーを未然に防ぐことが可能。
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14701/c5d638602bd3cd71521696e926821572ff852532.14786.desktop.jpg)
最後に kotlin で null を受け入れるプログラムを実行してみました。 データ型の後に ?マーク をつけるだけで null を許容するプログラムとなります。一見すると簡単そうですが、 常に null の問題がつきまとうので、慣れるのには少々手こずるケースも。
以上が Java と kotlin の null に対するプログラムの違いで、一般的には Kotlin の方が null エラーを未然に防げるため安全で優れているという風に言われています。
しかし、 Swift の場合もそうですが、個人的には何でもかんでも null 安全というのはちょっと慣れにくい部分でもありました。このあたりは実際にプログラムを作成していく中で感じることができると思いますよ。
ちなみに Java の null 対策はいくつか方法がありますが、 if文 を使った簡単な例は以下のようになります。
public class SampleJava2{
public static void main(String[] args){
String a = null;
if(a != null){
System.out.println(a.length());
}else{
System.out.println("nullだね");
}
}
}
>> 実行結果
nullだね
nullのエラーハンドリング/Kotlin Win!
KotlinとJavaの運営母体を比較
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14801/89611e04d247933140c11b9e06489d5efb3ed738.14807.desktop.jpg)
これから勉強しようとするプログラミング言語が、今後も継続的に発展し続けるかどうか、という問題は学習意欲にも関係してくるでしょう。 勉強するプログラミング言語が広く社会に普及すれば、最初は趣味として学んでいた言語も仕事や就職などに生かすことが可能。
プログラミング言語の継続と発展には様々な要因が関係してくると思いますが、その中でも運営母体が占める割合は大きいでしょう。以下に Kotlin と Java の運営企業、JetBrains 社と Oracle社を簡単に比較してみました。
運営母体の比較
運営母体 |
JetBrains社 |
Oracle社 |
言語 |
kotlin |
Java |
経済性 |
未上場 |
ニューヨーク証券取引所上場 |
従業員 |
700 |
137,000 |
設立 |
2000年 |
1977年 |
明らかに Java を運営している Oracle 社の方が大きく、安定していそうなことが確認できます。
運営母体の比較/Java Win!
KotlinとGoogleとJavaの関係
![image](//s3-ap-northeast-1.amazonaws.com/mash-jp/production/uploads/14801/e9e54ddef23a70c6214208593978802a0ce3821a.14808.desktop.jpg)
2017年10月に Google は Android の開発言語に kotlin を追加。その後一気に Android アプリの開発言語として kotlin が注目を浴び、普及していき、多くの方が Android = Kotlin という方程式に。
なぜ Google は kotlin を新しくサポート言語として加えたのでしょう? 単に Java に比べてモダン(書きやすい)で安全、そして100% Java と互換性を持つということで Kotlin を採用したのでしょうか?
今後 Android アプリを開発する中で知っておいた方がいい Kotlin と Google、 Java(Oracle社) の歴史を少しご紹介します。
Google と Oracle社の裁判
Android と Java は仲の良いように見えますが、その裏で Google と Oracle 熾烈な戦いが行われています。
端を発したのは、 2010年8月。 Oracle社が、 Google 社を訴える。内容は、 Android は Java の特許を 7つ侵害している 、と。その後、判決と控訴を繰り返し、裁判は長期化。そして昨年2018年3月に一つの答えが。 Oracle社勝訴、 Google社に 約1兆円の損害賠償の支払いを命じる、というもの。
その後一部では、 1兆円もの損害賠償の負担は大きいため、 Android アプリでビジネスを行っているデベロッパーの方にも負担を求めるという噂が。
こうした Google と Oracleの不安定な関係から、 Java ではなく Kotlin を採用する動きが強まっていると考えられます。 しかしまた一方で、 Google と Oracle の戦いは終わっていなく 2019年1月に最高裁に上訴。
この 2社の関係、いつ終止符が打たれるのか分かりませんね。
Google社の次期 OS
現在 Google 社は、 Android と Chrome OS という二つの OS を運営しています。その 2つの OS を統合した Fuchsia という新しい OS の開発も進められているという噂。 Fuchsiaについては、未確定要素も多く必要以上に不安を煽ってもいけないのですが、これからスマートフォンの OS = Android とは限らない、ということですね。
私たちがすべきこと
今は Android のアプリ開発と Java がくっついていますが、これからは別々のものになる可能性があります。純粋に Android のアプリ開発をしたいと言うのであれば現段階では Kotlin、いやいや Android アプリ開発も含め様々な IT をプログラムしたいと言うのであれば Java、 になるのではないでしょうか。
この辺りについては、 iOS の Swift の方が安定していますね。
まとめ
今回様々な視点で Kotlin と Java を比較させていただいたわけですが、 5年後 Kotlin にしとけばよかった、 Java にしとけばよかったと、いうのは誰にも分からない結論と思います。
ただ、だからといって何もしないのは一番生産性が低いかもしれません。
また正直のところ、 Kotlin の方がモダンで安全で書きやすいと言われるものの、プログラミングを知らない方にとっては Java も Kotlin もそんなに簡単ではないということ。一部では「 Kotlin を使ったら Java に戻れない」 と言われますが、それは Java を知ってるからこそ言えるコメント。
Java を使える人は Kotlin も使えると思います、逆に Kotlin を使える人は Java を使えるかというと??? 一般的に難しい方から優しい方には馴染めるけど、優しい方から難しい方には馴染みにくいのではないでしょうか。 こうした「やってみないとわからない」ようなこと、 CodeCamp では Kotlinに似た Swift を使った iOS のアプリ開発と Java を使った Android のアプリ開発で、やさしい開発と難しい開発の両方を体験することができます。
ご興味がある方は、 CodeCampの公式ページよりチェックしてみてください。
最後に究極的なまとめですが、 Android アプリ開発だけなら Kotlin、 Android アプリ開発も含め就職・転職も視野に入れるのなら Java と思いますね、私は。
![](https://imp.ebis.ne.jp/imp.php?ai=tdv5c9c6440d76e0&argument=qkDLyMCX&tag_id=tag5c9c6440c0f7c&dn=adHJpYmV1bml2X2xvZw%3D%3D)