この記事では、当社の新人エンジニア研修の参考にJava8を解説します。
1.Java言語の特徴
Java言語の特徴、(あるいは、この新人研修でJavaを選択している理由といってもいいかもしれません)
それは以下の3点です。
①WindowsやMac OS、Linuxなどの各種OSでJava仮想マシンが入ってれば実行できるので自宅学習ができる
②現在、主流のオブジェクト指向型言語の基本を学ぶことができる
③組込みシステムからAndroidスマホ、デスクトップアプリケーションからWebアプリケーションまで幅広い分野で活用されているので、どのような部署に配属されても役に立つ
これが例えば、C言語を選択したとすると上記のすべてを満たすことができません。
人工知能分野で注目度が高いPython、日本発祥のRuby、アップル社の製品で人気が高まっているswiftなどの言語も魅力的ではありますが、③の部分ではまだJavaに一日の長があるといっていいでしょう。
ということで、当社の新人研修ではプログラミング言語としてJavaを使うことが最も多いです。
③幅広い分野で活用されている
についてこれから長い研修期間中にお話していくことになりますので、ここでは、①②について説明します。
2.Javaプログラムの実行
Javaでプログラムコードが実行されるまでには以下のような2つのステップを経ます。
①プログラムコードがコンパイルされてバイトコードが作られる。
②バイトコードがJava Virtual Machine(Java仮想マシンのこと。以下、JVMと略す)によって実行される。
これが例えばC言語ですと、
①プログラムコードがアーキテクチャ(OS等)に応じた形でコンパイルされてマシン語が作られる。
②マシン語が実行される
という流れになっています。
つまり、JVMが各種OSとプログラムの間を仲立ちしてくれるため、プログラマーがアーキテクチャを意識しなくて済むのです。

JVMがOSの違いを吸収する
JVMによってJavaは、
“Write once, run anywhere” 「一度(プログラムを)書けば、どこでも実行できる」
という優れた特徴を有しているのです。
以下のようなプログラムをエディタを使って入力してみましょう。
1 2 3 4 5 |
class Example01 { public static void main(String[] args) { System.out.println("Hello World"); } } |
入力したら、コマンドラインでコンパイルして実行してみます。
> javac Example1.java ←①
> java Example1 ←②
Hello World ←③
①プログラムコードがコンパイルされてバイトコードが作られる
②バイトコードがJVMによってメモリにロードされ、実行される
③実行結果が表示されました
①のところでは拡張子を付けたのに対して、②では拡張子をつけていない点に気をつけてください。
画面に「Hello World」と表示されたと思います。
誤解が多いのですが、このプログラムコードが動作するわけではありません。
現在のノイマン型コンピュータでは、このプログラムコードがメモリにコピー(ロード)されて動きます。
この点が、後で重要になってきます。
なお、コマンドラインでコンパイルするのは手間がかかるので今回限りにしましょう。
次からは、統合開発環境(Integrated Development Environment:以下、IDEと略す)を使っていきます。
※なお、Example1.javaというソースプログラムとExample1.classというクラスファイルが作られています。
どこに作られたか各自でそれぞれ探してみてください。
ここでは、さらに詳しくJava言語のプログラムコードを見てみましょう。
3.Javaプログラムの構成
以下のサンプルプログラムをIDEに入力して実行してみましょう。
実行の方法はIDEごとに違いますので講師から説明します。
1 2 3 4 5 |
class Example01 { public static void main(String[] args) { System.out.println("Hello World"); } } |
上記は、「Hello World」という文字列を画面に表示するプログラムのコードです。
プログラムは、半角英数と記号で記述します。
1行目にご注目下さい。
classと書いてあります。
Javaのクラスとは、モノの設計図です。
このモノのことをオブジェクトと呼びます。
例えば、今、新入社員の皆さんが同じクラスで研修を受けていますね。
みなさんをモノ扱いするのは気が引けるのですが。。。
同じクラスにいるということは何らかの共通項があるわけですね。
プログラミングの知識は比較的浅い、タッチタイピングなどの操作はできるなど。
その共通項のひな形をクラスといいます。
つまり、オブジェクト指向とは、プログラムをクラスの集合体とみなしましょうという考え方です。
プログラミング・パラダイムともいいます。
この点は後で詳しくお話ししますね。
4.オブジェクト指向のメリットとデメリット
Javaでは、プログラムはクラスを複数組み合わせて作り上げます。
そもそもなぜ、オブジェクト指向が生まれたかといいますとそれはメンテナンスしやすいプログラムを作るためです。
多くの予算を使って作ったシステムは、業務内容の変更や改善、法律の改正にかかわらず長く使い続けていきたいものです。
そんな時に、モノの世界はどうしているでしょうか?
例えば、パソコンというものを考えた時に、パーツが古くなったらパーツだけを変えることができますよね。
一部分を変更しても全体には影響しないようになっています。
オブジェクト指向も正にその点を考えて作られているのです。
ただし、デメリットとしては、最初作るときは色々なことを考慮しなくてはいけないので大変です。
とりあえず動かしてそれで良し、というのでしたらオブジェクト指向のメリットは受けづらいのです。
そのため、なかなか新人研修の数か月間ではそのメリットを感じられないかもしれません。
5.本記事の方針
クラスにはこれからの研修でやるように自分達で作るものもあれば、JavaAPIといってJavaの中の人(?)があらかじめ作ってくれているものもあります。
APIの中にあるクラスを私が数えたところ、Java8の場合は4240個もありました。
あるいは、サードパーティーが作成したクラス、自社で開発したクラスなど無数のクラスが世の中にはあります。
プログラムでやりたいことがある場合、自作するのではなく、既存のクラスの活用を考えてください。
なぜなら、自分で作成したクラスにはバグがある可能性があるからです。
皆が使っているクラスにはバグがある可能性は低いからです。
(ちなみになんでも自作にこだわることを”車輪の再発明”と言って戒めることがあります)
ここで、この記事の方針を説明します。
この記事では、
①JavaのことはJavaに訊け、の精神でJavaのソースコードやAPIについて解説します。
②当社が受講者に課す最終課題をやり抜く上で必要となるクラスを中心に紹介します。
③プログラミング言語は国際語であるという点を踏まえて英語の意味から解説します。
ただし、もうお分かりのようにJavaのすべてを網羅しているわけではありませんのでご了承ください。
6.フィールドとメソッド
※以下のお話は少し高度な論点を含んでいます。詳しくは全連載を通じてお伝えしますが、ここでも簡単に触れておきたいと思います。
全てのソースコードはクラスに属する必要があります。
なお、クラス名は自由に設定できますが、先頭の文字はアルファベットの大文字にします。
例:Example01
クラスはフィールド(field)とメソッド(method)を持つことができます。
フィールドとは場のことで、データやオブジェクトの置き場所のことです。
メソッドとは方法のことで、処理や操作のことです。
そして、フィールドとメソッドを合わせてメンバといいます。
例えば、新入社員オブジェクトであれば誰でも、プログラミング経験年数や所有パソコンなどのフィールドを持っていますね。
また、新入社員オブジェクトは、挨拶をする、プログラムを書く、などのメソッドを皆が持っています。
メソッドはメソッド名()という形をしているのでそれと知ることができます。
「Hello World」のプログラムでは2行目にmain()というメソッドあるのが分かりますか?
メソッドの書式は以下の通りです。
[修飾子] 戻り値のデータ型 メソッド名(引数1, 引数2, ….){
} |
{ } 波カッコの中(ブロックといいます)に命令文を書きます。
開きカッコと閉じカッコの対応が取れていないというのは初学者に多いミスです。気をつけましょう。
main()はメインメソッドと呼ばれる特別な処理で、JVMがプログラムをここから始められるためにエントリーポイントとも呼ばれます。
プログラムを実行するためには、必ず、どこかのクラスに1つメインメソッドが必要です。
mainの前についている public static void というものについて説明します。
publicとは、修飾子のうちのアクセス修飾子と呼ばれるもので、このメソッドがどのクラスから利用できるかを表しています。
英語のpublicには公開という意味がありますね。
public はアクセス修飾子の中で最も広く多くのクラスから利用できるという意味です。
メインメソッドは、JVMから利用されるためにpublicになっています。
static修飾子は、インスタンス(実体)というものを作らなくても利用できるメソッド(クラスメソッド)であるということを示しています。
英語のstaticには静的という意味があります。
インスタンスを作ってそのインスタンスが動的に処理をするというのと対極のイメージです。
今回、インスタンスを作った覚えはありますか?
ありませんね。
ですので、これだけでいきなり実行できるメソッドです。
ちなみに英語でも”for instance,”と言えば「例えば、」という意味ですが、具体的なもののことですね。
先の新入社員クラスの例でいえば、鈴木さん、佐藤さんといった実体のある個々人のことです。
ここは、オブジェクト指向で最も大切なところですから、後で詳しく説明したいと思いつつ、先を進みますね。
voidは、メソッドの戻り値が“ない”ということを表しています。
main(String[] args)という風に、()の中に仮引数というものを書くことができます。
argsというのは、変数名と呼ばれるもので、プログラム実行時に引数として指定した文字列をこのメソッドの中で使う際に
argsという名前で呼び出すことができるようになるという仕組みです。
本当は仮引数の名前は何でも良いのですが、伝統的にagrs(arguments:引数の略)が使われます。
皆さんは中学生時代に文字式というものを習ったと思います。
y = 2x + 1 |
のような式です。
xの値が変化するにつれてyの値も変化しました。
この時のyが戻り値、xが引数です。
例えば、あなたが電卓プログラムを作成し、2つの整数の足し算ができるようにしたいとしましょう。
そのとき与える2つの整数にaとbのように仮の名前を付けておく必要があるのです。
y = a + b |
後に、そのプログラムを使って実際に足し算をするとします。
「1 + 2 = 3」という計算をしたいとしましょう。
この時、引数(実際の引数なので実引数と呼びます)は1や2というデータ、戻り値は結果の3です。
なお、仮引数にはデータ型を示す必要があります。
上記の例では、整数値ということになります。
前述の仮引数String[]というのはString型の配列、つまり、文字列を複数取ることができるということを示しています。(配列の詳細は後述)
当社の新人研修のカリキュラムでは、このagrsという引数を利用するプログラムは作りませんので先に進みます。
3行目を見てみましょう。
System.out.println(“Hello World”);
となっています。
このように命令文の終わりには;を付けます。
ここまでの知識の応用で、この1文を読み解いてみましょう。
まず、Systemと頭文字が大文字なのは、これがクラスだということを表していますね。
Systemはその名の通りあなたが現在お使いのパソコンのシステムのことです。
“.”は、日本語に直せば「の」というような意味です。
Systemクラス「の」out「の」printlnメソッドを使っているというところまでは、よろしいでしょうか?
outは、Systemクラスで定義されているフィールドです。
フィールドは初めて実物が出てきましたね。
やや強引ですが、この一文の解釈は、
新入社員.パソコン.画面表示()
のようなイメージでしょうか。
実引数は”Hello World”という文字列です。
printlnメソッドは、引数の内容を画面表示して改行する(new line)というメソッドです。
プログラムの単語と単語の間に半角スペースや改行を入れる目的は、①単語と単語を分けるため ②見やすさのため の2点です。
よって、単語の間でなければどこに入れても構いません。
※ただし、極端な記述は読み手を惑わせます。研修内で説明するIDEのフォーマット機能を使って常に見やすいコードを心がけてください。
ほんの少しの処理をさせるために、ずいぶんたくさん書かないといけないのだなという感想を持たれた方もいらっしゃるかもしれません。
しかし、ルールが多いということのメリットとして、多くの人が協力してプログラムを作成する際に有利に働くのです。
交通ルールでも細かく決まっているから安心して車を走らせることができるということもありますね。
金融やインフラなど間違いが許されない分野でJavaが使われている理由でもあります。
以上、相当細かいことまで最初にお話ししましたが、ここでお話したことはこれからも繰り返し出てくる重要なトピックです。
ゆっくり理解いただければ結構です。
ひとまず、Javaプログラムにおいては、
①大文字と小文字は区別される
②{ と } は必ず1対1の対応を持っている
③{ } で囲まれた範囲を「ブロック」と呼ぶ
といったことを覚えましょう。
また、プログラムコードを見やすくするための字下げを「インデント」と呼びます。
章末に後々まで使用する各種記号のうち、新入社員がその呼び方を迷うものをまとめておきましたので参考にしてください。
7.コメントの入れ方
コメントは人間に向けたメッセージです。
他人に向けたメモです。
将来の自分自身も他人のようなものなので、コメントを書いておくことは非常に重要です。
1 2 3 4 5 6 7 8 9 10 11 |
/** * 画面表示 * 作成者 yamazaki * 作成日 20XX/11/09 */ class Example02 { public static void main(String[] args) { //Hello Worldと画面に表示する System.out.println("Hello World"); } } |
※ここでは、「Example02」とクラス名を変更しています。Javaファイルはパッケージというフォルダに入れて管理されます。今回はデフォルトパッケージ(無名パッケージ)というところに保存されています。そのため、先の「Example01」と同じファイル名を付けられないためこのようにしています。パッケージ管理については重要なテーマなのであらためて解説します。
Javaのコメントは上記のように
① /* と */ で囲んだ複数行をコメントにする
②// をつけて、1行だけコメントにする
という2つの方法があります。
※機会があればやってみますが、/**で始まるコメント形式はJavadocというAPI仕様書を作ることのできる書き方です。
また、コメントアウトといって一時的にプログラムをコメントにすることも良くあります。
1 2 3 4 5 6 |
class Example03 { public static void main(String[] args) { System.out.println("Hello World"); // System.out.println("Goodby World"); } } |
コメントアウトした部分はプログラムではなくなる訳ですね。
IDEを使っているとコメントのショートカットキーを使って素早く実現できます。講師にお尋ねください。
なお、納品するプログラムにはコメントアウトしたソースコードを含めないようにしましょう。
8.Compile Errorへの対処
コンパイルするときにエラーが表示されることがあります。
例えば、
System.out.println(Hello World”);
のようにカッコの対応があっていない状態で実行すると
run: Exception in thread “main” java.lang.RuntimeException: Uncompilable source code – Erroneous tree type: <any> at Example02.main(Example02.java:10) |
といったエラーメッセージが(私の環境では)表示されました。
このエラーメッセージをよく読まない人がいます。
エラーメッセージにはエラーに関する重要な情報が含まれています。
たとえば、上記の例では、
Example02.java:10
という風にExample02の10行目がエラーの原因であるといったことが表示されています。
エラーメッセージをよく読むことがプログラミング上達の秘訣です。
Javaのエラーには以下の3種類があります。
①文法エラー(英:Syntax error) コンパイル時にエラーが発覚する。
②実行時エラー(英:runtime error) コンパイルは通るが実行中に異常事態が発生し、プログラムの実行が強制終了する。
③論理エラー(英:logic error) 実行できるが、実行結果が意図したものと違う。
当社の新人研修ではIDEを使用します。
①の文法エラーは、IDEがエラーを教えてくれるので、指示に従って直すようにしてください。
ただし、全角文字や全角空白を使用しているなどメッセージでは分かりにくい文法エラーもあることは念頭に置いてください。
②の実行時エラーは例外処理をします。(後述)
③の論理エラーはテストというテーマでお話しします。(後述)
9.標準出力
ちなみに、コンソールに出力することは欠陥を除去するデバッグ作業という意味でも重要な行為です。
目に見えないものは直しようがないからです。
コンピュータ上で実行されているプログラムが、標準的に利用するデータ出力先を標準出力といいます。
コマンドプロンプトの画面やIDEのコンソールなどが標準出力の例です。
Javaで標準出力に出力したあと改行するには、
System.out.println(出力する内容);
と書きます。
改行が不要であれば、
System.out.print(出力する内容);
です。
当社の研修ではのちのち標準出力以外にWebページに出力するということもやります。
お楽しみに!
今回はJava言語の特徴について見てきました。
後々にならないと意味の分からないところも多いと思います。
研修をある程度進めてから改めて学ぶと良いと思います。
今回はJava言語の特徴について学びました。
次回は、Javaの変数とデータ型を学んでいきます。
参考:本研修で使用する記号一覧
記法 |
呼び方 |
本研修中の主な用途 |
|
1 |
() |
丸カッコ |
Javaでメソッドの引数を指定する、演算の優先順位を高める |
2 |
[] |
角カッコ |
Javaで配列に使う |
3 |
{} |
波カッコ |
Javaでブロックの範囲を示す、配列の初期化をする |
4 |
<> |
山カッコ |
Javaでジェネリクスで「型」をパラメータとして定義するときに使う、HTMLのタグに使う |
5 |
; |
セミコロン |
Javaで文末につける |
6 |
: |
コロン |
Javaの拡張for文や三項演算子に使う |
7 |
, |
コンマ |
Javaでリテラルや変数、インターフェースを列挙する |
8 |
. |
ドット |
Javaでドット演算子に使う |
9 |
/ |
スラッシュ |
Javaでコメント、UNIX(URL)のパスの区切り文字 |
10 |
\ |
円マーク・バックスラッシュ |
Javaでエスケープシーケンスを示す、Windowsのパスの区切り文字 |
11 |
“ |
ダブルクオーテーション |
Javaで文字列リテラルを囲む |
12 |
‘ |
シングルクォーテーション |
Javaでchar型の文字を囲む。MySQLで文字列を囲む |
13 |
% |
パーセント |
Javaで剰余演算、MySQLで任意の文字列 |
14 |
_ |
アンダーバー |
Javaで定数の区切り文字、MySQLで任意の一文字 |
15 |
* |
アスタリスク |
Javaで複数行コメント、乗算演算子、複数クラスのインポート、MySQLですべての列の選択 |
16 |
? |
クエスチョン |
Javaの三項演算子、JDBCでプレイスホルダとして使う |
JavaSE8の解説に戻る