Javaとは? 『プロになるJava』著者 きしだなおきが解説! Javaの特徴・歴史・将来性・学習方法
Javaは、長年IT業界を支えてきたプログラミング言語の定番です。IT未経験者でも名前を聞いたことがある方は多いのではないでしょうか?
同時に、Javaは比較的古いプログラミング言語なので、”古臭い”イメージを持っている方もいるかもしれません。
しかし、Javaは2025年現在も進化を続けており、私たちの生活を支える大規模システムなどに幅広く使われ、その実力は健在です。
書籍『プロになるJava』(共著、技術評論社)など複数冊を執筆し、Javaの顔として知られるきしだなおきさんも「Javaは今後も活発に変化し、AI時代でも使われ続けていく言語」だと言います。
本記事では、きしださんご本人による解説で、Javaの特徴や将来性、学習方法などを分かりやすく紹介します。Javaを学ぶメリットを知り、プログラミングの世界へ一歩踏み出してみませんか?
【この記事の執筆者】
『プロになるJava』共著
LINEヤフー Javaスペシャリスト
きしだなおき(@kis)
九州芸術工科大学 芸術工学部 音響設計学科を8年で退学後、フリーランスでの活動を経て、2015 年からLINEヤフーに勤務。著書に、『プロになるJava』(共著、技術評論社)、『みんなのJava OpenJDKから始まる大変革期!』(共著、技術評論社)、『創るJava』(マイナビ)など。
きしだのHatena:https://nowokay.hatenablog.com/
目次
JavaとはJavaの特徴Javaはどこで使われているのかJavaはなぜ広まったのかJava言語の特徴静的型付けオブジェクト指向関数型の取り込み記述の簡易化Javaの実行環境ガベージコレクション(GC)JIT(Just In Time)コンパイラJavaの実行環境の欠点とその改善起動時間の遅さメモリ消費量の増大コンパイルが必要Javaのインストールが必要Stop The World環境設定が面倒Javaの開発体制OpenJDKリリース周期とLTSJDKディストリビューションOracle JDKOracle OpenJDKEclipse Temurinどのディストリビューションを選べばいい?JavaのエディションJava SEは今でも基本Java EEはJakarta EEへJava MEは存在感をなくしAndroidが台頭Javaの学習「ラムダ式」が扱われている本を選ぶ統合開発環境(IDE)を使うオブジェクト指向を気にしないサーブレットJSPを避けるAIを活用するJavaの資格Oracle Certified Java Programmer(OCJP)基本情報技術者試験JavaのコミュニティーJavaは今後も使われるのかソフトウエア開発技術の安定業務システムでの選択肢が少ないAIの得意言語である新機能導入が今でも進められている書籍紹介
Javaとは
Javaとは、Oracle社を中心にオープンソースで開発されているプログラミング言語と、その実行環境です。
プログラミング言語全体における利用頻度は、調査により変動はありますが、上位5位以内には安定して入っています。
また、日本でのプログラマー求人の半数を占めるという調査もある、労働市場において人気のある言語でもあります。ただし、これは転職求人の場合で、副業やフリーランスの案件数ではランクを下げます。
本稿では、なぜそういった人気があるのか、そしてその人気に偏りがあるのかが分かるようJavaの特徴をまとめるとともに、今後どうなるかも見ていきます。
Javaの特徴
まずJavaの技術的な特徴を簡単にみてみましょう。
Javaで開発を行う際は、まずJava言語でプログラムを書き、Javaバイトコードという形式に変換します。そして、そのJavaバイトコードをJava仮想マシン(JVM)というソフトウエアで動かすという仕組みです。
そのため、JVMさえあればどのような環境でも同じプログラムが動きます。
また、JVMが改善すれば、同じプログラムでも実行速度があがることがあります。JVMによってメモリアクセスなどが検証されるため、プログラム実行の安全性も高くなります。
Javaはどこで使われているのか
Javaが最も得意とするのは企業や官公庁、金融などの大規模なシステムです。そして、こういったシステムの開発では多くのプログラマーが必要になるので、多くの求人がこの領域で発生しています。
また、規模の大きなWebサイトでも使われています。このようなサイトの開発でも多くのプログラマーが必要となるため、扱える人が多いということからJavaが採用されることがあります。
データベースなどのプログラムを動かすときに使うソフトウエアをミドルウエアといいますが、こういったミドルウエアにもJavaで書かれているものが多くあります。
逆に、あまり使われないのが小規模なWebサイトやスタートアップです。そのため小規模の多い副業やフリーランスの案件も少なくなります。また、ゲームや組み込みといった分野ではほとんど使われていません。
つまり、規模が大きく安全性や確実性が求められる分野に強く、規模が小さく扱いやすさが求められる分野には弱いということです。また、安定した速度で動く必要があるゲームや組み込みといった領域も苦手です。
それでは、こういった利用領域の違いがなぜ出ているか見ていきましょう。
Javaはなぜ広まったのか
Javaはもともと、Sun Microsystemsという会社でテレビに接続する機器などの開発を目的とした「Greenプロジェクト」として1991年に始まりました。その後、インターネットの普及にあわせて、Webブラウザでプログラムを動かす環境として作り直され、1996年にリリースされたのがJavaです。
Webブラウザで動かすために、さまざまな環境で動き、インターネットからダウンロードして動かしたプログラムがコンピュータに悪影響を与えないよう安全に動くという仕組みになりました。
この、さまざまな環境で動くということに目をつけた企業がIBMです。IBMはパソコンやワークステーション、メインフレームといった、規模や構成の違うコンピュータを製品として持っていたので、それらのコンピュータで同じプログラムが動かせる環境を求めていたのです。
IBMの参加によって企業システムへの対応が進むと、データベース開発会社であるOracleが、Javaから自社のデータベース製品への接続が行えるように、JDBCというJavaでのデータベース接続の仕組みの開発に協力します。
※ Oracleは2010年にSun Microsystemsを買収し、Java開発の中心企業になります。
また、当時はMicrosoftの勢いが激しく、全てのコンピュータがWindowsになるのではと囁かれていました。そのため、Microsoftに対抗すべく、IBMやOracleなどの会社がJavaのもとで連携していったという面もあります。
その後、1998年にWebシステム向けフレームワークであるJ2EEが登場してWebアプリケーションの基盤が整うと、普及の流れが加速していきました。J2EEはその後、Java EEになり、あとで説明するように今ではJakarta EEとなっています。
Java言語の特徴
Java言語の特徴は、静的型付けでオブジェクト指向を基盤にしていることです。また、関数型への取り組みも進んできています。
静的型付け
Java言語の特徴としては、まずデータの種類を表す型を重視するというところがあります。そのため、想定したデータと実際に扱うデータの種類が違うことで起こる実行時のエラーを少なくしています。
また、変換可能な場合に自動的に変換するということも少なく、意図しない変換が起きにくくなっています。ただし、記述量が増えてしまうのと、型に関しての理解がある程度は必要になるので、簡単なプログラムを作る場合や迅速に開発を進めたい場合でも作業量が多くなり、他の言語が使われることが多いです。
Java 10ではローカル変数の型推論が導入されて、型について意識する必要性が少し減っています。
オブジェクト指向
型の設計方針としては、オブジェクト指向という考え方をベースにしています。
オブジェクト指向とは、データと操作をまとめてオブジェクトという単位でプログラムを動かすという考え方です。
Javaでは、オブジェクトがどのようなデータを保持し、どのような操作を行えるかを「クラス」として定義します。そのため、Javaでのプログラミングはクラスを記述して構築していくことになります。
ただ、Java開発当時の技術では、単純な数値までオブジェクトとして扱おうとするとメモリ消費量や実行速度への影響が大きかったため、そういった単純な値については基本型としてオブジェクト以外の型も持っています。型がオブジェクト型と基本型に別れていることはプログラミングの複雑さにつながっているため、統一できるよう改善の努力が進められています。
関数型の取り込み
型の設計方針には、オブジェクト指向のほかに関数型があります。関数型は、「パラメータを与えると結果が返る」という関数を基本にする言語機能の設計です。
Webアプリケーションは、「Webリクエストを送ると結果が返る」というリクエスト処理の集合になるため、オブジェクト指向よりも関数型が向いています。
そこでJava 8からは、ラムダ式という書き方で関数型の考え方を取り入れています。
また、オブジェクト指向はオブジェクトの持つデータとして状態を扱うことが特徴ですが、関数型では状態が変化しないことを前提にしていることが特徴です。
状態が変化する場合、複数のプロセッサで同じオブジェクトを利用していると、あるプロセッサでオブジェクトの状態が変化した時に、そのことを他のプロセッサに伝える必要があります。
この同期処理はプロセッサの動きを止める重い処理で、パフォーマンスの劣化につながります。状態が変化しないことが保証されていれば、複数のプロセッサで同じオブジェクトを利用するとしても状態の伝播のための同期が不要で、他のプロセッサを気にすることなく処理を進めることができて実行効率があがります。そこでクラウドで行われる並列処理のために関数型が広まったという面もあります。
Javaでは状態が変化しないことを保証するために、レコードクラスという属性を変更できない型が導入され、レコードクラスを扱いやすくするパターンマッチングなども実装されてきています。また、レコードクラスではデータ格納のためのクラスを定義するときに必要だった定型的な記述を不要にして、簡潔なプログラムが書きやすくなっています。
記述の簡易化
Javaで今日の日付を表示するプログラムは次のようになります。
長いですね。今日の日付を得るのはLocalDate.now()で、表示はprintlnなので、あとの部分は言ってみれば余分です。冗長な記述によって意図しない動きを防いでるわけでもないため、無駄な記述ともいえます。
こういった余分な記述は、入力が面倒なだけではなく、学習難易度も上がります。この例でいえば、やりたいことは「今日の日付を表示する」なのに、このプログラムを理解するためには「publicとは何か」「String[]とは何か」といったことも知る必要があります。もしくは、「public static void mainはプログラムを書くときに必要な呪文」のようにして、学習の先延ばしを行います。いずれにしても、つまずきの元になってしまいます。
Javaはプログラミング教育でも多く採用されていますが、近年ではこういった難しさもあって、Pythonが選ばれることが増えています。もちろん、「Pythonをよく使うから」という理由なら仕方ないですが、「Javaを教えたいけど教えにくい」という理由であればもったいないです。
そこで、不要な記述をなるべく省いて学習しやすくなるような取り組みが行われています。まだ試験的な機能としてですが、新しい仕様では「今日の日付を表示する」プログラムは次のように書けるようになっています。
void mainは残っていますが、少ない記述で書けるようになりました。よほどのことがない限りは、2025年9月にリリースが見込まれるJava 25で正式機能になると思われます。
Javaの実行環境
Javaのプログラムは、Javaバイトコードに変換されてJava仮想マシン(JVM)というプログラムの上で実行されます。
JVMには、プログラムを安全に動かす仕組みや実行効率をあげる仕組みが用意されています。そのため、プログラマーがメモリの安全性を考えたり細かな実行効率を考える必要はありません。
※ ネットワークなどの安全性やアルゴリズムでの実行効率は考える必要があります
ガベージコレクション(GC)
Javaでは、ガベージコレクション(GC)という仕組みで自動的にメモリ管理を行います。そうすることで、メモリの確保や開放を考えることなくプログラムを組めるようになっています。
メモリ管理のミスによる不具合やセキュリティー問題が発生しないため、安全で安定したプログラムを作ることができます。
JIT(Just In Time)コンパイラ
JavaのプログラムはJavaバイトコードをJVMが解釈して実行しますが、毎回Javaバイトコードの解釈を行なっていると実行が遅くなります。そのためJavaでは、頻繁に実行される部分を見つけるとプロセッサで直接実行されるネイティブコードに変換します。こうすることで、プログラムを高速に実行することができます。このような仕組みをJIT(Just In Time)コンパイラといいます。
JavaのJITコンパイラでは、最初にC1というコンパイラで簡易なネイティブコード生成を行います。その後、実行が進んだときにC2というコンパイラによってプログラムの傾向にあわせた深い最適化を行います。これによって、非常に高い実行速度を実現しています。
Javaの実行環境の欠点とその改善
Javaの実行環境であるJVMでは、ガベージコレクションにより安全なプログラムが書きやすく、JITによって高い実行速度を実現しています。
そのため、安定動作が求められる大規模システムなどで利用されていますが、欠点もあります。
ここではJVMの欠点とその改善についてをまとめます。
起動時間の遅さ
JVMでは、JVM自体の起動も必要です。また、処理速度が出るようにC2コンパイラでの最適化が行われるまでにある程度の処理が必要になるため、高速に処理できるようになるまでに時間がかかります。
クラウド以前のWebアプリケーションのサーバーは、一旦起動しておけばメンテナンスまでリクエストを処理し続けていたので、起動時間が問題になることはありませんでした。
しかし、クラウドでは、負荷にあわせてサーバーが増えたり減ったりします。負荷が高くなってサーバーを起動するときに、なかなか処理の準備が整わずリクエストの処理ができないのであれば、サーバーを増やした意味がありません。
そこで、事前にコンパイルしておくAOT(Ahead Of Time)コンパイルで起動を速める工夫が始まっています。
また、標準機能ではありませんが、GraalVMのネイティブイメージという機能で、JVMまで含めてネイティブ化が行えます。この機能を使うと、起動時間を大幅に削減できます。ただし、すべてのプログラムがネイティブ化できるわけではなく、またネイティブ化のために特別な作業も必要になるので、いつでも使えるわけではありません。
graalvm.orghttps://www.graalvm.org/
メモリ消費量の増大
JVM自体がメモリを消費するため、全体のメモリ消費量が増えます。これも、クラウドで一台の物理マシンで多数の仮想マシンを動かすようになって問題になっています。
GraalVMのネイティブイメージではメモリ消費量も減らすことができます。
コンパイルが必要
Javaでは、JavaバイトコードにコンパイルしてJVMで動かすという手順が必要です。また、コンパイルの際はプログラムをクラス名と同じファイル名にする必要もあります。
例えば、「記述の簡易化」で例に出した最初のプログラムはToday.javaというファイル名で保存する必要があり、実行する場合には次のようになります。
このようなコンパイル作業は、アプリケーションとして本格的に開発する場合は問題になりませんが、学習中などちょっとしたプログラムを試すには煩雑です。また、コンパイルのために指定するのはプログラムのソースファイルで、実行のために指定するのはクラス名という点も混乱につながります。
そこで、Java 11では単一ソースファイルのプログラムが、そしてJava 22では複数ソースファイルのプログラムがコンパイル操作なしに実行できるようになりました。
起点となるプログラムには、ファイル名を自由につけることができます。
実際には内部的にjavacと同様の処理でコンパイルが行われ、Javaバイトコードとして実行されます。
Javaのインストールが必要
以前は、コマンドラインのツールなどをJavaで書いて配布する際、利用者側にJavaの環境がインストールされている必要がありました。また、ツールの対象Javaバージョンと利用者がインストールしているJavaバージョンが食い違っている場合も問題になります。
Java 9からはカスタムJREという仕組みで、プログラムの実行に必要なモジュールだけをパッケージ化して、ツールに含めて配布できるようになりました。
また、GraalVMのネイティブイメージでは、小さなJVMを含めた実行ファイルになるため、Javaの環境が不要です。
Stop The World
ガベージコレクションのメモリ管理では、一瞬ですがプログラム全体が止まることがあります。このプログラム停止をStop The Worldといいます。Stop The Worldはいつ発生するか分からず、またどのくらい続くかが分かりません。
そうすると、ゲームや組み込み機器のように、実際の時間にあわせて確実に動く必要のあるプログラムは作りにくくなります。
例えば、この原稿はNetBeansというJava製IDEを使って書いていますが、ガベージコレクションのログを見ると平均で5ms程度の停止時間がありました。最大では20msです。
IDEのようなツールでは、20ms、つまり0.02秒の停止は気になりません。しかしゲームの場合、最近の標準である1秒間60フレームで動かそうとすると1フレームは16msです。20msの停止があれば、1フレーム分は処理できずに飛んでしまいます。
ゲームの他に実時間での制約の多い組み込みシステムでもJavaは避けられます。また、大量のメモリを使うWebサービスでは停止時間が0.1秒になることもあり、実際の運用で問題になることがあります。
Javaには複数のガベージコレクション実装が用意されていています。標準ではG1GCという実装が使われますが、ZGCという実装を使うと停止時間を短くすることができます。
試しにZGCを指定してNetBeansを動かすと、一番長い停止時間でも0.028msでした。G1GCの場合は20msの停止時間がありましたから、つまり、停止時間が1/1000近くになっているということです。
これであれば、ゲームの実装にも問題なさそうです。ただし、ZGCはCPU能力を多く使って停止時間を短くする方針なので、どんな場合でも使えるものでもありません。停止時間を気にしないのであれば、標準のG1GCの方がいいでしょう。Webサービスで停止時間を短くしたい場合にはZGCが向いています。
ちなみに、現在のゲームの開発ではUnityやUnreal Engineといった定番のゲーム開発環境が高機能で、その点でJavaによるゲーム開発は現実的ではありません。
環境設定が面倒
Javaの入門書では、JAVA_HOMEやPATHなどの環境変数の設定が必要と説明されていることがあります。そのため、Javaでは環境設定が面倒という印象がもたれることがありますが、これは後で説明するディストリビューションによって違います。
筆者が確認した限りではOracle OpenJDK以外のディストリビューションでインストーラを使えば、環境変数PATHの設定は不要でした。Oracle JDKではJAVA_HOMEの設定が必要ですが、Tomcatなどアプリケーションサーバーを単体で起動する場合以外は不要です。Eclipse TemurinなどのディストリビューションのインストーラではJAVA_HOMEも設定してくれます。
Javaの開発体制
Java自体がどのように開発されているか見ておきましょう。
OpenJDK
JavaはOpenJDKというコミュニティーでオープンソースとして開発されています。OpenJDKはOracle社を中心として、AmazonやRed Hat、SAP、Googleなどが開発に参加しています。日本企業では、NTTデータや富士通が参加しています。
OpenJDK公式サイトhttps://openjdk.org/
開発はGitHub上で行われています。
GitHub上のOpenJDK開発ページhttps://github.com/openjdk/jdk
リリース周期とLTS
Javaの新しいバージョンは年2回、3月と9月にリリースされます。だいたい春分の日と秋分の日の前後になっています。原稿執筆時点で一番近いのは、2025年3月18日にリリースされたJava 24です。
ただ、半年ごとのリリースに合わせて利用中のJavaのバージョンを上げていくのは現実的ではありません。そこで、4バージョン2年ごとにLTS(Long Term Support)として長期のメンテナンスが行われるバージョンが設定されています。
執筆時点で最新のLTSはJava 21で、次のLTSは2025年9月にリリースされるJava 25になる見込みです。他にはJava 8、11、17がLTSになっています。
実際に利用する場合は、こういったLTSのバージョンを利用することが無難です。
JDKディストリビューション
OpenJDKはJavaの開発のみを行うコミュニティーで、Java環境の配布までは行っていません。もちろん、評価用に近い形での配布はありますが、サポート期間が次のバージョンが出るまでの半年と短いため、実際の使用には向きません。
そこで、ある程度のサポート期間をもったディストリビューションを企業やコミュニティーが提供しています。
Oracle JDK
一番有名なのはOracle JDKでしょう。商用利用が有償の時期もありましたが、Java 21以降はNFTCというライセンスで商用でも無償で使えるようになっています。
ただし、LTSバージョンでも次のLTSが出たあと1年間すると、OTNライセンスとして商用は有償のライセンスになります。またOTNライセンスでは個人利用でもサーバーで利用してWebサービスを提供する場合は有償になります。
Oracle JDKhttps://www.oracle.com/java/technologies/downloads/
Oracle OpenJDK
Oracleは、OpenJDKのビルドも提供しています。こちらはGPL v2 with classpath exceptionというライセンスになっています。このライセンスは、OpenJDK自体の変更をしなければ特にライセンスを気にすることなく使うことができます。Oracle JDK以外のディストリビューションは、基本的にはこのライセンスを引き継ぎます。
ただし、Oracle OpenJDKにはLTSの設定がなく、次のバージョンが出るとメンテナンスのビルドは提供されなくなります。
Oracle OpenJDKhttps://jdk.java.net/23/
Eclipse Temurin
Eclipse TemurinはAdoptiumというグループが提供するディストリビューションです。Adoptiumワーキンググループには、GoogleやMicrosoft、Red Hatなどの企業が参加しています。
サポート期間もLTSでは最低6年程度用意されており、使いやすいディストリビューションです。
Eclipse Temurinhttps://adoptium.net/
どのディストリビューションを選べばいい?
無難なディストリビューションはEclipse Temurinです。特にこだわりがなければ、Eclipse Temurinを使うのがいいでしょう。Google CloudもEclipse Temurinを採用しています。
Red Hat Linuxを使う場合などプラットフォームにJavaのディストリビューションが付属する場合はそれを使いましょう。また、クラウドベンダーはAmazon CorrettoやMicrosoft build of OpenJDKなど、それぞれJDKディストリビューションを持っています。クラウドを使う場合はそのようなディストリビューションを使いましょう。
Oracle JDKは無償で使えるNFTCライセンスが実質3年程度で、それ以降は有償のOTNライセンスが必要になるため、無償で使いたい場合には避けたほうがいいでしょう。追加のサポートが用意されているため、商用で長期間同じバージョンを利用したい場合には選択肢になります。
Javaのエディション
Javaには、基本になるJava SE、サーバーサイド開発用のJava EE、組み込み向けのJava MEの三つのエディションがありましたが、現在は実質Java SEだけになっています。
Java SEは今でも基本
Java SEはJavaの基本となるエディションで、コンパイラやデバッガなどの開発ツールやJava標準API、Java VMを含んでいます。JDKは現在では実質的にJava SEしか残っていないため、JavaといえばJava SEを指すという状況になっています。
Java EEはJakarta EEへ
Java EEは企業向けのライブラリをまとめたエディションで、Webアプリケーションのサポートも含まれます。ライブラリであるため、実行にはJava SEが必要です。
Java EEは企業向けとして大きなコンピュータで動く重厚な仕組みを目指していました。しかし、2010年以降にクラウドやマイクロサービスなどで小さなコンテナを多数並べて動かすようになると、世の中の需要に合わなくなり、開発も停滞しました。そこで、Oracleに対してJava EEの開発を進めるよう促すJavaガーディアンズが2016年に誕生し、Java EEはEclipse財団に移管され、2018年にJakarta EEとして再出発しています。
Java EEが停滞してる間に、JavaでのWebアプリケーションの開発ではSpring Bootが事実上の標準になってきています。
また、マイクロサービスにむけた仕様としてMicroProfileも始まり、監視や耐障害性など多数のサーバーを連携するために必要になる機能もまとめられています。
Java MEは存在感をなくしAndroidが台頭
Java MEは組み込み用の小さな実行環境と、Java SEから抜粋したライブラリです。2000年ごろにはいわゆるガラケーに採用されるなど、携帯電話でのアプリケーションに多く使われていました。
しかし、2008年にAndroidが現れて以降は、急激にシェアを落としていきました。これは、単にAndroidが代替として現れただけではなく、Java MEが想定していた機器がこのころには小さすぎたため需要に沿わなくなっていたこともあると思います。
Androidの元になったのはJava SEのオープンソース実装を目指したApache Harmonyです。そこからJava標準APIを一部とりだし独自APIを加えたものをライブラリとして、JavaバイトコードではなくDalvikコードを動かすVMを用意し、それらをLinuxに載せたのがAndroidだといえます。
Androidは、Java言語とJava標準APIの一部を使うものの、JavaバイトコードではなくDalvikコードを実行します。そのため「AndroidアプリはJavaで開発する」は正しくても、「AndroidではJavaが動く」は正しいとは言えません。最近ではAndroidアプリをKotlinという別の言語で書くことが広まってきており、開発でもJavaを使う機会が減っています。
Javaの学習
Javaの学習には、Javaがどういうものか試したいというレベルから、Javaについて詳細まで突き詰めたいというレベルまであると思いますが、ここでは、求人に採用されて実務に使えることを目的とした学習について説明していきます。
Javaでは多くの入門書が出版されていますが、その扱う範囲はそれぞれ違います。筆者は、実務に使えることを目的とした書籍「プロになるJava」を共著で書いているため、この本を読みましょうと言いたいところです。
プロになるJava 技術評論社 公式サイトhttps://gihyo.jp/book/2022/978-4-297-12685-8
「プロになるJava」以外に1冊挙げるとすれば「新わかりやすいJava入門編第3版」です。この本は「プロになるJava」に近い構成になっています。こちらの本のほうがJava言語に関する説明が詳しいと思います。
新わかりやすいJava入門編第3版https://www.shuwasystem.co.jp/book/9784798067759.html
とはいえ、他の本で勉強する場合の指針を挙げておきます。Javaの学習では、2000年ごろの常識が更新されずにそのまま残って時代に合わなくなっているものも多いため、現代の開発にあわせるための指針になっています。
「ラムダ式」が扱われている本を選ぶ
Java 8から関数型への対応としてラムダ式という機能が導入されました。ラムダ式は実際の開発で頻繁に扱うため、知らずに実務を行うのは難しいです。
ところが、多くの入門書でラムダ式の解説がされていません。ラムダ式が扱われていないということは、実際のプログラミングで必要になる要素をうまく解説できていないことでもあるため、実務でのプログラミングを目的とする場合には避けましょう。
統合開発環境(IDE)を使う
実際の開発では、統合開発環境(IDE)を使って効率よく開発を進めます。学習時もIDEを使って引っかかりをなくすことをお勧めします。IDEを使うと、構文エラーをその場で表示してくれるため、入力ミスを減らすことができます。
学習時には入力ミスも多いため、IDEを使わない場合、多くの時間が入力間違いを探すことに費やされてしまいます。IDEを使うことで、入力の確実さのトレーニングではなく、プログラミング学習に集中することができます。
入力の間違いを探すことで文法を覚えるということも確かにありますが、それよりも、たくさんのプログラムを動かすことがプログラミング学習には大切です。
「プロになるJava」ではIntelliJ IDEA、「新わかりやすいJava」ではEclipse、書籍「独習Java」ではVS CodeがIDEとして使われています。これら三つのIDEがJavaでよく使われるIDEです。
オブジェクト指向を気にしない
Javaの勉強を始めるとオブジェクト指向が重要という言葉を目にしますが、「Java言語の特徴」に書いたように、Webアプリケーションを前提とした現在の開発ではオブジェクト指向の重要性は薄いです。
新しめの言語では、Go言語やRust言語のようにオブジェクト指向をあえて取り入れない言語もあり、またそのような言語の採用が増えています。
Javaでも関数型の機能が取り込まれているので、オブジェクト指向にこだわる必要はありません。
ただ、Javaはもともとオブジェクト指向を基盤に設計されているため、ある程度の知識は必要になりますが、記述に必要な範囲で理解できれば十分です。
とはいえ、多くの本にオブジェクト指向が重要だと書かれています。これは「昔の常識がいまも更新されずに残っているんだな」くらいの気持ちで勉強するほうがいいと思います。
「オブジェクト指向が分からない」という声も聞きますが、「オブジェクト指向が大事だと言われてるけど使いどころが分からない」の略であることが多いです。実際に使いどころがあまりないので無理もありません。本当にオブジェクト指向が便利なところでは「なるほどオブジェクト指向は便利だな」と思うはずです。
オブジェクト指向が便利になる目安を、少し難しい記述になりますが書いておくと「状態遷移を共通化して実際の操作だけそれぞれ実装したい」という場合です。例えばOpenとClosedという状態があって、接続をすればOpenに、切断すればClosedにという状態遷移が共通で、しかし実際の接続や切断の処理は個別という場合です。
標準ライブラリでは、InputStreamで共通の状態遷移を管理して、実際にはFileInputStreamやZipInputStreamでそれぞれの処理を実装するといったものがあります。
逆に、Webアプリケーションや業務システムでは状態遷移の共通化が必要になる場面が少ないので、オブジェクト指向の必要性が薄いということになります。
サーブレットJSPを避ける
JavaでWebアプリケーションの開発と言えばサーブレットJSPが挙げられます。しかし、現在はSpring Bootが主流になっているため、サーブレットの知識はほとんど必要ありません。
サーブレットの学習では、サーブレットを使ったプログラムの書き方の他に、Tomcatというサーバーの起動やそこへのプログラムの配備という手順も必要になります。この手順は煩雑で、学習の効率が悪くなります。また、そうした手順の知識を使う機会もほとんどなくなっています。
習得が必要なのはWebアプリケーションの開発なのに、サーブレットの扱い方で時間が消費されてしまい、肝心のWebアプリケーションはよく分からないということにもなります。なるべくSpring Bootで学習を進めるほうがいいと思います。
「プロになるJava」ではSpring Bootを使ってWebアプリケーションの解説を行っています。「新わかりやすいJava」ではQuarkusというフレームワークを使ってWebアプリケーションの解説が行われます。Quarkusもプログラムの書き方はSpring Bootとあまり変わらないので、Spring Bootへの移行もすんなりできると思います。サーブレットを使うことが分かっている場合にだけ、サーブレットでのWebアプリケーション開発の勉強をしてください。
AIを活用する
Javaは世界的に広く使われてソースコードがネット上に多数置かれているため、ChatGPTに代表されるAIもJavaに詳しいです。分からないことはどんどんAIに質問しましょう。
「Javaの継承のサンプルを作って解説して」「Javaの例外の確認用4択問題を作って。答えは教えないで」などと依頼すればサンプルや確認問題を作ってくれます。
ChatGPT画面https://chatgpt.com/
Javaの資格
Javaは大規模業務システムでよく使われています。大規模業務システムの開発では、数百人の開発者が集められます。そうした規模感だと、開発者一人一人を選別する時間的余裕がないため、資格の有無が選考に有利になったりします。
学習の目安として、資格取得を目指すのもいいと思います。代表的な資格を二つあげておきます。
Oracle Certified Java Programmer(OCJP)
Javaの資格として代表的なのが、Oracleが行っているOracle Certified Java Programmer(OCJP)です。
OCJPはBronze、Silver、Goldに分かれています。現在Java 8、11、17に対応しています。BronzeはJava 11、17共通ですが、Silver、GoldはJava 11、17それぞれに分かれています。
OCJPhttps://www.oracle.com/jp/education/certification/certifications-list/#middleware
基本情報技術者試験
基本情報技術者試験は、ソフトウエア開発者の基本的な知識や技能を確認するための国家試験です。
Java限定ではありませんが、ソフトウエア開発者に必要な知識が広く出題されるので、有用な試験です。プログラミング言語としてJavaを選択できるので、Javaの知識確認もできます。
試験を受けないとしても、この範囲の知識は持っておいたほうがいいです。
基本情報技術者試験https://www.ipa.go.jp/shiken/kubun/fe.html
Javaのコミュニティー
Javaの学習や利用では、やはりJavaを利用している仲間がいれば心強いものです。コミュニティーの主催するイベントで知り合いを作ると、Javaの勉強のはげみになり、また利用時にも情報交換がしやすくなります。
日本では、日本Javaユーザーグループ(JJUG:ジェイジャグ)が代表的なJavaコミュニティーです。
日本Javaユーザーグループ(JJUG:ジェイジャグ)https://www.java-users.jp/
JJUGでは毎月ナイトセミナーを行い、春と秋にはJJUG CCCというイベントを行っています。
こういったイベントはJavaに詳しい人が集まると思うかもしれませんが、ある年のアンケートでは、初めての参加が半数でした。開催場所は東京になりますが、気軽に参加してみてください。
Javaは今後も使われるのか
ここまで、Javaに関する事柄をまとめてきました。最後に、これからもJavaが使われ続けるかをまとめて、締めにしたいと思います。
結論から先に言えば、Javaは今後も使い続けられます。
ソフトウエア開発技術の安定
まず、ソフトウエアを開発するための技術がすでに出そろっていて、今後は大きな変化がなさそうということが挙げられます。「オブジェクト指向を気にしない」の項で新しめの言語としてGoとRustを挙げましたが、これらは2009年と2010年のリリースで、すでに15年が経っています。広く使われている言語の中で最も新しい言語はiOSアプリを開発する際に使われるSwiftですが、これも2014年の発表です。
それ以降は目立つような新しい言語は出てきていません。プログラミング言語以外でもソフトウエア開発関連での新しい技術というのはこの10年くらい目立ったものが出てきていません。これはソフトウェア開発技術が安定したことを表します。
そのため、現状で広く使われているJavaやC、C++、C#、JavaScript(TypeScript)、Pythonといった言語は、今後もそのまま使われ続けるでしょう。
業務システムでの選択肢が少ない
大規模業務システムを組めるような言語というのは、現実的にJavaかC#のどちらかかしかありません。これらの言語は、企業システムが止まらないように今まで多くのコストをかけて品質が高められてきました。トラブルが起きた時のサポート体制も整っています。
今後、他の言語が、同様のコストをかけて企業システムに求められるレベルまで品質を高めるかというと、それは考えにくいです。品質が高まらなければサポート体制も整えにくいです。Javaは今後も企業システムを構築するための主流の言語になり続けていくでしょう。
AIの得意言語である
AIが得意とする言語であることも、今後使われる理由の一つです。Javaは長い期間に渡って広く使われていたため、すでに多くのソースコードが存在しています。AIは、存在するソースコードを元に学習を進めるため、コード量の多いJavaはAIが持つ知識も必然的に多くなります。AIによるソフトウエア開発が今後さらに広がったときに、Javaで開発するとAIが生成したソフトウエアの品質が高いということもあり得るでしょう。
新機能導入が今でも進められている
最後に、Javaは他の言語に比べて関数型への対応が遅く、不便なところも残されているため、その遅れを取り戻すかのように今でも新機能導入が活発に進められていることがあげられます。
まだまだこれからJavaは良くなっていきます。開発が活発であれば、注目もされるため、Javaはまだしばらく話題にのぼることが多いと思います。
いろいろなJavaの噂を聞いたことがある方も多いかと思いますが、少し見方も変わったのではないでしょうか。これからも変わっていくJavaを試してみてください。
書籍紹介
プロになるJava
―仕事で必要なプログラミングの知識がゼロから身につく最高の指南書
出版社:技術評論社
発売日:2022/3/19
定価:3,278円(税込)
>>>詳細・購入はこちら
執筆/きしだ なおき(@kis)
協力/LINEヤフー