Java は 1990 年代前半にサン・マイクロシステムズで開発されたオブジェクト指向プログラミング言語です。プログラミングに興味のある方ならば、Java をまったく知らないという人はほとんどいないと思います。最初期のころはとても遅かった Java ですが、JIT (Just in Time) コンパイラなどの技術により性能は大きく改善され、今では様々な分野で使われるようになりました。
最近は JavaScript, PHP, Perl, Python, Ruby などのスクリプト言語に注目が集まっていますが、JVM (Java 仮想マシン) 上で動作するスクリプト言語も開発されています。有名なところでは Groovy, Nashorn (JavaScript) [*1], Jython (Python), JRuby (Ruby) などがあります。また、関数型言語では Kawa (Scheme) や Clojure などの Lisp 系の言語や、ML のように型推論を行う Scala もあります。
これらのスクリプト言語は Java のライブラリ資産を簡単に利用することができます。また、時間のかかる処理を Java で作成し、それをスクリプト言語から呼び出すことで、プログラムの処理を高速化することもできます。Java の膨大なライブラリ資産を活用できるのは大きなメリットですし、Java とスクリプト言語で役割を分担することで、柔軟なプログラミングが可能になると思われます。
このように、Java はプログラミング言語というよりも、いろいろな言語を実行するためのプラットフォームになりつつあります。もちろん、その中心には Java があるわけで、Java を理解しておくと、他のスクリプト言語を使うときにも役に立つと思います。M.Hiroi は Java に関して初心者にすぎません。このページで簡単なプログラムを作りながら Java を勉強していきたいと思っております。たいしたことはできませんが、よろしければお付き合いくださいませ。
Java の開発環境はいろいろありますが、本ページでは OpenJDK (Open Java Development Kit) を使うことにします。OpenJDK - Wikipedia によると、『OpenJDK (Open Java Development Kit) は、プログラミング言語Javaのフリーかつオープンソースの実装である』とのことです。現時点 (2021 年 2 月) での最新バージョンは OpenJDK 15 ですが、Java の基本を勉強するのが目的であれば、最新バージョンでなくてもかまいません。本ページでは、Ubuntu 18.04 (WSL) でダウンロードできる OpenJDK 11 を使用することにします。
次のコマンドで簡単にインストールすることができます。
sudo apt install openjdk-11-jdk
$ java -version openjdk version "11.0.9.1" 2020-11-04 OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04) OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04, mixed mode, sharing) $ javac -version javac 11.0.9.1
環境変数 (JAVA_HOME など) の設定は、必要になったときに行うことにしましょう。
それではお馴染みの Hello, World! を表示するプログラムを作ってみましょう。次のリストを見てください。
リスト : Hello.java public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); } }
ファイル名は Hello.java とします。拡張子は java で、ファイル名は public 宣言したクラスの名前 Hello と同じにしてください。Java はオブジェクト指向プログラミング言語なので、クラスを定義しないとプログラムを作ることができません。ここで簡単にクラス、インスタンス、メソッドについて説明しておきましょう。
クラスはオブジェクトの設計図にあたるもので、オブジェクトの「雛形」と呼ぶこともあります。このクラスから実体として作り出されるのがインスタンスです。このインスタンスを「オブジェクト」と考えてください。インスタンスを生成する方法は、当然ですがプログラミング言語によって違います。たとえばC++や Java は new を使います。
Java の場合、メソッドはクラスの中で定義します。一般に、メソッドはインスタンスを操作するための関数で、メソッドを呼び出すにはインスタンスが必要になります。これに対し、インスタンスを必要としないメソッドを定義することができます。これをクラスメソッドとかスタティックメソッドといいます。
クラスメソッドはインスタンスがなくても呼び出すことができます。クラス自身を操作する場合や関数のようなメソッドを定義する場合に使います。Java の場合、メソッドの定義に static を付けるとクラスメソッドになります。main はクラスメソッドで、C/C++の main 関数と同様にプログラムの実行は main メソッドから始まります。
main の引数 args にはコマンドラインで与えられた引数が格納されています。System.out.println() はデータを標準出力 (画面) へ出力するメソッドです。
オブジェクト指向についてはあとで詳しく説明しますが、とりあえずプログラムを作るには public 宣言したクラスと main メソッドが必要である、ということを覚えておいてください。
プログラムのコンパイルは javac で行います。シェルで javac Hello.java と入力すると、Hello.java がコンパイルされて Hello.class というファイルが作成されます。
$ javac Hello.java $ ls Hello.* Hello.class Hello.java $ java Hello Hello, World! $
プログラムの実行は java を使います。シェルで java Hello と入力します。クラス Hello のメソッド main が呼び出されて Hello, World! が表示されます。
Java を学習する場合、JDK 9 から導入されたツール JShell (Java Shell) を使うと大変便利です。シェルで jshell を実行すると、メッセージとプロンプトが表示されて、対話モード (REPL : Read-Eval-Print-Loop) で Java を使用することができます。
$ jshell | JShellへようこそ -- バージョン11.0.9.1 | 概要については、次を入力してください: /help intro jshell> /help intro | | intro | ===== | | jshellツールを使用すると、Javaコードを実行して即座に結果を取得できます。 | int x = 8などのJava定義(変数、メソッド、クラスなど)、 | x + xなどのJava式またはJava文を入力したり、 | インポートしたりできます。 | これらのJavaコードの小さなチャンクを「スニペット」と呼びます。 | | また、/listなどの実行する内容を理解および制御できるjshellツール・コマンドも | あります | | コマンドのリストを参照する場合: /help jshell> 1 + 1 $1 ==> 2 jshell>
JShell では、行末のセミコロン (;) を省略することができます。終了する場合は /exit または CTRL-D を入力してください。本ページでは Ubunts 18.04 (WSL) 上で JShell を使って Java (JDK 11) の基本的な機能を説明します。
Windows の場合、プログラムを書くときに Shift JIS 以外の文字コードを使うと、javac でコンパイルエラーになります。
エラー: この文字は、エンコーディングMS932にマップできません
Shift JIS 以外の文字コードを使う場合はオプション -encoding で文字コードを指定してください。たとえば、UTF-8 ならば javac -encoding utf-8 ソースファイル とします。ご注意くださいませ。
Java のプログラムは Java 仮想マシン上で動作するので、JIT (Just in Time) コンパイラなどの技術によりプログラムを高速に実行することができます。その実行速度ですが、拙作のページ Algorithms with Python 再帰定義 の「たらいまわし関数」を使って調べてみました。
リスト : たらいまわし関数 (Java) public class Tarai { static int tak(int x, int y, int z) { if (x <= y) return z; else return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y)); } public static void main(String[] args) { System.out.println(tak(22, 11, 0)); } }
それでは実行結果を示します。tak(22, 11, 0) を計算しました。実行時間は Linux のコマンド time で計測しました。
処理系 | 秒 |
---|---|
Python (ver 3.6.9) | 69.6 |
Lua (ver 5.3.3) | 37.2 |
Ruby (ver 2.5.1p57) | 25.4 |
Gauche (ver 0.9.9) | 25.3 |
ocamlc (ver 4.05.0) | 10.8 |
SBCL (ver 1.4.5) | 6.38 |
LuaJIT (var 2.1.0-β) | 4.02 |
SML/NJ (ver 110.98) | 2.66 |
Julia (ver 1.3.0) | 2.02 |
GHC (ver 8.8.4) | 1.96 |
SBCL (最適化) | 1.57 |
GCC -O2 (ver 7.4.0) | 1.23 |
Java (ver 11.0.9.1) | 1.10 |
ocamlopt (ver 4.05.0) | 0.97 |
Java は GCC や OCaml と同程度の速度をたたき出しています。その速さにちょっと驚きました。Java はとても優れた処理系だと改めて実感しました。
『お気楽 Java プログラミング入門』と『続・お気楽 Java プログラミング入門』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Java プログラミング入門』と『続・お気楽 Java プログラミング入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
なお、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。
Java DE Puzzle は、パズルをメインに Java でプログラミングを楽しみましょう、というお気楽なページです。せっかく Java でプログラミングするのですから、パズルの解法プログラムだけではなく、パズルゲームや思考ゲームなど、いろいろなプログラム(アプレット)を作ってみたいと思います。もっとも、M.Hiroi は Java に関しては初心者にすぎません。たいしたことはできないでしょうが、よろしくお付き合いくださいませ。
『Java DE Puzzle』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
なお、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。