序章 : Java の学習を始めるに当たって
1. はじめに
このドキュメントは Java の言語仕様と API のうち、現在 (Java SE 8) においてよく使用するものをまとめたものです。書籍やインターネットで参照可能な Java の文献を読み進めるために最低限必要と思われる事項について取り上げています。
2. 対象とする読者
このドキュメントは、構造化プログラミングの経験があるプログラマ (経験の多少は問いません) を対象に記述しています。具体的には、以下のいずれかのプログラミング言語の使用経験があることを想定しています。これらの言語の使用経験がなくてもある程度読み進められるように考慮していますが、細かな不明点については各自で調査してください。
- Java (Java SE 6 以降)
- C (ISO C99)
- C++ (ISO C++11)
- JavaScript (ECMA-262 3rd Ed. 以降)
- Python (バージョン 2.x)
- Visual Basic (Visual Basic 6.0)
オブジェクト指向プログラミングに関する知識はなくても構いません。Java におけるオブジェクト指向プログラミングは本文中で触れてゆきます。
オブジェクト指向プログラミングに対する考え方はプログラミング言語によって大きく異なります。例えば C++ と Python はオブジェクト指向プログラミングを強力にサポートしていますが、いずれも Java とは異なるアプローチを採っています。Java のアプローチは C++ のそれに近いものですが、C++ とは全く異なるアプローチを採る Smalltalk からも多くのアイデアを拝借しているため、実際には似て非なるものです。
3. このドキュメントの構成
1 章では、Java の中核となる「クラス」を中心に、Java プログラムの構成要素について見てゆきます。合わせて、Java におけるオブジェクト指向プログラミングの考え方についても述べます。
2 章は簡単な Java プログラミングを通じて Java の開発ツールの使い方についてご紹介します。
3 章は、1 章で触れた「クラス」について詳細に見てゆきます。少し込み入った説明になりますが、Java プログラミングでは欠かすことのできない事柄であるため、確実に理解してください。
4 章および 5 章では、Java プログラムにおける処理の記述 (処理フロー) について紹介します。この章で紹介する内容は他のプログラミング言語にも共通することから、C、C++、JavaScript、Python および Visual Basic の相当する機能についても対比のためにご紹介します。
6 章は「例外処理」と呼ばれるエラー系処理の取り扱い方法について紹介します。例外処理は処理フローからエラー系処理を分離するための有力な方法です。
7 章および 8 章では、クラスの継承やインタフェースの実装といった、オブジェクト指向プログラミングの特徴的な機能について紹介します。3 章の内容を復習しながら読み進めてください。
9 章は配列とコレクションについて取り上げます。実際のプログラミングでは様々なデータ構造とアルゴリズムを駆使する必要があります。幸い、Java SE は標準 API でこれらをサポートしているため、プログラマは API の使い方を覚えるだけでバグの少ないプログラミングを行うことが出来ます。
10 章では「マルチスレッド」について触れます。マルチスレッドは複数の処理を同時並行で実行するための仕組みであり、Java では言語仕様と標準 API の双方でサポートしている重要な機能です。マルチスレッドについて意識しなくても Java のプログラミング自体は可能ですが、後々大きな落とし穴にはまるケースが多く見受けられます。この章を通じて、感覚的な理解だけでも構いませんので、マルチスレッドを意識するようになってください。
11 章では Java におけるファイル操作の基本について学びます。Java は最初のバージョンよりファイル操作の API を用意していましたが、現在ではリニューアルされた新しいファイル操作 API が導入されています。この章では新しい API を使用したファイル操作について紹介してゆきます。
12 章は、Java SE 8 で新たに導入された「ラムダ式」と「Stream API」について紹介します。これらは近年注目を浴びている関数型言語 (OCaml、Haskell など) の影響と、現在の CPU 設計のトレンドから導入された機能です。以前より Java は文法が冗長であるという批判を多く受けていましたが、ラムダ式と Stream API の登場によりそれらが払拭されつつあります。関数型プログラミングは、構造化プログラミング、オブジェクト指向プログラミングのいずれとも全く異なる概念ですが、使い慣れると手放せない機能であるため、勇気を持ってチャレンジしてみてください。
13 章は、Java SE 8 で新たに導入された「Date and Time API」のチュートリアルです。Java SE 7 までの日付の扱いは極めて貧弱でしたが、Java SE 8 の Date and Time API は非常に強力です。Date and Time API は Java SE 8 の標準 API としては最大級の規模ですが、順を追って学んでゆけば比較的容易に習得できます。
14 章では、Java SE の標準 API の中から実務で頻繁に使用するものについて、その使い方を簡単に紹介します。限られたスペースのためすべてを説明することはできませんが、この章を導入部として次のステップへの道標を見つけて欲しいと願っています。
4. Java について
4.1. 概要
4.2. Java のエディションとバージョン
Java は開発ターゲットによっていくつかのエディションに分かれています。また、数年おきにバージョンアップを行っており、言語仕様や API の改善が行われているのも特徴です。
- Java SE : Java の基本となるのは Java SE (Java Platform, Standard Edition) です。このドキュメントでは主に Java SE を中心に見てゆきます。
- Java EE : Java SE をもとに大規模システム向けの各種機能を追加したものが Java EE (Java Platform, Enterprise Edition) です。Java EE は単一のものではなく、Java SE を補完する様々な機能仕様の集合体です。
- Java ME : 携帯電話、情報家電等の組み込み用途を対象とした軽量版が Java ME (Java Platform, Micro Edition) です。Blu-ray プレーヤー/レコーダーで採用されている BD-J も Java ME の一部です。Java ME は軽量さを保ちつつ対象となる機器に最適化するため Java SE/EE とは独立した進化を遂げてきましたが、今後は Java SE と歩調を合わせ、Java SE のサブセットとしての位置づけになる見込みです。
Java SE は登場以来数度の改訂を受けており、バージョンが存在しています。現行の最新かつ公式アップデート (無償アップデート) 対象のバージョンは Java SE 8 のみです。このドキュメントも Java SE 8 の仕様を前提とします。前バージョンとなる Java SE 7 と Java SE 6 は現在 Oracle の有償サポート契約に基づくアップデートのみ提供されています。Java SE 5.0 以前のバージョンはサポート対象外のため使用しないことを推奨します。
バージョン | 内部バージョン | ステータス | 追加された機能など |
---|---|---|---|
Java SE 10 | ??? | 計画中 | (詳細は未定だが大規模なアップデートが実施される見込み) |
Java SE 9 | 1.9 | 開発中 | モジュール化対応 (Project Jigsaw)、JShell ユーティリティなど |
Java SE 8 | 1.8 | 現行・公式アップデート対象 | ラムダ式、Stream API、Date and Time API など |
Java SE 7 | 1.7 | 有償サポートのみ | Project Coin、NIO.2、jcmd ユーティリティなど |
Java SE 6 | 1.6 | 有償サポートのみ | Java SE 5.0 の改良版 |
Java SE 5.0 | 1.5 | サポート終了 | ジェネリクス (総称型)、列挙型、拡張 for 文 など |
J2SE 1.4 | 1.4 | サポート終了 | NIO、正規表現、ログ出力、XML API など |
J2SE 1.3 | 1.3 | サポート終了 | HotSpot VM (現行の Java VM) など |
J2SE 1.2 | 1.2 | サポート終了 | Java Collections Framework など |
JDK 1.1 | 1.1 | サポート終了 | 国際化対応など (このバージョンから日本語使用可能) |
JDK 1.0 | 1.0 | サポート終了 | 最初のバージョン |
Java SE は登場時 JDK (Java Development Kit) という名称で、バージョン 1.2 で J2SE (Java 2 Platform, Standard Edition) と改称され、さらにバージョン 1.5 で一旦 J2SE 5.0 と改称された後に Java SE 5.0 と再度改称されました。
Java は最初のバージョンから後方互換性を保っており、それが Java のアドバンテージの 1 つでもありました。しかし、近年では Java の機能拡充に伴い、古く使用頻度の低い言語仕様や API の存在が足かせとなっています。そこで Java の開発チームでは、Java SE 9 以降は過去 3 世代までのバージョンをサポートするようにポリシーを変更しました。具体的には、Java SE 9 では Java SE 6 以降でコンパイルされたコードのみがサポートされ、Java SE 5.0 までのコードは Java SE 9 で再コンパイルする必要があります。このポリシー変更から、可能な限り新しいバージョンに合わせてアプリケーション開発を行うのが望ましいと言えるでしょう。
Java EE も同様に数度の改訂を重ねており、バージョンが存在しています。最新のバージョンは Java EE 7 (バージョン 1.7) ですが、Java EE についてはサーバ (Java EE 実行環境) の提供ベンダーごとにサポートポリシーが異なるため、有効なバージョンは一概には言えません。
Java のバージョン | 内部バージョン | ステータス | 補足 |
---|---|---|---|
Java EE 8 | 1.8 | 仕様策定中 | 2016 年 9 月に仕様策定のやり直しを発表 |
Java EE 7 | 1.7 | 現行 | HTML5 対応、JSON 対応、WebSocket、バッチ処理、CDI 強化など |
Java EE 6 | 1.6 | 現行 | RESTful Web サービス (JAX-RS)、Contexts and Dependency Injection (CDI) など |
Java EE 5 | 1.5 | 現行? | 開発生産性の向上 (EoD)、SOAP Web サービスの一新 (JAX-WS)、Java Persistence API (JPA)、JSFの 強化など |
J2EE 1.4 | 1.4 | 黒歴史 | SOAP Web サービス (JAX-RPC)、JavaServer Faces (JSF) など |
J2EE 1.3 | 1.3 | 黒歴史 | XML 操作 API (JAXP)、EJB のバージョンアップなどを実施 |
J2EE 1.2 | 1.2 | 黒歴史 | 最初の Java EE、Servlet/JSP、EJB、JTA、JMS、JavaMail などの仕様の集合体 |
Java EE は登場時 J2EE (Java 2 Platform, Enterprise Edition) という名称で、バージョン 5.0 の時に Java EE 5 と改称されました。Java EE 5 への改称に当たっては、それ以前の J2EE を「黒歴史」化する意味合いが強かったとも言われます。
Java EE では使用頻度の減少した API のプルーニング (削除) が実施されます。プルーニングではまず削除対象となる仕様を予告した後、次のバージョンで実際に削除する手段が採られています。最初のプルーニングは Java EE 6 で 4 機能に対して行われ、これらは既に Java EE 7 から削除されています。Java EE 7 でもプルーニングの対象が決定しています。
新入社員研修でおなじみの JSP (Java Server Pages) も、実は Java EE 7 でプルーニングの候補に挙げられていました。最終的に対象から外されましたが、将来の Java EE で再びプルーニングの候補となる可能性が高いため、現在では JSP の学習はお勧めできません。
4.3. 最新の Java をお勧めする理由
アプリケーション開発の現場ではいまだに古い Java が主流ですが、Java 自身が進化している現在では古い Java を使用する意味はほとんどありません。このドキュメントでは Java SE 8 の使用を推奨します。
まず、Java SE 8 の旧バージョンに対するアドバンテージを挙げてみます。
- Java SE 8 の Java VM は実行効率が非常に高い。また、Java SE 8 のコンパイラは非常に進歩しており、既存のソースコードを Java SE 8 で再コンパイルするだけでもパフォーマンスの大幅な向上が見込める。
- ラムダ式と Stream API によりデータ処理が劇的に改善される。特に Stream API は集合演算をサポートするため、従来 SQL 頼みだった処理をメモリ上で高速に実行することができる。また、ラムダ式導入の副次的効果として、Java のデータ型に対する扱いが改善されている。
- Date and Time API の導入に伴い、日付と時刻の取り扱いが抜本的に改善される。Java SE 7 までの日付・時刻操作は直感的でなく非常に煩雑であったが、Date and Time API により直感的な操作が行えるようになる。
次に、古い Java を使用することによるデメリットを列挙します。ここに挙げた他にも古い Java にはセキュリティホールの存在が判明しているため、必ず最新の Java を使用するようにしましょう。特に J2SE 1.4 以前は言語仕様が古く、将来的に破棄されることも決定しているため、使用すべきではありません。
バージョン | デメリット |
---|---|
Java SE 7 | ジェネリクス (総称型) の省略表記がサポートされているものの、型推論が限定的のため使い勝手に難がある |
Java SE 6 | Java SE 7 で導入されたユーティリティや省略表記が利用できず、ソースコードが煩雑になりがち (Java SE 5.0 以前も同様) |
Java SE 5.0 | 言語仕様と実装に齟齬がある。J2SE 1.4 より遅い。XML API は実装がなく使い物にならない (J2SE 1.4 も同様) |
J2SE 1.4 | ジェネリクス (総称型)、列挙型、拡張 for 文などが使用できない (J2SE 1.3 以前も同様) |
J2SE 1.3 | XML、正規表現、ログ出力などを扱う API がない (J2SE 1.2 以前も同様) |
J2SE 1.2 | Java VM の実行効率が非常に悪い (JDK 1.1 以前も同様) |
JDK 1.1 | Java Collections Framework が使用できない (JDK 1.0 も同様) |
JDK 1.0 | 国際化に対応しておらず、日本語を扱うことができない |
もちろん、Java SE 8 についてもデメリットは存在します。しかし、Java SE 8 は唯一の現行バージョンであること、またいくつかのデメリットは開発中の Java SE 9 と計画中の Java SE 10 にて解消する予定であるため、現時点での仕様と割り切って使用するのが良いと思われます。