この記事では、当社の新人エンジニア研修の参考にJavaを解説します。

第一章となる今回はJava言語を初めて学ぶ皆さんが知っておきたいことをまとめました。

新人エンジニアが最初に知っておきたいJavaの学び方

なぜ、Javaを学ぶのか、その理由。

1.Java言語の特徴

Java言語の特徴、(あるいは、この新人エンジニア研修でJavaを選択している理由といってもいいかもしれません)それは以下の4点です。

①WindowsやMac OS、Linuxなどの各種OSでJava仮想マシン(Java Virtual Machine:以下、JVMと略す)が入っていれば実行できるので自宅学習ができる
②現在、主流となっているプログラミングパラダイムであるオブジェクト指向型言語の基本を学ぶことができる
③エンタープライズアプリケーション、Androidアプリ開発、大規模システム、ウェブアプリケーションなど、幅広い分野で活用されているので、どのような部署に配属されても役に立つ
④多くの言語と類似点が多いため、次に他言語を学ぶ際に容易に習得できる。

これが例えば、汎用プログラミング言語として名高いC言語を選択したとすると、上記のすべてを満たすことができません。人工知能分野で注目度が高いPython、日本発祥のRuby、アップル社の製品で人気が高まっているswiftなどの言語も魅力的ではありますが、③の部分ではまだJavaに一日の長があるといっていいでしょう。

ということで、当社の新人エンジニア研修ではプログラミング言語としてJavaを使うことが最も多いです。

④の他の言語との関係は以下のようになっています。

1. JavaとC言語との関係
関係
  • 歴史的背景: C言語は1970年代に開発された歴史のある言語です。C言語はJavaの先祖に当たり、JavaはC言語の構文や概念を取り入れています。
  • 構文: Javaの構文はC言語に似ており、制御構造(if文、for文、while文など)や基本的な文法が共通しています。
習得の容易さ
  • Javaの基本的な文法や概念を理解していれば、C言語の文法も比較的容易に理解できます。
  • C言語は手続き型言語であるため、Javaのようなオブジェクト指向の知識は直接役立たない場合がありますが、基本的なプログラミング概念は共通しています。
  • Javaはメモリのことをほとんど意識せずに使うことができるようになっていますが、意識すればC言語を学ぶときに役に立つでしょう。
分野
  • C言語: システムプログラミング、組み込みシステム、低レベルのハードウェア制御、オペレーティングシステム開発など直接メモリを操作する分野で存在感があります。
2. JavaとC++との関係
関係
  • 歴史的背景: JavaはC++に強く影響を受けており、C++の欠点を克服するために設計されました。
  • 構文: Javaの構文はC++と非常に似ており、オブジェクト指向プログラミング(OOP)の概念を共有しています。
習得の容易さ
  • Javaの基本的な文法や概念を理解していれば、C++の文法も比較的容易に理解できます。
  • OOPの概念(クラス、オブジェクト、継承、ポリモーフィズムなど)は両言語で共通しているため、JavaのOOPの知識がC++の学習に役立ちます。
分野
  • C++: ゲーム開発、高性能システム、デバイスドライバ、組み込みシステム。
3. JavaとC#との関係
関係
  • 歴史的背景: C#はMicrosoftによって開発され、Javaの影響を強く受けています。
  • 構文: C#の構文はJavaと非常に似ており、ほぼ同じように使えます。
習得の容易さ
  • Javaの知識があれば、C#の基本的な文法や構造をすぐに理解できます。
  • 両言語は.NETフレームワーク(C#)とJava仮想マシン(JVM)のように似たコンセプトのランタイム環境を持っています。
分野
  • C#: Windowsアプリケーション、ゲーム開発(Unity使用)、ウェブアプリケーション(ASP.NET)、エンタープライズソフトウェア。
4. JavaとPythonとの関係
関係
  • 構文とスタイル: Pythonの構文はJavaと異なりますが、基本的なプログラミング概念(変数、関数、ループ、条件分岐など)は共通しています。
  • オブジェクト指向: Pythonもオブジェクト指向プログラミングをサポートしており、JavaのOOPの知識がPythonで役立ちます。
習得の容易さ
  • Javaで学んだ基本的なプログラミング概念やアルゴリズムの知識は、Pythonにも直接適用できます。
  • PythonはJavaよりも文法が簡潔で、初心者にとって習得が容易です。難しいJavaを先に学べば習得は容易になるでしょう。
分野
  • Python: データサイエンス、AI・機械学習、自動化スクリプト、科学計算。
5. JavaとJavaScriptとの関係
関係
  • 名前の混同: JavaScriptは名前に「Java」を含んでいますが、実際にはJavaとは異なる言語です。ただし、JavaScriptという名前の由来は、Javaの人気に便乗したものです。
  • 構文と概念: JavaScriptの構文はJavaとは異なりますが、制御文には共通点が多くあります。
習得の容易さ
  • Javaで培ったプログラミングの基礎知識やロジックの考え方は、JavaScriptの学習にも役立ちます。
  • JavaScriptの非同期処理やイベント駆動型プログラミングの概念は、Javaの知識を持つ人には新しい挑戦となりますが、基本を理解していればスムーズに学べます。
  • MicrosoftがJavaScriptを拡張してつくったTypeScriptも狙い目です。TypeScriptは、その名の通りJavaScriptに静的型付け(type)を追加した言語でありオブジェクト指向をサポートしています。
分野
  • JavaScript: フロントエンド開発(ブラウザ側の処理)、サーバーサイド開発(Node.js)、モバイルアプリ開発(React Native, Ionic)。

調べてみましょう

なぜ、いろいろなプログラミング言語があるのでしょうか?その理由を推測した上でインターネットで調べてみてください。

あなたの推測:
調べたことのメモ:

2.Javaプログラムの実行

Javaでプログラムコードが実行されるまでには以下のような2つのステップを経ます。

①プログラムコードがコンパイルされてバイトコードが作られる。
②バイトコードがJVMによって実行される。

これが例えばC言語ですと、

①プログラムコードがアーキテクチャ(OS等)に応じた形でコンパイルされてマシン語が作られる。
②マシン語が実行される

という流れになっています。

つまり、下図のようにJVMが各種OSとプログラムの間を仲立ちしてくれるため、プログラマーがアーキテクチャを意識しなくて済むのです。

新人エンジニアが最初に知っておきたいJVMの知識
JVMがOSの違いを吸収する

JVMによってJavaは、

"Write once, run anywhere" 「一度(プログラムを)書けば、どこでも実行できる」

という優れた特徴を有しているのです

以下のプログラムを講師の指示に従ってエディタに入力してみましょう。

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

キーボードから入力できる文字には全角文字と半角文字があります。数値や英字を入力する際には全角文字が入らないように気をつけてください。私は、全角の半角英数字記号が入らないように日本語入力システム(IME)の設定を変えています。IMEによって方法が違いますので、興味があればインターネットで調べてください。

入力したら、講師の指示に従って(Cドライブ直下に作成したjavaフォルダに)新規保存します。

その際のファイル名は、「Example01.java」です。

コマンドラインでコンパイルして実行してみます。

コンパイル方法は講師が案内します。

> javac Example01.java ←①
> java Example01 ←②
Hello  World ←③

①プログラムコードがコンパイルされてバイトコードが作られる
②バイトコードがJVMによってメモリにロードされ、実行される
③実行結果が表示されました

①のところでは拡張子を付けたのに対して、②では拡張子をつけていない点に気をつけてください。

画面に「Hello World」と表示されたと思います。

※なお、Example01.javaというソースプログラムとExample01.classというクラスファイルが作られています。
どこに作られたか講師の指示の下、各自で探してみてください。

誤解が多いのですが、このプログラムコードが動作するわけではありません。現在のノイマン型コンピュータでは、このプログラムコードがメモリにコピー(ロード)されて動きます。この点が、後で重要になってきます。なお、コマンドラインでコンパイルするのは手間がかかるので今回限りにしましょう。次からは、統合開発環境【Integrated Development Environment:以下、IDEと略す】を使っていきます。ショートカットキーひとつでコンパイルと実行を同時にしてくれますので便利です。(ちなみに【compile】というのは「編集する」という意味です。それとは別に【interpret】「翻訳」する言語もありますので調べてみてください)

ここまでに出てきた用語をまとめます。

覚える必要はないですが下図で概要を理解して下さい。

まず、みなさんがソースコードを入力するのがIDEです。IDEはJDK【Java Development Kit:Java開発環境】を利用しています。JDKの中にはJRE【Java Runtime Environment:Java実行環境】とコンパイラ等があります。そしてJREの中にJVM【Java Virtual Machine:Java仮想マシン】とAPI【Application Programming Interface:標準API】があります。APIについては後述します。

JVM、JRE、JDK、IDEの関係
JVM、JRE、JDK、IDEの関係

これからIDEを使って開発をしているとこういった縁の下の力持ちの存在を忘れがちですが、時々思い返すようにしましょう。ここでは、さらに詳しくJava言語のプログラムコードを見てみましょう。

調べてみましょう

Javaはコンパイラ言語です。一方でスクリプト言語というものもあります。スクリプト言語の具体例とコンパイラ言語と比較した場合の特徴を調べてみましょう。例えば、コンパイラ言語はコンパイルの時点で文法エラーが発見できるのが利点です。

調べたことのメモ:

3.Javaプログラムの構成

今度は、Example01をIDEに入力して実行してみましょう。

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

実行の方法はIDEごとに違いますので講師から説明します。

1行目にご注目下さい。

最初にpublicとあります。

publicとは、「公開」という意味ですが、このファイルがどこから見えるかという公開範囲を表しています。この例のようにpublicをつけるとファイル名とクラス名を同じにしないといけません。しかし、publicを無くすとクラス名を自由につけることができますので試してみて下さい。今のところは先の例のようにあってもなくても構いませんが、あとあとファイルをパッケージというフォルダで管理するようになると問題になります。今から意識するために本書でも付けることにします。

次にclassと書いてあります。

Javaのクラスとは、モノの設計図です。周りを見渡しても工業製品で設計図なしに作られるものはありません。あるいは人間などの生物も遺伝子という一種の設計図を元に体が作られているのは周知の事実です。Javaでは、このモノのことをオブジェクトと呼びます。例えば、今、新入社員の皆さんが同じクラスで研修を受けていますね。みなさんをモノ扱いするのは気が引けるのですが。。。同じクラスにいるということは何らかの共通項があるわけですね。ある会社の本年度採用社員である、ITの仕組みに興味がある、タッチタイピングなどのPC操作はできる、などの。その共通項のひな形(設計図)をクラスといいます。

つまり、オブジェクト指向とは、プログラムをクラスの集合体とみなしましょうという考え方です

オブジェクト指向については後で詳しくお話ししますね。

4.オブジェクト指向のメリットとデメリット

オブジェクト指向とは、プログラムに必要なデータと処理の整理術です

プログラムに必要なデータと処理を、現実のモノと同じように1つのクラスにまとめて整理しようという考え方です。データと手続きを別個に整理するプログラミング方法がありましたが、それではうまくいかないことも多かったため生まれた考え方です。Javaでは、プログラムはクラスを複数組み合わせて作り上げます。

そもそもなぜ、オブジェクト指向が生まれたかといいますとそれはメンテナンスしやすいプログラムを作るためです

多くの予算を使って作ったシステムは、業務内容の変更や改善、法律の改正などにかかわらず長く使い続けていきたいものです。そんな時に、モノの世界はどうしているでしょうか?例えば、パソコンというものを考えた時に、パーツが古くなったらパーツだけを変えることができますよね。一部分を変更しても全体には影響しないようになっています。オブジェクト指向も正にその点を考えて作られているのです。

ただし、デメリットとしては、最初作るときは色々なことを考慮しなくてはいけないので大変です。とりあえず動かしてそれで良し、というのでしたらオブジェクト指向のメリットは受けづらいのです。そのため、なかなか新人エンジニア研修の数か月間ではそのメリットを感じられないかもしれません。

もしも、みなさんから「オブジェクト指向が有効な事例を1つ挙げよ」と言われたら、私はこのJava自身を挙げるでしょう。皆さんが新人エンジニア研修を受けている時点でJavaの最新バージョンはいくつでしょうか?1990年代から現在に至るまで、時代の変化とともに求められる技術は変化してきましたが、古い仕様にも対応しながら新しいその変化にJavaが追いついている(※)ということ自体がオブジェクト指向言語の有効性を証明している、と私は思います。

※これを後方互換を保っているといいます。

5.本記事の方針

クラスにはこれからの研修でやるように自分達で作るものもあれば、標準API(Application Programming Interface)といってJavaの中の人(?)があらかじめ作ってくれているものもあります。標準APIの中にあるクラスを私が数えたところ、Java8の場合は3133個もありました。あるいは、サードパーティーが作成したクラス、自社で開発したクラスなど無数のクラスが世の中にはあります。プログラムでやりたいことがある場合、自作するのではなく、既存のクラスの活用を考えてください。なぜなら、自分で作成したクラスにはバグがある可能性があるからです。皆が使っているクラスにはバグがある可能性は低いからです。

※ちなみになんでも自作にこだわることを"車輪の再発明"と言って戒めることがあります。

ここで、この記事の方針を説明します。

この記事では、

①JavaのことはJavaに訊け、の精神で標準APIや標準APIのソースコードを例にとって解説します。
②当社が受講者に課す最終課題をやり抜く上で必要となるクラスを中心に紹介します。
③プログラミング言語は国際語であるという点を踏まえて英語の意味から解説します。

ただし、もうお分かりのようにJavaのすべてを網羅しているわけではありませんのでご了承ください。

①JavaのことはJavaに訊け

ということで皆さんには3つの武器を紹介したいと思います。

その武器とは、下図1.3の①標準API、②Java標準APIのソースコード、③サンプルプログラム です。

例えば、皆さんは英語を勉強したときに英語辞典や例文集を使ったのではないでしょうか?人によっては英英辞典を使ったという強者もいるかもしれません。

標準APIはいわば英語辞典です。分からないクラスがあれば参照するようにしましょう。

②Java標準APIのソースコードは英英辞典です。JavaのことがJava言語自身で書かれています。

どうやって見るかは講師から説明があります。どんなシステムでもそうですが、ソースコードを読み解けたらとても強い武器になります。今からその習慣をつけてください。

※それにしてもJavaのソースコードは短いですね。Systemのような最重要クラスでも1,200行くらいです。しかも、ほとんどがコメントという人間に向けたメッセージです。皆さんが作るクラスもシンプルを心掛けたいものです。

③サンプルプログラムは特に覚えてしまって損のない表現を掲載しました。

英会話と同じように文法を覚えただけでは使いこなせませんが、イディオムを覚えることでJavaを徐々に自分のものにすることができます。

新人エンジニア
Java言語学習3つの武器

ところで日本語が完璧に話せるという人は皆さんの中にいますか?あるいは子供のころから勉強してきた英語はどうでしょうか?Javaも一つの言語なので習得には時間がかかります。じっくりと付き合うつもりでいてください。とは言っても語学と異なり、Javaで覚えることはほとんどありません。プログラムは理解が大切です。理解すれば記憶もはかどります。決して暗記し倒すことのないようにしましょう。

6.クラスのメンバ(フィールドとメソッド)

※以下のお話は少し高度な論点を含んでいます。詳しくは全連載を通じてお伝えしますが、ここでも簡単に触れておきたいと思います。

全てのソースコードはクラスに属する必要があります。クラスの識別のためには、クラス名が必要です。なお、クラス名は自由に設定できますが、先頭の文字はアルファベットの大文字にします。
例:Example01

下図のとおりクラスはフィールド【field】とメソッド【method】を持つことができます

フィールドとメソッドをあわせてメンバという
フィールドとメソッドをあわせてメンバという

フィールドとは「場」のことで、データやオブジェクトの置き場所のことです。メソッドとは「方法」のことで、処理や操作のことです。

そして、フィールドとメソッドを合わせてメンバ【member】といいます

例えば、新入社員オブジェクトであれば誰でも、プログラミング経験年数や所有パソコンなどのフィールドを持っていますね。また、新入社員オブジェクトは、挨拶をする、プログラムを書く、などのメソッドを皆が持っています。メソッドはメソッド名()と後ろに丸カッコがついているのでそれと知ることができます。「Example01」ではmain()というメソッドがあるのが分かりますか?

メソッドの書式は以下の通りです。

[修飾子] 戻り値のデータ型 メソッド名(引数1, 引数2, ….){
}

{ } 波カッコの中(ブロックといいます)に命令文を書きます。開きカッコと閉じカッコの対応が取れていないというのは初学者に多いミスです。気をつけましょう。main()はメインメソッドと呼ばれる特別な処理で、JVMがプログラムをここから始めるため、エントリーポイントとも呼ばれます。プログラムを実行するためには、必ず、どこかのクラスに1つメインメソッドが必要です。

main()の前についているpublic static voidというものについて説明します。ただし、public staticは修飾子なので後回しにします。“beautiful flowers” と言うべきところを単に“flowers ” と言っても意味は通じますからね。voidは、メソッドの戻り値が“ない”ということを表しています。皆さんはパスポートの期限が切れてvoidというスタンプが押されたことがありますか?あれは無効という意味です。main(String[] args)という風に、()の中に仮引数(かりひきすう)というものを書くことができます。argsというのは、変数名と呼ばれるものです。プログラム実行時に引数として指定した文字列をこのメソッドの中で使う際にargsという名前で呼び出すことができるようになるという仕組みです。本当は仮引数の名前は何でも良いのですが、メインメソッドの場合は伝統的にagrs【arguments:引数の略】が使われます。このprintlnメソッドにはオブジェクト指向の全エッセンスがあると言っても過言ではありません。

つまり私たちは次の3つを知っていれば、このメソッドが利用できるのです。

①メソッド名、②引数の数と型、③戻り値の有無と型

Systemoutの詳細を知らなくても全く問題がなく使えているのです。このように抽象化(ブラックボックス化)を進めるというのがオブジェクト指向の考え方の根幹です。TVのリモコンと同じで仕組みがわからなくても使いこなせるのです。

7.エラーを恐れない

では、ここで実験をしてみましょう。以下のコードを実行するとどのような結果になるでしょうか?

public class Example02 {

    public static void main(String[] args) {
        main(new String[]{"Hello"});
    }
}

※ここでは、「Example02」とクラス名を変更しています。Javaファイルはパッケージというフォルダに入れて管理されます。今回は無名パッケージ(デフォルトパッケージとも呼ばれる)というところに保存されています。
そのため、先の「Example01」と同じファイル名を付けられないためこのようにしています。
パッケージ管理については重要なテーマなのであらためて解説します。 

メインメソッドの中でメインメソッドを呼んでいます。呼ばれたメインメソッドの中でもさらに次のメインメソッドを呼び出して延々終わりません。このようにあるメソッドの中で自分自身のメソッドを呼び出すことを再帰処理といいます。ただし今回の場合は、下図のようにエラーを出してプログラムは終了してしまいます。

<結果>

Exception in thread "main" java.lang.StackOverflowError
at Example02.main(Example02.java:4)

(中略)

エラーメッセージ

Stack(スタックを)Overflow(溢れ出した)Error(エラー)ということですね。

※試しにこのエラーメッセージをグーグルで検索してみて下さい。

しかし、パソコン自体は何のダメージも受けていません。皆さんが書いたJavaプログラムが原因でパソコンが壊れることはあり得ません。安心してどしどしエラーを出してください。詳細はまた、例外処理というところでお話ししたいと思います。

エラーはできるだけ早く起こるほうがいいですか?それとも後から起こるほうがいいですか?

後から起これば、それだけ被害は甚大になります。Javaは早期にエラーを出してプログラマーに警告するという思想で作られています。エラーは大歓迎すべきなのです。

8.プログラムはメモリ上にロードされて実行される

先のスタックオーバーフローの例で理解していただきたいのは、メソッドはメモリのスタック領域というところ保存されるということです。メソッドは呼び出された順に下から上に積み上げられていくということです。データ構造のところで学んだかもしれませんが、スタック(stack)は積み上げという意味です。先入れ後出しのデータ構造です。下図のようなイメージです。メモリのスタック領域が上へ上へと積まれたメインメソッドで覆いつくされてしまったのです。

メモリのスタック領域のイメージ
メモリのスタック領域のイメージ

メソッドがこのように古いものから新しいものへどんどん積み重ねられるというイメージを持つようにしてください。新人エンジニアの方でこのプログラムが理解できない人は多いです。その理由は、ソースコードが動くと思っているからです。

実は皆さんが書いたソースコードは動きません

ソースコードがメモリにロードされてマシン語になって動いているのです。

つまり、上記のスタック領域の図です。このことが分かれば躓かないと思いますので、しっかり理解しましょう。

先ほど省略したメソッドの修飾子についても少しだけ触れておきます。publicとは、アクセス修飾子と呼ばれるもので、このメソッドがどのクラスから利用できるかを表しています。英語のpublicには公開という意味がありましたね。publicはアクセス修飾子の中で最も広く多くのクラスから利用できるという意味です。なお、メインメソッドはプログラム実行の開始点であるエントリーポイントとして、JVMから利用されるためにpublicでなければなりません。

static修飾子は、インスタンス(実体)というものを作らなくても利用できるメソッド(staticメソッド)であるということを示しています。英語のstaticには「静的」という意味があります。インスタンスを作ってそのインスタンスがメモリ上で動的に処理をするDynamicというのと対極のイメージです。今回、インスタンスを作った覚えはありますか?ありませんね。ですので、これだけでいきなり実行できるメソッドです。ちなみに英語でも"for instance,"と言えば「例えば、」とか「具体的には、」という意味ですが、具体的な実体がインスタンスですね。先の新入社員クラスの例でいえば、鈴木さん、佐藤さんといった実体のある個々人のことです。ここは、オブジェクト指向で最も大切なところですから、後で詳しく説明したいと思いつつ、先を進みますね。

CPUとメモリの関係

プログラミングにおいて、CPU(中央処理装置)とメモリ(主記憶装置)はそれぞれ異なる役割を果たします。簡単に言えば、CPUはプログラムの実行や計算を担当し、メモリはプログラムやデータの格納場所です。

CPUはコンピュータの「脳」とも言われる部分です。プログラムの実行や計算を担当します。CPUは命令を解釈し、データを処理し、必要な演算を実行します。プログラムが実行される際に、CPUはプログラムの命令をメモリから読み込み、実行します。CPUは高速な演算処理能力を持ち、プログラムの実行速度に影響を与えます。

一方、メモリはデータの一時的な格納場所です。プログラムやその実行中のデータがメモリに格納され、CPUが必要なデータを効率的にアクセスできるようにします。メモリは読み書きが高速であり、CPUがデータを必要とする際に迅速に提供します。CPUはメモリからデータを読み込んで処理を行います。メモリには十分な容量と高速なアクセス速度が求められます。

9.システムに必要なIPO

システムという言葉を聞いて皆さんは何を思い浮かべますか?システムとは仕組みのことです。

そしてシステムにはIPOがあります

つまり、Input,Process,Outputです

例えば、パソコンも一つのシステム、人間も一つのシステム、会社も一つのシステムと捉えることができます。(下図)

システムのIPO
システムのIPO

皆さんも今、新人エンジニア研修でインプットしつつ、自分なりにそれを処理して、アウトプットしていますね。そして、システムはサブシステムから構成されています。人間ならいろいろな臓器から成り立っていますね。また、その臓器もいろいろな細胞の集まりです。Javaプログラムも同じです。そのシステムの一番小さな単位をメソッド【method)】といいます。

皆さんは中学生時代に文字式というものを習ったと思います。

y = 2x + 1

のような式です。

xの値が変化するにつれてyの値も変化しました。この時のyが戻り値、xが引数です。例えば、あなたが電卓プログラムを作成し、2つの整数の足し算ができるようにしたいとしましょう。そのとき与える2つの整数にaとbのように仮の名前を付けておく必要があるのです。

y = a + b

仮の引数なので仮引数といいます。後に、そのプログラムを使って実際に足し算をするとします。「1 + 2 = 3」という計算をしたいとしましょう。このとき与える2つの整数、1と2は実際の引数ですから実引数といいます。戻り値は結果の3です。なお、仮引数や戻り値はデータ型を示す必要があります。上記の例では、整数値ということになります。

Hello Worldのプログラムに戻りましょう。あそこで書いた仮引数String[]というのはString型の配列、つまり、文字列を複数取ることができるということを示しています。(配列の詳細は後述)4行目を見てみましょう。

System.out.println("Hello World");

となっています。

ここまでの知識の応用で、この1文を読み解いてみましょう。まず、Systemと頭文字が大文字なのは、これがクラスだということを表していますね。Systemはその名の通りあなたが現在お使いのパソコンのシステムのことです。"."は、日本語に直せば「の」という意味です。Systemクラス「の」out「の」printlnメソッドを使っているというところまでは、よろしいでしょうか?outは、Systemクラスで定義されているフィールドです。フィールドは初めて実物が出てきましたね。やや強引ですが、この一文の解釈は、新入社員.パソコン.画面表示("Hello World")のようなイメージでしょうか。今回の実引数は"Hello World"という文字列です。println()は、引数の内容を画面表示して改行する(new line)というメソッドです。命令文の終わりには;を付けます。※println()によく似たprint()もあります。何が違うか試してみましょう。

プログラムの単語と単語の間に半角スペースや改行を入れる目的は、
①単語と単語を分けるため 
②見やすさのため 

の2点です。

よって、単語の途中でなければどこに入れても構いません。

※ただし、極端な記述は読み手を惑わせます。研修内で説明するIDEのフォーマット機能を使って常に見やすいコードを心がけてください。

ほんの少しの処理をさせるために、ずいぶんたくさん書かないといけないのだな、という感想を持たれた方もいらっしゃるかもしれません。しかし、ルールが多いということのメリットとして、多くの人が協力してプログラムを作成する際に有利に働くのです。大勢の車が高速で行き交う高速道路には厳しいルールがあります。大勢の人で高性能のソフトウェアを開発する場合もルールは厳しい方が良いのです。金融やインフラなど間違いが許されない分野でJavaが使われている理由でもあります。

以上、相当細かいことまで最初にお話ししましたが、ここでお話したことはこれからも繰り返し出てくる重要なトピックです。ゆっくり理解いただければ結構です。

ひとまず、Javaプログラムにおいては、

①大文字と小文字は区別される
②{ と } は必ず1対1の対応を持っている
③{ } で囲まれた範囲を「ブロック」と呼ぶ

といったことを覚えましょう。

また、プログラムコードを見やすくするための字下げを「インデント」と呼びます。さらに、後々まで使用する各種記号のうち、新入社員のみなさんが呼び方を迷いそうなものを章末にまとめておきましたので参考にしてください。

10.コメントの入れ方

コメントは人間に向けたメッセージです。他人に向けたメモです。将来の自分自身も他人のようなものなので、コメントを書いておくことは非常に重要です。

今度は、Example03をIDEに入力して実行してみましょう。

/**
 * 画面表示
 * 作成者 yamazaki
 * 作成日 20XX/11/09
 */
public class Example03 {
    public static void main(String[] args) {
        //Hello Worldと画面に表示する
        System.out.println("Hello World");
    }
}

Javaのコメントは上記のように

①/* と */ で囲んだ複数行をコメントにする
②// をつけて、1行だけコメントにする

という2つの方法があります。

さらに/**で始まるコメント形式はJavadocというAPI仕様書を作ることのできる書き方です。機会があればJavadocの作り方もご紹介します。

※コメントアウトといって一時的にプログラムをコメントにしてプログラムでなくすることも良くあります。

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

コメントアウトした部分はプログラムではなくなる訳ですね。IDEを使っているとコメントのショートカットキーを使って素早く実現できます。方法は講師にお尋ねください。なお、納品するプログラムにはコメントアウトしたソースコードを含めないようにしましょう。本書では解説の文章と重複することも多いため、コメントは最小限にしています。ご了承下さい。その代わりにみなさんがノート代わりにソースコードのポイントにコメントを入れることは賢い勉強方法だと思います。

11.エラーへの対処

コンパイルするときにエラーが表示されることがあります。

例えば、

System.out.println("Hello World")

のように文末のセミコロンを忘れたまま実行すると下図のようなメッセージが表示されます。

C:\Users\tisa01\Documents\NetBeansProjects\JavaExercise2021\src\Example04.java:4: エラー: ';'がありません
System.out.println(" Hello World ")

エラーメッセージ

といったエラーメッセージが表示されました。ついでにソースコードに全角スペースを入れてしまうというのも初学者がやりがちなミスです。どんなエラーメッセージが出るか、今ここで試してみてください。このエラーメッセージをよく読まない人がいます。エラーメッセージにはエラーに関する重要な情報が含まれています。

たとえば、先の例では、

Example04.java:4

という風にExample04の4行目がエラーの原因であるといったことが表示されています。

エラーメッセージをよく読むことがプログラミング上達の秘訣です。

ぜひ、エラーメッセージをグーグル検索する習慣をつけて下さい。

なお、このようにコンパイラが口うるさいのはとても良いことです。プログラムの実行前にエラーがあることを人間に教えてくれているわけですから。

Javaのエラーには以下の3種類があります。

①文法エラー(Syntax error) コンパイル時にエラーが発覚する。
②実行時エラー(runtime error) コンパイルは通るが実行中に異常事態が発生し、プログラムの実行が強制終了する。
③論理エラー(logic error) 実行できるが、実行結果が意図したものと違う。

当社の新人エンジニア研修ではIDEを使用します。

  • ①の文法エラーは、IDEがエラーを教えてくれるので、指示に従って直すようにしてください。ただし、全角文字や全角空白を使用している場合のようにメッセージでは分かりにくい文法エラーもあることは念頭に置いてください。
  • ②の実行時エラーは例外処理をします。
  • ③の論理エラーはテストというテーマでお話しします。

なおタイミングを見計らってデバッガを使ってエラーの原因を追求する方法をお話するつもりです。

12.標準出力

「Hello World」の文字列が表示されたところをコンソールといいます。コンソールに出力することは欠陥を除去するデバッグ作業という意味でも重要な行為です。目に見えないものは直しようがないからです。コンピュータ上で実行されているプログラムが、標準的に利用するデータ出力先を標準出力といいます。コマンドプロンプトの画面やIDEのコンソールなどが標準出力の例です。

Javaで標準出力に出力したあと改行するには、

System.out.println(出力する内容);

と書きます。

改行が不要であれば、

System.out.print(出力する内容);

でしたね。

標準出力以外ではWebページに出力するということもやる予定です。

お楽しみに!

<まとめ:隣の人に正しく説明できたらチェックを付けましょう>

□ JVMによってJavaは、「一度(プログラムを)書けば、どこでも実行できる」という優れた特徴を有している
 
□ オブジェクト指向とは、プログラムを現実のモノのようにデータと処理を一つに整理したものであり、クラスを組み合わせることでメンテナンスしやすいプログラムを作ることができる
 
□ ①標準API、②標準APIのソースコード、③サンプルプログラム、は3つの武器であり、ソースコードが読めるエンジニアは強い
 
□ クラスはメンバを持つことができ、メンバにはフィールドとメソッドがある
 
□ プログラムはメモリ上にロードされて実行される
 
□ システムにはIPOが必要である
 
□ エラーメッセージをよく読む、メッセージをまるごとグーグル検索する

まとめができたら、アウトプットとして演習問題にチャレンジしましょう。

参考:本研修で使用する記号一覧

新人エンジニアの皆さんは、これまでの生活の中でどの程度記号を意識してきたでしょうか?

以下の記号は決して顔文字を作るためにあるのではありません。ITエンジニアは記号を使いこなすことができなくてはいけません。下表1.1では本研修に出てくる主な記号をご紹介しています。

 

記法

呼び方

本研修中の主な用途

1

()

丸カッコ

Javaでメソッドの引数を指定する、演算の優先順位を高める。 正規表現では、グループ化。

2

[]

角カッコ

Javaで配列の添字を囲うのに使う。正規表現では []内のいずれか1文字。

3

{}

波カッコ

Javaでブロックの範囲を示す、配列の初期化をする、WebアプリケーションのELで使う。正規表現ではA{n}で直前の文字Aの出現回数nを指定する。

4

<>

山カッコ

Javaのジェネリクスで「型」をパラメータとして定義するときに使う、HTMLのタグに使う

5

;

セミコロン

Java、JavaScript、MySQL、CSSの属性値で文末につける

6

:

コロン

Javaのswitch文、拡張for文や三項演算子に使う。CSSの属性値の設定に使う。

7

,

コンマ

Javaでリテラルや変数、インタフェースを列挙する

8

.

ドット

Javaでドット演算子に使う。パスの指定ではカレントディレクトリを表す、2つ重ねると親ディレクトリを表す。 正規表現では任意の1文字を表す。

9

/

スラッシュ

Javaで一行コメント、UNIX(URL)のパスの区切り文字

10

\

バックスラッシュ

(円マークともいう)

Javaでエスケープシーケンスを示す、Windowsのパスの区切り文字。 正規表現で直後のメタ文字をエスケープする。

11

"

ダブルクオーテーション

Javaで文字列リテラルを囲む、MySQLとJavaScriptで文字列を囲む

12

'

シングルクォーテーション

Javaでchar型の文字を囲む。MySQL とJavaScript で文字列を囲む

13

%

パーセント

Javaで剰余演算、JSPでタグの構成要素。MySQLで任意の文字列

14

_

アンダーバー


(アンダースコア)

Javaで定数の区切り文字、複数行コメントの構成要素、MySQLのLIKE句で任意の一文字

15

*

アスタリスク

Javaで乗算演算子、複数行コメントの構成要素、複数クラスのインポート。MySQLですべての列の選択正規表現では直前のパターンの0回以上繰り返し。

16+プラス

Javaで加算演算子 、文字列の結合演算子。正規表現では直前のパターンの1回以上繰り返し。

17

?

クエスチョン

Javaの三項演算子、WebアプリケーションのURLとリクエストパラメータの 区切り文字として使う、JDBCでプレースホルダとして使う。正規表現では直前のパターンの0~1回繰り返し。

18|パイプ(パイプラインともいう)
||と2つ続けてJavaの論理演算子の論理和を意味する。正規表現では左右の文字列のいずれか。
19アンパサンド
&&と2つ続けてJavaの論理演算子の論理積を意味する。Webアプリケーションのリクエストパラメータが複数あるときの区切り文字として使う。
20$ドル(ダラーともいう)
Javaで変数名の先頭に付けられる、WebアプリケーションのELの先頭に使う。正規表現で論理行末。
21^ハットまたはキャレット数学でべき乗の指数。正規表現で論理行頭または、[^~]で~に含まれない1文字。
22=イコールJavaの代入演算子、==で2 つの値が等しいかどうかを調べる関係演算子。JavaScriptでは===で厳密等価演算子。HTMLで属性値の設定に使う。
表1.1 本研修で使用する記号一覧

以上、今回は「Java言語の特徴」について見てきました。後々にならないと意味の分からないところも多いと思います。研修をある程度進めてから改めて読むと良いと思います。

次回は、「Javaの変数とデータ型」を学びます。

Java言語を初めて学ぶ新人エンジニアの皆さんへ 最後までお読みいただきありがとうございます。