支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


はじめに

「Javaを始めて間もない」、「基本文法をおさらいしたい」方向けにJavaの基本文法について4回にわたってご紹介します。 今回ご紹介する基本文法は、以下のラインナップとなります。

  • 部品化
  • オブジェクト指向

部品化

1.複数メソッドの分割

第3回では、コードが長く複雑になってしまうことを防ぐために、複数のメソッドに分割する方法をご紹介しました。 しかし、いくらメソッドを分割したと言っても、1つのソースファイル内に含まれるメソッド数が増えると、コード全体の把握が難しくなります。
1つのソースファイルに全てのメソッドを書くのではなく、複数のソースファイルに分割して記述していきます。 ソースファイルには、クラスブロック(第1回目はこちら)を最低でも1つ作成しなければなりません。 つまり、ソースファイルを分けるということは、クラスを分けることと同じであると言えます。 複数のクラスを分けることで、次のようなメリットがあります。

 【複数のクラスに分けるメリット】
  • コードが整理されるため、全体を把握しやすくなる
  • ファイルが分かれるため、分業して開発を進められる

このように1つのプログラムを複数のコード(部品)に分割することを、部品化と言います。 この考え方は、オブジェクト指向を理解する上で重要になります。

複数に分割したソースファイルは、mainメソッド「main()」内にて、「クラス名.メソッド名」で呼び出せます。 この「.(ドット)」は「~の」という意味です。
Calculatorクラス(mainメソッド有り)からCalculationクラスのsumNumメソッドminusNumクラスmultiNumクラスdivNumクラスを呼び出したコードが次のようになります。

//Calculatorクラス(mainメソッド有り)
 public class Calculator {

 public static void main(String[] args) {
  int x = 4;
  int y = 10;

  System.out.println("x = 4, y = 10");
  System.out.println("x + y = " + Calculation.sumNum(x, y));
  System.out.println("x - y = " + Calculation.minusNum(x, y));
  System.out.println("x * y = " + Calculation.multiNum(x, y));
  System.out.println("x / y = " + Calculation.divNum(x, y));
 }
}
//Calculationクラス
public class Calculation {

 public static int sumNum(int x, int y) {
  int z = x + y;
  return z;
 }

 public static int minusNum(int x , int y){
  int z = x - y;
  return z;
 }

 public static int multiNum(int x, int y) {
  int z = x * y;
  return z;
 }

 public static double divNum(double x, double y) {
  double z = x / y;
  return z;
 }

}
実行結果
x = 4, y = 10
x + y = 14
x - y = -6
x * y = 40
x / y = 0.4

2.複数クラスの分割

部品化の仕組みは、以下の図のようになります。

1.メソッドの分割では、メソッドが増えすぎた場合に複数のクラスに分割(部品化)するというものでした。
クラスが増えすぎた場合は、どうなるでしょうか? クラス数の増加もコード全体の把握を難しくします。

そこで、Javaには、各クラスをパッケージというグループに分類して、管理する仕組みがあります。
つまり、部品化の仕組みは次のようになります。

クラスをパッケージに所属させるには、「package パッケージ名;」をソースコードの先頭に記述します。 パッケージ名は、Javaの識別子のルールに従っていれば、自由に決められますが、アルファベット小文字で使用するのが一般的です。
また、「.(ドット)」で区切ったパッケージ名も多く用いられます。

Calculatorクラス、Calculationクラスを、calcパッケージに所属させてみます。

package calc;
//Calculatorクラス(mainメソッド有り)
 public class Calculator {
package calc;
//Calculationクラス
public class Calculation {

また、別パッケージからcalcパッケージに所属しているCalculatorクラスを利用する場合は、「パッケージ名.クラス名」で呼び出す必要があります。 この「パッケージ名.クラス名」を完全限定クラス名(FQCN)と言います。

app.mainパッケージから、calcパッケージのCalculationクラスのsumNumメソッドを呼び出してみます。

package app.main;

public class App {
 public static void main(String[] args) {
  calc.Calculation.sumNum(4, 10);

calcパッケージのCalculationクラスを呼び出す際は、毎回完全限定クラス名「calc.Calculation」を指定しなければならず、非常にめんどくさいです。
完全限定クラス名の入力を省くためには、「import パッケージ名.クラス名;」をソースコードより前、packageより後に記述します。 これによって、完全限定クラス名を毎回指定する必要はなくなります。

package app.main;
import calc.Calculation

public class App {
 public static void main(String[] args) {
  sumNum(4, 10);

オブジェクト指向

Javaの根幹となる「オブジェクト指向」についてご紹介していきます。
オブジェクトとは、「モノ」という意味です。 オブジェクト指向とは、機能や役割を区別し、それぞれを部品(モノ)として組み合わせることで1つのプログラムを作成しようという考え方を指します。
自動車製造を例にオブジェクト指向について考えていきましょう。

自動車は、エンジンやハンドル、タイヤといった様々な部品(モノ)を組み立てて製造されます。 また、それぞれの部品は、別の工場で製造されます。
更に、エンジンやハンドル、タイヤといった様々な部品も別の工場で製造されて組み立てられます。
もし、工場1~工場4それぞれで部品の製造、組み立てを行うと様々な問題が発生すると考えられます。

    【問題】
  • 全ての工場に同じ製造機械を導入しなければならない
  • 部品に欠陥があった場合に、どの工場の部品か特定しにくい
  • 部品の変更があると、全ての工場で変更する必要がある  等

自動車製造をプログラム開発に置き換えてみます。

自動車製造 プログラム開発(Java)
自動車 プログラム
組み立て工場 mainメソッド
自動車の構成部品
(エンジン、ハンドル、タイヤ等)
オブジェクト
自動車の構成部品製造工場 クラス
エンジンを構成する部品 メソッド

オブジェクト指向は、「プログラムの構成部品毎に開発していこう」というイメージです。 オブジェクト指向における部品化のルールは、「現実世界で出てくる単位(物)で、クラスに分割する」です。 つまり、現実世界で出てくる物とその振る舞いをコンピュータ内の仮想世界で再現するということが、オブジェクト指向の本質と言えます。

「オブジェクトをどのようにして作るか、オブジェクト同士をどのようにして連携させるか」を第一に意識して開発していくことが大事です。


まとめ

今回は、「部品化」、「オブジェクト指向」についてご紹介しました。 4回にわたってJavaの基本的な文法をご紹介してきましたが、Javaのほんの一部にしか過ぎません。 例外処理、API、コレクション、ストリーム等まだまだありますので、またの機会にご紹介していきたいです。