はじめに

<<前へ  戻る  次へ>>


2006年に弊社の研修生がJava入門をまとめてから3年、その間にJavaを取り巻く環境は変化しました。
そうした変化を取り入れ、また編者の経験も加えてJava入門を再構築していくことになりました。
現在Javaに関する知識を修得するメディアに困ることはありませんが、この入門が入門者の皆さんに一視点を提供できれば幸いです。

【筆者プロフィール】
菊池昌子(きくち まさこ)
初心者向けパソコン指導やWeb作成請負などを経て泣Aルティスタ(現在のあるてすた)に入社。
2006年3月より専属講師の指導下においてJava最新技術を履修した。


【編者プロフィール】
無苦庵(むくあん)
ソフトウェア開発会社からあるてすたに入社。2009年5月にSun認定Javaプログラマ資格(SJC-P)を取得。

続きを読む

第0回 Javaとは何か


Java入門を始めるにあたり、まずJavaとは何かを説明します。

■プログラミング言語Java
JavaとはアメリカのSun Microsystems社開発チームによって1996年に一番最初のバージョンが発表されたプログラミング言語です。
この言語の主な特徴は次の通りです。
1:プラットフォームに依存しないアプリケーションソフトウェアが開発可能。
2:オブジェクト指向プログラミング言語である。
3:構文はC及びC++に似ている。

今回はこのうち1と2の2点について説明します。

続きを読む

第1回 まずは下準備(1) 開発環境の構築



■拡張子を表示させるようにする
Windowsのデフォルトの設定では一部の拡張子(ファイル名の末尾に付いている.txt、.javaなどのような文字列で、何のファイルか示すもの)が非表示になっています。
これではファイルの拡張子を変更することができないなど、プログラムの際に問題がありますので、まずはこの設定を変更しましょう。
「マイコンピュータ」を開いてメニューバーの「ツール」-「フォルダオプション」をクリックします。

フォルダオプション


フォルダオプション画面が表示されますので、画面上部のタブを「表示」に切り替えます。
そして「すべてのファイルとフォルダを表示する」にチェックし、「登録されている拡張子は表示しない」のチェックを外してからOKをクリックします。

フォルダオプション設定


これですべてのファイルの拡張子が表示されるようになりました。
ファイル名の表示のされ方を確認してください。「ファイル名」だった表示が「ファイル名.拡張子」のようになっているはずです。

続きを読む

第2回 まずは下準備(2) 初期設定


(ここからはデフォルトのインストールフォルダC:\Program Files\Java\jdk1.5.0_19にインストールしたものとして話を進めます)

■入門開始……の前にすべきこと
さて、Javaの開発環境を用意できたのですが、入門を開始するにあたってまだすべきことが残っています。
Javaプログラムのコンパイルを行うjavac.exeと実行させるjava.exeは共にC:\Program Files\Java\jdk1.5.0_19\binに存在しますが、これらは後述するコマンドプロンプトから実行されます。
コマンドプロンプトでコマンドが入力された場合、まずその時自分が作業をしているカレントフォルダにそのコマンドがあるかを調べに行きます。そこにコマンドを実行できるファイルがなければ今度は環境変数pathに登録されているフォルダを見に行き、そこにもコマンドがなければエラーになります。
ところが現在C:\Program Files\Java\jdk1.5.0_19\binは環境変数pathに設定されていません。その為、コンパイルや実行の度にいちいちフルパスでコマンドを入力してやらなければならなりません。この状態を「パスが通っていない」といいます。

たとえばJavaソースファイルTest.javaをコンパイルするにはTest.javaの置かれているフォルダをカレントフォルダにした状態で

C:\Program Files\Java\jdk1.5.0_19\bin\javac Test.java


とコンパイルを行うjavacのファイルのフルパスを入力しなければなりません(javacの実行の際、拡張子.exeは不要です)。
コンパイルされたプログラムTest.classを実行するには

C:\Program Files\Java\jdk1.5.0_19\bin\java Test


とこれまたフルパスでJavaプログラム実行を行うjavaをフルパス指定する必要があります。こちらはjava.exeの拡張子だけでなく、Test.classの拡張子も不要です。
javac.exeやjava.exeが置かれているC:\Program Files\Java\jdk1.5.0_19\binをカレントフォルダにすればフルパス入力をしなくてもかまわなくなりますが、そうすると今度はTest.javaやTestをフルパスで指定してやらなければならなくなります。
C:\Program Files\Java\jdk1.5.0_19\bin内にソースファイルを置いてしまえばどちらも省略できますが、このフォルダは本来ソースファイルの置き場所ではないので好ましくありません。
そこで、環境変数pathにパスを追加設定して、任意の場所からjavacやjavaを実行できるようにします。

続きを読む

第3回 はじめてのJavaプログラム



■最初のJavaプログラム
前回で基礎となる開発環境は整いましたので、いよいよプログラミングを始めます。
まず適当なテキストエディタを起動します。スタートメニューから[プログラム]-[アクセサリ]内にある「メモ帳」か「ワードパッド」を選択してください。
その上で次のように入力します。

class Hello{
    public static void main(String [] args){
        System.out.println("Hello World!");
    }
}


すべて半角英数字で入力してください。また、Javaでは大文字と小文字は区別されますので間違いがないよう気をつけてください。
行頭のスペースはインデントといいます。中括弧{}の中に入るごとにインデントをタブ1個分、または半角スペース4個分追加します。
インデントはあってもなくてもコンパイルや実行には支障はありませんが、あった方が人間にとって読みやすくなりますので付けるようにしてください。
入力が済みましたら保存します。
保存先は第1回で作成した作業用のフォルダ内で、名前はHello.javaです。ファイルの種類は「すべてのファイル」にしますが、選択肢になければ「テキストファイル」にします。

保存ファイル種類選択


保存したファイルが存在していることをエクスプローラから確認します。
もし名前が違う場合(Hello.javaとすべき部分がHello.txtとなってしまっている等)、名前が合うように修正してください。

Hello.javaファイルの存在を確認


■プログラムのコンパイル
次に、このプログラムをコンパイルして実行できるようにします。
コマンドプロンプトを開き、作業ディレクトリにカレントディレクトリを移動させてからjavacコマンドを実行します。[Enter] の部分ではEnterキーを押してください。
実行した後もコマンドプロンプトは閉じないでおいてください。

C:\>cd C:\kikuchi\JavaRensyu[Enter]
C:\kikuchi\JavaRensyu>javac Hello.java[Enter]
C:\kikuchi\JavaRensyu


下線部はプロンプトと呼ばれるもので、使用者にコマンドの入力を促す為に自動的に表示されるものです。実際に入力する必要があるのは下線部がない部分のみです。
javacコマンド実行時(上記の場合、3行目のプロンプトの直後)に何らかのメッセージが返ってくる場合、プログラム内部にエラーが存在します。内容を確認して修正してください。

コマンド実行後は再びエクスプローラから作業用フォルダの内容を確認します。
Hello.javaと同じ名前で拡張子が異なるHello.classが作られていることを確認してください。

Hello.classファイルの存在確認


このファイルをJavaが実行することになりますが、詳しくは後述します。

■プログラムの実行
先程コンパイルされたプログラムを実行してみましょう。
実行は次のように行います。

C:\kikuchi\JavaRensyu>java Hello[Enter]
Hello World!

C:\kikuchi\JavaRensyu>


javacとは異なり、拡張子*.classをつけないことに注意してください。
java Helloを実行してHello World!
が返ってくれば成功です。

続きを読む

第4回 文字と文字列



■変数とは何か
変数とは、プログラムの中で最も基本的な概念といえるでしょう。これは名前のついたデータの入れ物であり、何らかの値を格納できます。

■変数の宣言
他言語の中では変数を事前に宣言せずに使用できるものもありますが、Javaの場合そのようなことは許されていません。使用する変数は全て事前に宣言する必要があります。変数の名前と型名をコンパイラに知らせるのが宣言の役割です。
変数の宣言は次のように行います。
型名  変数名;


たとえばchar型の変数charAを宣言する場合は次のように記述します。
char  charA;


続きを読む

第5回 数値・ブール型を扱う型



■数値を扱う基本データ型
基本データ型の中で数値を扱うデータ型は次の通りです。

型名説明
char16ビットUnicode文字データ
\u0000〜\uFFFF
byte8ビット符号付き整数
-128〜127
short16ビット符号付き整数
-32768〜32767
int32ビット符号付き整数
-2147483648〜2147483647
long64ビット符号付き整数
-9223372036854775808〜-9223372036854775807
float32ビット符号付き浮動小数点
double64ビット符号付き浮動小数点


今回はこのなかで整数型(int)を用いた簡単な計算プログラムを作ってみましょう。

続きを読む

第6回 命名規則



■識別子の命名規則
Javaでは変数だけでなくクラスやメソッド等にも名前を付ける必要があります。この名前のことを識別子(identifier)と呼びます。今回はこの識別子の命名について説明しましょう。
識別子の命名には「○文字以下」といった長さの制限はないのですが、次のような規則が設けられています。
大文字と小文字は区別される。
記号は'_'(アンダースコア)と'$'(ドル記号)のみが使用可能。
1文字目は英字、$、 _ のいずれかとする。数字は2文字目から使用可能
キーワード(後述)と重複しないようにする。
booleanリテラルであるtruefalse、nullリテラルであるnullは不可。


もちろん、いくら長さに制限がないからといってあまりに長過ぎる名前にするのは呼ぶときに不便ですし、一目見てその役割が分からないのでは「識別」子として意味がありません。

続きを読む

第7回 演算子



演算子(operator)とは式で実行する演算(operate)とその方法を指定する記号のことです。第5回
ではその中の一種である算術演算子がいくつか登場しましたが、今回は他の演算子についても説明します。

■オペランド
オペランドとは、演算子の作用する対象となる物のことです。たとえば次のような式があったとします。
int a = 1;
int b = 1;
int c = a + b;

3行目の加算式では変数aと変数bが加算演算子+のオペランドとなります。

■演算子の大分類
Javaには次のような演算子が存在します。
算術演算子左右のオペランドの四則演算等の演算を行い、 その結果を返す。
代入演算子右オペランドの値を左オペランドに代入する。
単項演算子一つのオペランドに対して処理を行い、
その結果を返す。
比較演算子左右のオペランドを比較し、演算子で指定された条件に合っているか
否かをboolean型で返す。
論理演算子boolean型の左右のオペランドに対して
論理演算を行う。
ビット演算子整数型基本データ型に対して
ビット単位でデータ操作を行う。
複合代入
演算子
算術演算子、或いはビット演算子と
代入演算子を組み合わせたもの。
3項演算子演算対象を3つ持つ演算子。
条件分岐を簡潔に記述できる。
その他の
演算子
特殊な使い方をする演算子。

今回はこれらの演算子のうち、主なものの性質と使い方について説明します。

続きを読む

第8回 配列



第5回で少し触れましたが、5教科の点数100人分を扱うプログラムを考えてみましょう。
class ScoreManagement{
    public static void main(String [] args){
        int std001Japanese = 90;
        int std001English = 50;
        int std001Math = 75;
        int std001History = 88;
        int std001Science = 68;
        ......
        (変数の宣言と初期化が延々と続く)
        ......
        int std100Japanese = 90;
        int std100English = 50;
        int std100Math = 75;
        int std100History = 88;
        int std100Science = 68;
        (上記の変数を使った処理をここに記述する)
    }
}

どうでしょうか?似たような変数が多数存在し、膨大なプログラムになっているということが理解できるでしょう。
このように宣言や初期化だけでも相当手間がかかるのに、たとえばこれらの変数を用いて「全生徒の英語の平均点を求めよ」という課題が与えられたとしたらどうでしょうか?全生徒の英語の点の合計点を求めるのは大変ですし、漏れや重複が起きる危険性もあります。
そこで、複数のデータをまとめて扱うための仕組みである「配列」を使ってみましょう。

続きを読む

第9回 制御文(1) 場合に応じた処理



これまでのプログラムは先頭から末尾まで順序通り実行する一本道のものばかりでしたが、現実に行わせたい処理はそれだけでは記述できません。
「この条件がAなら処理aを行うが、条件Bなら処理Bを行う」という分岐を持った処理が必要になることもあります。
今回はそうした条件分岐を行わせる為の条件分岐を行わせる制御文について説明します。

続きを読む

第10回 制御文(2) 繰り返し処理



1から10までの合計値を求めるプログラムを作ってみましょう。

class CalcTotal {
    public static void main(String[] args) {
        int iTotal = 0;
        iTotal += 1;
        iTotal += 2;
        iTotal += 3;
        iTotal += 4;
        iTotal += 5;
        iTotal += 6;
        iTotal += 7;
        iTotal += 8;
        iTotal += 9;
        iTotal += 10;
        System.out.println("合計値:" + iTotal);
    }
}


これで出力「合計値:55」が求められますので問題はありませんが、量が100、200、...ともなってくるとあまり良い手法とは思えません。
こうした繰り返し処理にはそれに特化した記述方法が用意されています。今回はそうした処理の記述方法であるfor文、while文、do〜while文について学んでいきましょう。

続きを読む

第11回 クラスとメソッド



第0回で少し触れたように、Javaプログラムの最小単位がクラスです。
今まではこのクラス内のメソッド内でのことを取り扱ってきましたが、今回は少し視点を変えてクラスについて説明していきます。
第0回で扱ったロボット設計図のクラスを実際のプログラムにすると、次のようになります。

class RobotBlueprint {
    /*** 変数 ***/
    private String strSerialNo; //シリアルナンバー
    private double dBatteryStatus; //バッテリー残量
    private double dLuggageWeight; //積載貨物重量
    /*** コンストラクタ ***/
    public RobotBlueprint(String strSerialNo) {
        this.strSerialNo = strSerialNo;
        this.dLuggageWeight = 0.0;
    }
    public RobotBlueprint() {
        this("12345-ABCDE");
    }
    /*** メソッド ***/
    public String getSerialNo() {
        return this.strSerialNo;
    }
    public double getBatteryStatus() {
        return this.dBatteryStatus;
    }
    public void move(double x, double y) {
        System.out.println("ロボットを移動させました。");
    }
    public void chargeBattery() {
        this.dBatteryStatus = 100.0;
        System.out.println("ロボットに充電しました。");
    }
}

このメソッドを例にしてクラスと、それを構成する要素であるメンバについて説明していきます。

続きを読む

第12回 修飾子の種類



■修飾子とは何か
修飾子とはクラスやメソッド、変数などを性質付ける為に、宣言の際に付与されるものです。
第0回の「オブジェクト指向プログラミングの構成要件」内でふれたように外部からのアクセスを許可/制限する為のアクセス修飾子が主になりますが、アクセス修飾子以外にも修飾子は存在します。
今回はそうした修飾子の中でよく使われるものを中心に説明していきます。

続きを読む

第13回 継承とオーバーライド



■継承とオーバーライドについて
第0回でも軽く説明したように、継承とは既存のクラスを元に新しいクラスを作ることです。その際元にしたクラスの変数・コンストラクタ・メソッドなどのメンバをそのまま流用することもできますし、既存にはないメンバを新しく作ることもできます。
またそれだけでなく既存クラス側のメンバと同名のメンバを宣言することで、既存クラス側のメンバを上書きしてしまうこともできます。これがオーバーライドです。なおオーバーライドされた側の既存クラス側メンバは消えてしまうわけではなくオーバーライドした側によって隠されているだけで、アクセスも可能です。
今回はこの継承とオーバーライド、そしてオーバーロードの方法について説明します。
続きを読む

第14回 様々なクラス(1) 既存のクラスの使い方



前回予告したように、Javaには多数のクラスが提供されています。何気なく使っている出力のメソッドSystem.out.println()もSystemクラスのメソッドです。
こうした豊富な標準クラスライブラリ(Class Library)は無秩序に置かれているわけではなく、機能毎にパッケージ(package)という集まりに分けて整理しています。
Javaの主要なパッケージは次の通りです。
パッケージ説明
java.appletアプレットの生成等に必要なクラス集。
java.awtグラフィカルユーザインタフェース(GUI)を作成する為の
Abstract Window Toolkit(AWT)を提供する。
java.awt.event上記クラスにより作られたAWTコンポーネントから
発せられたイベントに対応する為のクラス集。
java.ioファイルやネットワーク等との
入出力をサポートするクラス集。
java.langJavaの言語中枢を提供するクラス集。
java.utilユーティリティ機能を提供するクラス集。
アプレットとはInternet ExplorerやFirefoxといったWebブラウザ上で動作するJavaプログラムのことです。詳しくはステップアップ編で扱います。
java.langパッケージは常にimport宣言された扱いになっています。詳しくは後述します。

今回はこうしたパッケージ内に存在する既存クラスを使っていく方法について説明します。

続きを読む

第15回 様々なクラス(2) Stringクラス



第4回から扱ってきた文字列を扱うクラスStringですが、このクラスには他のクラスにはない特異な性質が存在します。
今回はそうした性質と、Stringクラスのメソッドについて学習していくことにしましょう。

■Stringクラスのインスタンス生成
Stringもクラスなので、文字列を格納するインスタンスを生成してそれを参照する変数に関連付けます。これには2種類の方法があります。
String str1 = "XXX";                 //方法1
String str2 = new String("XXX"); //方法2
方法1は今までの方法です。基本データ型への値の代入同様に変数の宣言と初期設定を同時に行います。
方法2はコンストラクタを用いた本来のインスタンス生成方法です。この例の場合右オペランドのコンストラクタによって文字列"XXX"の実体が作られ、その実体を指し示す変数がstr2となります。

続きを読む

第16回 様々なクラス(3) ラッパークラス



ラッパークラス(wrapper class)とは、Javaの持つ8つの基本データ型それぞれに対応したクラスのことです。基本データ型(プリミティブ型)を扱う為、正確にはプリミティブラッパークラス(primitive wrapper class)とも呼ばれます。
これらは対応する基本データ型をオブジェクト内に保持するのですが、基本データ型を包み込む(wrapする)ようなのでラッパークラスと呼ばれています。また、ラッパークラスはメソッドを持っており、これを使うことも可能です。
今回はこのラッパークラスの使い方について学習します。

続きを読む

第17回 様々なクラス(4) Mathクラス


指数関数や三角関数等の数値処理は、第7回で扱ったような演算子のみで表現するのは非常に困難です。こうした数値処理を行う為の変数(定数)やメソッドを集めているのがjava.lang.Mathクラスです。
MathはMath m = new Math();のようにオブジェクトを生成できず、サブクラスを生成することもできません。
Mathクラスで宣言されている変数・メソッドは全てstaticが付与されていますので、全てMath.変数名かMath.メソッド名(引数リスト)で使用していくこととなります。

続きを読む

第18回 例外処理



第8回で挙げたMainArgsTestを思い出してみてください。
class MainArgsTest{
    public static void main(String [] args){
        System.out.println("args.length = " + args.length);
        System.out.println("args[0] = \"" + args[0] + "\"");
        System.out.println("args[1] = \"" + args[1] + "\"");
        System.out.println("args[2] = \"" + args[2] + "\"");
    }
}
これを次のコマンドラインで実行してみましょう。
java MainArgsTest 01 02
実行結果は次のようになります。
args.length = 2
args[0] = "01"
args[1] = "02"
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
        at MainArgsTest.main(MainArgsTest.java:6)
下線部の記述が見慣れませんね。これが「例外」(Exception)が発生したことを示すメッセージなのです。
今回はこの例外が発生する条件とその種類、処理方法について説明します。

■例外とは何か
コンパイル時にエラーは発生しないのですが、実行中言語的に意味をなさなくなってしまう場合、自動的に生成されるオブジェクトが例外です。
例外が生成されることをスローされる(throwされる/投げられる)と言いますが、スローされた例外がプログラム中のどこでもキャッチされる(catchされる/受け止められる)ことがない場合はプログラムは終了します。上記の例の下線部分は例外によるプログラム終了時、例外の種類と発生箇所を報告しているものです。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
        at MainArgsTest.main(MainArgsTest.java:6)
このメッセージの意味は次のように解釈できます。
MainArgsTestクラスのmain()メソッド実行時に7行目で例外ArrayIndexOutOfBoundsExceptionが発生しました。
例外が発生した配列の要素数は2です。

続きを読む

第19回 入出力処理(1) 文字ストリーム



今回はキーボードからの入力とファイルへの入出力について説明します。

■java.io.Fileクラス
Fileクラスはその名の通りファイルやディレクトリ(フォルダ)に関する情報(読み取り可否、書き込み可否、ファイルサイズ等)をプロパティに格納したクラスです。

Fileのコンストラクタ
File(String path)
File(String directoryPath, String filename)
File(File directory, String filename)File(String path)
第1の形式は対象となるファイル/フォルダのフルパス名を唯一の引数であるpathに指定します。
第2の形式はフルパスを「対象ファイルを格納しているディレクトリ」名と「ファイル自体の名前」に分解し、それを文字列としてそれぞれdirectoryPathとfilenameに設定しています。
第3の形式は対象ファイルを格納するディレクトリをディレクトリ名という文字列ではなく、そのディレクトリを指す別のFileオブジェクトで指定しています。
Fileの主な変数
separatorCharパス名のディレクトリ名や
ファイル名を区切る文字
(Windowsは\、UNIXなら/)
pathSeparatorChar複数のパス名を列挙する際の区切り文字
(Windowsは;、UNIXなら:)
これらはいずれもpublic static final(全クラスから参照可能・クラス変数・値の変更不可)。
separatorCharに比べるとpathSeparatorCharの使われ方は分かりづらいかもしれませんが、第2回で環境変数を設定した際のことを思い出してください。セミコロン';'がパス同士を区切っていたはずです。
続きを読む

第20回 入出力処理(2) バイトストリーム



前回は文字列データをファイルへ入力したりファイルから出力したりする時に使用する文字ストリームについて学習しましたが、Javaで扱われるデータは文字列データばかりではありません。画像や音声といったバイナリデータ(binary data)も存在します。
今回説明するバイトストリーム(binary data)はこうしたバイナリデータを扱う為のものです。個々のバイナリデータを扱うだけでなく、クラスオブジェクトの変数等の内容を保存したり、逆に保存した内容を読み込むことも可能にするクラスも存在します。

■バイトストリーム
バイトストリームは文字では表現できないデータの入出力を行う為のストリームです。
java.ioパッケージで提供されているバイトストリームの主要なクラスの継承関係は次の通りです。
バイトストリームクラスの構成
Objectクラスのみjava.langパッケージに属しています。

入力用クラス名がReadではなくInput、出力用クラス名がWriteではなくOutputになっています。

続きを読む

第21回 Javaらしいプログラミングを目指す

<<前へ  戻る  次へ>>


ここまでの説明で、かなり高度なことをJavaプログラムでやらせることが可能となりました。
Java入門講座最終回となる今回は、良い意味で「Javaらしい」プログラミングとは何かについて考えていきましょう。

■Javaの特徴とは
第0回でも説明したように、Javaはオブジェクト指向言語です。1つのオブジェクトで事足りることもありますが、殆どの場合複数のクラスを使用して処理を行わせることになります。これまで多用してきたSystem.out.println()メソッドも、厳密にいうならば
「java.langパッケージ内に含まれたSystemクラスで定義されているSystemクラスの静的変数である標準入力ストリーム(java.io.InputStreamクラスオブジェクト)のインスタンスメソッドprintln()」
という意味がありますが、実際に使う際はそこまで気を回す必要はありません。
これに限らず既存のクラスを使用する場合、そのクラスの使い方さえ分かっていればその中で何が行われているか分からなくても構わないのです。

続きを読む