1.1 Javaの概要（学ぶべき理由、歴史、JVM、言語特性など）～Java Basic編

### はじめに

#### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。
様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また以下のような書籍も執筆しています。
* [「マスタリング Java EE 5」（2007年）](https://amzn.asia/d/j0txqK5)
* [「アプリケーションアーキテクチャ設計パターン」（2017年）](https://amzn.asia/d/9avaCyF)

いずれも**Java EE**（**Jakarta EE**）を中心にした企業システム開発のための書籍です。中でも [「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)は、（Javaに限定されない）比較的普遍的なテーマを扱っており、内容的にはまだまだ陳腐化していないため、興味のある方は是非手に取っていただけると幸いです（中級者向け）。

#### Udemy講座のご紹介

この記事の内容は、私が講師を務めるUdemy講座『**Java Basic編**』の一部の範囲をカバーしたものです。『**Java Basic編**』はこちらの[**リンク**](https://www.udemy.com/course/learn-java-se-basic/?referralCode=594C958456356851C97C)から購入できます（セールス対象外のためいつも同じ価格）。また**定価の約30%OFFで購入可能なクーポン**をQiita内で定期的に発行していますので、興味のある方は、ぜひ私の他の記事をチェックしてみてください。

この講座は、以下のような皆様にお薦めします。
* Javaの言語仕様や文法を正しく理解すると同時に、現場での実践的なスキル習得を目指している方
* 新卒でIT企業に入社、またはIT部門に配属になった、新米システムエンジニアの方
* 長年IT部門で活躍されてきた中堅層の方で、学び直し（リスキル）に挑戦しようとしている方
* 今後、フリーランスエンジニアとしてのキャリアを検討している方
* 「**Chat GPT**」のエンジニアリングへの活用に興味のある方
* 「**Oracle認定Javaプログラマ**」の資格取得を目指している方
* IT企業やIT部門の教育研修部門において、新人研修やリスキルのためのオンライン教材をお探しの方

#### この記事を含むシリーズ全体像

この記事はJava SEの一部の機能・仕様を取り上げたものですが、一連のシリーズになっており、**シリーズ全体でJava SEを網羅**しています。また認定資格である「**Oracle認定Javaプログラマ**」（Silver、Gold）の範囲もカバーしています。シリーズの全体像および「Oracle認定Javaプログラマ」の範囲との対応関係については、以下を参照ください。

https://qiita.com/KenyaSaitoh/items/4711a078a851510bc4da

## 1.1 Javaの概要

### チャプターの概要

このチャプターでは、Javaを学ぶべき理由や、今日に至るまでの歴史、そしてプログラミング言語としての特性などについて学びます。

### 1.1.1 なぜJavaを学ぶべきなのか

#### Javaとは

Javaとは、プラットフォーム非依存の本格的なオブジェクト指向型のプログラミング言語です。「Java」という言い方をした場合、狭義ではプログラミング言語としてのJavaを指しますが、広い意味では、Javaプログラムの開発環境および実行環境や、言語本体に同梱されたクラスライブラリが含まれます。
Javaは1995年にSun Microsystems社によって発表されて以来、今日に至るまで長い歴史があります。言語としては既に成熟した領域に達していますが、その一方で現在でもバージョンアップのたびに新しい機能が追加されており、まだまだ進化を続けています。

#### なぜJavaを学ぶべきなのか

Javaを学ぶべき理由には、以下のような点があります。

* 人気の高いプログラミング言語である点
* オープンな技術である点
* 学びやすいプログラミング言語である点
* 様々なシーンで広く活用されている点

#### 人気の高いプログラミング言語である点

まず一点目は、様々なプログラミング言語の中でも特に人気がある言語である、という点です。
このグラフは、TIOBE Software社が発表しているプログラミング言語の人気ランキングです。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/1ac9d66f-2c52-8b15-571a-14cb170d34d9.png)

直近の20年間の推移を見ると、安定して上位にランクインしていることが分かります。このようにJavaは世界中の開発者に支持されている言語です。これは、Java開発者がシステム開発の市場において常に一定の需要がある、ということを表しています。

#### オープンな技術である点

JavaはLinuxなどと同じように、特定のベンダーに独占的に支配されることのない、オープンな技術です。たとえばJavaの仕様は「Java Community Process」という委員会によって、様々な企業やコミュニティの意見を取り込んだ上で、決定されます。また著作権こそOracle社に帰属していますが、オープンソースのソフトウェアとして、誰でも無償で利用することができます。
このようにJavaは、特定のベンダーの影響を受けにくいスタンダードな技術のため、習得したスキルは長きに渡って活用することができるでしょう。

#### 学びやすいプログラミング言語である点

Javaはシンプルで親しみやすく、初学者であっても学びやすいプログラミング言語です。
Javaは本格的なオブジェクト指向型の言語でありながら、旧来からある手続き型言語の特性を引き継いでいたり、関数型のようにモダンなパラダイム（考え方や記述方法）がサポートされていたりします。そのためJavaを習得することにより、論理的な思考力はもちろん、プログラミング言語を問わずに求められる普遍的なコーディング技法を身に付けることができます。Javaを出発点とすれば、将来的にそのほかのプログラミング言語にも、スムーズに移行することが可能です。
そもそもJavaは、歴史的な経緯からC言語（またはC++言語）に似た構文や文法を持っている、という特徴があります。Javaの方が高水準な言語（ハードウェアの制御を必要としないという意味）として設計されているため、C言語では比較的難解とされてきたポインタの仕組みは、Javaでは撤廃されています。C言語の経験者であればなおさら、Java習得へのハードルは、必ずしも高くはないはずです。

#### 様々なシーンで広く活用されている点

Oracle社によると、今日Javaのアプリケーションは30億台以上のデバイスで稼働しているそうですが、Javaは企業活動や日常生活において、様々なシーンで活用されています。
特に企業における分散系システムの分野では、Javaは最も採用されているプログラミング言語です。詳細は後述しますが、堅牢性や安全性に強みのある言語のため、高い信頼性が求められるミッションクリティカルなシステムの開発では、第一の選択肢になるでしょう。
Javaはインターネットの普及とともに発展してきた言語でもあり、Web技術との親和性が高いという特徴があります。本コースでは取り上げませんが、WebサービスやWebアプリケーション開発の分野でも、Javaは広く浸透しています。
スマートフォンおよびタブレットのプラットフォームの1つであるAndroidにおいても、標準的な開発言語として採用されています。
家電や電子機器に組み込むソフトウェアのためのプラットフォームとしても、広く活用されています。

### 1.1.2 Javaの歴史

#### Javaの誕生

Javaは、Sun Microsystems社のジェームズ・ゴスリン氏らによって生み出されたプログラミング言語です。当初は電子レンジやリモコンなど、家電や電子機器に組み込むソフトウェア開発のための言語として登場しましたが、その後改良が重ねられ、1995年に「Java」という名称で発表されました。
Javaはプラットフォームに依存しない言語として、インターネットの進展とともに世の中に広まっていきました。特にWebブラウザ上で動作する「アプレット」と呼ばれるアプリケーションを開発するための言語として、一定の支持を獲得しました。

#### Javaの発展

2000年代に入ると、企業システム向けのエディションである「J2EE」が登場し、Javaは本格的な企業システム向けのプログラミング言語として普及するようになります。この時期、UNIXワークステーションによるクライアント・サーバーシステムから、Javaによって開発されたWebアプリケーション（PCに搭載されたWebブラウザで動作するアプリケーション）への移行も盛んに行われました。Javaは特定のベンダー製品に依存しない、オープン・スタンダードな技術であるという点も、普及を後押しする要因の1つになりました。
プログラミング言語としては、2004年に登場したJava 5では、総称型、列挙型、アノテーションなど、今日の言語仕様のベースともなるような大幅な機能追加が行われました。また2014年に登場したJava 8では、ラムダ式として関数型言語のパラダイムが取り入れられるなど、言語として更なる進化を遂げました。
なお2009年Sun Microsystems社が買収されたことにより、Javaの著作権はOracle社に移管されました。ただし現在のJavaは、Oracle社によるJavaだけではありません。Oracle社からの提供を受けて、オープンソース版のJavaも登場し、コミュニティーや様々な企業によって開発が行われています。
Javaはその後もバージョンアップを重ねており、2022年6月時点の最新バージョンは18です。昨今でも他のプログラミング言語からのインスピレーションを受ける形で、数多くの機能拡張がなされており、プログラミング言語としての完成度はますます高くなっています。

### 1.1.3 Java Virtual Machineの仕組み

#### プログラムが動作する仕組み

ここではJavaに限らない一般的な話として、プログラムが動作する仕組みを説明します。
プログラムの処理内容を、人間が理解しやすい形式で記述された文字列情報を、ソースコードと呼びます。ソースコードは、何らかのプログラミング言語によって記述され、テキストファイル（ソースファイル）として保存されます。プログラムを実行するためには、ソースコードを機械語（実行環境のOSやCPUが理解できる言語）に翻訳する必要があります。このように、ソースコードを機械語に翻訳するプロセスのことをコンパイルと呼びます。プログラムは、コンパイルされた機械語を実行することによって動作します。

【図1-1-1】プログラムが動作する仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/4a49e8be-3a8b-7597-b854-b399874f97d5.png)

#### Java Virtual Machineとは

前述したようにJavaはプラットフォーム非依存の言語ですが、これを実現するための仕組みがJava Virtual Machine（以降JVM）です。JVMとは、LinuxやWindowsといった様々なOSに対応したJavaプログラムの仮想的な実行環境であり、Javaの中核とも言える仕組みです。
Javaは、C言語などと同じように、コンパイル型言語の一種です。コンパイル型言語では、ソースコードは「コンパイラ」と呼ばれるツールによって機械語に一括して翻訳されます。そして生成されたバイナリファイルを実行することで、プログラムが動作します。
つまりLinuxならばLinux用のコンパイルが必要であり、Linuxコンパイラによって生成されたバイナリファイルは、Windows上で実行することはできません。

【図1-1-2】一般的なコンパイル型言語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/ad9a6f7f-b065-c1b3-92ed-63479c441e06.png)

その点Javaのソースコード（javaファイル）は、機械語ではなく「バイトコード」という中間コードにコンパイルされ、コンパイルされたバイナリファイル（クラスファイル）は、JVM上で実行されます。JVMの仕組みによって、Javaのソースコードはどのような環境でコンパイルしても、OSを選ばずに実行することができます。
たとえばWindows上でソースコードをコンパイルして生成されたバイナリファイルは、JVMさえあれば、macOS上でもLinux上でも実行することができるのです。

【図1-1-3】JavaとJVM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/d048ad2a-7b28-45f0-559e-571e98e6277a.png)
このようにJavaは、JVMの恩恵によって高いポータビリティ（移植性）を実現しています。またこのようなJavaの特徴は、「一度書いたらどこでも動く」という意味で"Write Once, Run Anywhere"と言われています。

#### メモリ管理

JVMには、Javaプログラムのメモリを管理する機構が備わっています。Javaプログラム（厳密には生成されたインスタンス）は、JVMによって確保された「ヒープ領域」と呼ばれるメモリ空間に展開されます。そして確保されたメモリ空間は、不要になった時点でJVMによって自動的に解放されます。この仕組みはガベージコレクションと呼ばれています。
従来の言語（C言語など）では、メモリの確保や解放はプログラムの中で明示的に行う必要があったため、メモリに起因した不具合が発生しやすい、という課題がありました。その点Javaは、ガベージコレクションにより、メモリに起因した不具合が発生しにくいという利点があります。

### 1.1.4 Javaの言語特性 

#### Javaの言語特性

Java言語には、以下のような特性があります。

* オブジェクト指向型言語であること
* コンパイル型言語であること
* 静的型付け言語であること
* 堅牢で安全な言語であること
* 高度な機能を持つ多様なAPIが提供されること
* 豊富な実践的クラスライブラリがあること

次項以降で順番に説明します。

#### オブジェクト指向型言語であること

Javaはオブジェクト指向型のプログラミング言語の一種ですが、ここではまずオブジェクト指向型言語よりも以前からある手続き型のプログラミング言語について説明します。
手続き型プログラミングとは、複数の命令を1つの手続きとして束ね、手続きの流れに従って上から順に命令を記述するプログラミング技法です。
手続き型プログラミングでは、手続きとデータは分離されます。手続きの呼び名は言語によってまちまちですが「メソッド」や「プロシージャ」などと呼ばれます。またデータは、複数の属性を意味のある単位に束ねて「構造体」の中に記述します。
手続き型プログラミングは、業務仕様に従って命令を順に記述するシンプルな技法のため、分かりやすく技術的な難易度が低い点が利点ですが、その反面、俗に言う「スパゲッティコード」（処理の流れや構造が把握しにくい、見通しの悪いコード）が生じたり、再利用が困難な「似て非なるコード」が多くなったりする傾向があるため、拡張性や保守性の観点ではオブジェクト指向型の方に優位性があると言われています。
オブジェクト指向型プログラミングとは、手続き型では分離されていた手続きとデータを「クラス」という概念によって統合し、クラスとクラスを相互に連携させることによって処理を構築するプログラミング技法です。オブジェクト指向型言語は、手続き型と比べると学習コストが高くなる傾向がありますが、近年では手続き型の課題を解消するプログラミング技法として広く普及しています。
Javaによるオブジェクト指向型プログラミングについては、チャプター2.1以降で詳しく解説していきます。

#### コンパイル型言語であること

プログラミング言語は大きく、コンパイル型言語と、インタープリタ型言語に分類されます。Javaはコンパイル型言語に分類されますが、その他のコンパイル型言語にC言語などがあります。また代表的なインタープリタ型言語に、JavaScriptやPythonがあります。
コンパイル型言語とは前述したように、「コンパイラ」と呼ばれるツールによってソースコードを一括して機械語に翻訳する言語です。コンパイル型言語では、コンパイラによって文法や変数の型がチェックされるため、堅牢性が高い開発が可能です。特に数多くのライブラリを利用する大規模なアプリケーション開発では、その真価が発揮されます。また事前にコンパイラによって機械語に翻訳されるため、プログラム実行時の処理性能にも優位性があります。
一方でインタープリタ型言語とは、ソースコードを一命令ずつ解釈し、機械語に翻訳しながら実行するプログラミング言語です。インタープリタ型言語では、厳格な型チェックが行われないため、機動性や柔軟性の面では優位です。ただしプログラム実行時に機械語への翻訳が行われるため、実行時の処理性能はコンパイル型言語に劣後します。

【図1-1-4】コンパイル言語とインタープリタ言語の比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/e9b69a14-ad9d-9355-9966-b4b31a088701.png)

#### 静的型付け言語であること

プログラミング言語は大きく、静的型付け言語と動的型付け言語に分類されます。静的型付け言語とは、変数の型（文字列型や数値型など）を明示的に宣言する必要があるプログラミング言語です。プログラム実行前、コンパイルの時点で、変数の型がチェックされます。このような静的型付け言語の特徴を、型安全（タイプセーフ）と言います。一方で動的型付け言語とは、変数の型を宣言する必要がないプログラミング言語で、プログラム実行時にはじめて変数の型がチェックされます。
Javaは、変数の型を明示的に宣言する必要のある言語、すなわち、静的型付け言語に分類されます。
なお必然的に、静的型付け言語の大半はコンパイル型になり、動的型付け言語はインタープリタ型になります。

#### 堅牢で安全な言語であること

Javaは、堅牢性や安全性が高いプログラミング言語として設計されており、信頼性の高いシステム構築を可能にしています。Javaの堅牢性や安全性には、次のような観点があります。
* Javaはインターネット環境での利用が前提のプログラミング言語のため、数多くのセキュリティ上の脆弱性対策が施されています。
* Javaは前述したようにコンパイル型言語であり、文法や変数の型がコンパイラによってチェックされます。
* 言語仕様として直接的なメモリアクセスは不可能であり、またJVMによってメモリ管理は自動化されています。
* 実行時に発生したエラーや例外も、プログラムの中で捕捉し、適切にリカバリー措置を実装することで、予期せぬシステムクラッシュを抑えることができます。

#### 高度な機能を持つ多様なAPIが提供されること

API（アプリケーションプログラミングインタフェース）とは、ミドルウェアやライブラリなどのソフトウェアが、それを利用するアプリケーションに対して提供する外部インタフェースのことです。アプリケーションはAPIを介して、それらの機能を利用することができます。Javaでは、言語本体に同梱されるクラスライブラリが、APIとして提供されています。そしてその中には、ネットワーク通信や並行処理（マルチスレッド）など、様々な高度な機能が含まれています。
Javaによるアプリケーションでは、これらのAPIを呼び出すだけで高度な機能の恩恵を受けることができるのです。

:::note info
APIはAPIでも、HTTPプロトコルによってネットワーク越しに提供されるサービスを、Web APIと呼びます。Webサービスの文脈では、Web APIを単にAPIと呼ぶことがありますが、JavaにおけるAPIとは「クラスライブラリが外部に公開するメソッド」のことを指しますので、両者を混同しないようにしてください。
:::

#### 豊富な実践的クラスライブラリがあること

Javaでは、言語本体とは別に、アプリケーション開発のための実践的なクラスライブラリ（API）がコミュニティやベンダーによって豊富に提供されています。代表的なものに、データベースと接続するためのライブラリや、ログを出力するためのライブラリ、XMLファイルやYAMLファイルにアクセスするためのライブラリなどがあります。
なおこれらの実践的なクラスライブラリについては、同じシリーズの『Java Practical編』（2023年下期にリリース予定）で取り上げる予定です。

### このチャプターで学んだこと

このチャプターでは、以下のことを学びました。

1. Javaには、人気が高い、仕様がオープン、学びやすい、広く活用されている、といった数多くの学ぶべき理由があること。
2. Javaの歴史は古く、プログラミング言語としてまだまだ進化を続けている、ということ。
3. コンパイルの概念や、JVMの基本的な仕組みについて。
4. Javaには、コンパイル型のオブジェクト指向型言語である、堅牢性が高い、言語本体やライブラリに豊富な機能が搭載されている、といった特性があること。