複数クラスの連携
この章では、複数のクラスを組み合わせてプログラムを作成する方法を学ぶ。 クラスを適切に分割することで、コードの見通しが良くなり、チームでの開発もしやすくなる。
この章で得られるスキル:
- ✅ 機能ごとにクラスを分けて整理できる
- ✅ 他のクラスを呼び出して連携させられる
- ✅ 大規模なプログラムでも見通しよく開発できる
- ✅ チーム開発で役立つコード構成ができる
なぜこの技術が必要か
クラスを分割しないとどうなるか?
クラスを分割しないと、1つのファイルが長くなりすぎ、コードの見通しが悪くなる。
チームで開発しにくくなる。
実行してみよう(改善前):
このように、1つのファイルに全てを書くと、ファイルが長くなり、管理が大変になる。
実行してみよう(改善後):
以下は、計算用のメソッドをMathUtilsクラスに分けた例である。
実際には別ファイルになるが、ここでは実行のために1つのコードブロックにまとめている。
メソッドを別ファイルに分けることで、関連する機能をグループ化し、保守しやすいプログラムを作れる。
前章との繋がり
前章で学んだメソッド(関数)は、定義場所を別ファイルに切り出すことができる。 この章では、 メソッドの定義を別のクラスファイルに分けて、整理する方法 を学ぶ。
1. パッケージとは
パッケージの役割
パッケージ は、クラスを整理するための仕組み である。 複数のクラスを論理的にグループ化することで、大規模なプログラムでもクラスを管理しやすくなる。
パッケージの構造
パッケージは、ディレクトリ(フォルダ)の階層構造に対応する。
src/
com/
example/
myapp/
Main.java
Calculator.java
この場合、Main.javaとCalculator.javaは、
com.example.myappパッケージに属する。
パッケージの宣言
Javaファイルの先頭に、パッケージ名を宣言する。
package com.example.myapp;
public class Main {
// ...
}
パッケージ名の命名規則
パッケージ名は、通常 すべて小文字 で、ドット(.)で区切る。
- 例:
com.example.myapp - 例:
jp.co.company.project
パッケージ(またはモジュール、名前空間)の概念は、多くのプログラミング言語で共通である。
2. import文
import文とは
import文 は、他のパッケージのクラスを使うための宣言 である。
基本的な書き方
import パッケージ名.クラス名;
例
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
}
}
ワイルドカードimport
パッケージ内のすべてのクラスをimportする場合、*(ワイルドカード)を使う。
import java.util.*;
ワイルドカードimportは便利だが、どのクラスを使っているか分かりにくくなるため、 特定のクラスだけをimportする方が推奨される。
3. Eclipseの補完機能
Eclipseの補完機能とは
Eclipseの補完機能 は、コードを効率的に書くための強力なツールである。 タイプミスを減らし、コーディング速度を大幅に向上させることができる。
自動import(Ctrl + Shift + O)
クラス名を書いた後、Ctrl + Shift + O(MacはCmd + Shift + O)を押すと、
必要なimport文が自動的に追加される。
手順:
- クラス名を書く(例:
ArrayList) Ctrl + Shift + Oを押す- 必要なimport文が追加される
コード補完(Ctrl + Space)
コードの途中でCtrl + Spaceを押すと、候補が表示される。
使える場面:
- クラス名の補完:
Arrayと入力してCtrl + Space→ArrayListが候補に出る - メソッド名の補完:
list.aと入力してCtrl + Space→addが候補に出る - 変数名の補完:宣言済みの変数名が候補に出る
テンプレート補完
特定のキーワードを入力してCtrl + Spaceを押すと、コードテンプレートが展開される。
便利なテンプレート:
- for文:
forと入力してCtrl + Space→ for文のテンプレートが展開 - if文:
ifと入力してCtrl + Space→ if文のテンプレートが展開 - sysout:
sysoutと入力してCtrl + Space→System.out.println()に展開
定義へジャンプ(Ctrl + クリック)
Ctrl + クリック(MacはCmd + クリック)で、メソッドやクラスの定義へジャンプできる。
使い方:
- メソッド名やクラス名の上で
Ctrlキーを押しながらクリック - そのメソッドやクラスが定義されているファイルへ自動的に移動する
- 定義を確認したら、
Alt + ←(戻るボタン)で元の場所に戻れる
例:
int result = MathUtils.add(10, 20); // addにカーソルを合わせてCtrl+クリック
→ MathUtils.javaのaddメソッドの定義にジャンプする
Eclipseの補完機能を積極的に活用することで、コーディングが格段に効率的になる。
最初は意識して使うようにし、慣れてくると自然に使えるようになる。
4. 複数クラスの連携
Mainクラスと処理クラス
プログラムを整理するため、以下のように役割を分担することが多い:
- Mainクラス:プログラムの起点(
mainメソッド) - 処理クラス:関連するメソッド(関数)をまとめたクラス
別クラスのstaticメソッドを呼び出す
前章で学んだように、メソッドは public static を付けて定義できる。
別クラスのstaticメソッドを呼び出すには、 クラス名.メソッド名() の形で呼び出す。
// MathUtils.java(別ファイル)
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
// Main.java
public class Main {
public static void main(String[] args) {
int result = MathUtils.add(10, 20); // クラス名.メソッド名()で呼び出す
System.out.println(result);
}
}
このように、 別ファイルで定義したメソッドを、クラス名を指定して呼び出すことができる。
第7章で学んだメソッドを、別のクラスファイルに切り出して整理することで、コードが見やすくなる。 前章のメソッドは「同じファイル内の関数」、今回は「別ファイルの関数」という違いだけである。
別クラスのメソッドを呼び出す時、クラス名のスペルを間違えるとエラーになる。
int result = MathUtil.add(10, 20); // エラー!MathUtils ではなく MathUtil
エラーメッセージ例:
error: cannot find symbol
symbol: variable MathUtil
原因: クラス名のスペルが間違っている、またはクラスが存在しない。
解決策:
- クラス名のスペルを確認する(大文字・小文字も区別される)
- Eclipseの補完機能(
Ctrl + Space)を使うと、正しいクラス名が候補に出る Ctrl + Shift + Oで自動的にimport文を追加できる
実行してみよう:
実際の開発では、以下のように 別々のファイル として作成する:
ファイル1: MathUtils.java(計算用のユーティリティクラス)
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
public static int subtract(int a, int b) {
return a - b;
}
public static int multiply(int a, int b) {
return a * b;
}
public static int divide(int a, int b) {
return a / b;
}
}
ファイル2: Main.java(プログラムのエントリーポイント)
public class Main {
public static void main(String[] args) {
// MathUtilsクラスのstaticメソッドを呼び出す
// クラス名.メソッド名()の形で呼び出す
int sum = MathUtils.add(10, 20);
int diff = MathUtils.subtract(20, 10);
int product = MathUtils.multiply(5, 3);
int quotient = MathUtils.divide(20, 4);
System.out.println("10 + 20 = " + sum);
System.out.println("20 - 10 = " + diff);
System.out.println("5 × 3 = " + product);
System.out.println("20 ÷ 4 = " + quotient);
}
}
以下は実行可能なコード(1つのコードブロックにまとめたもの):
やってみよう:
MathUtilsクラスに新しいstaticメソッド(例:powerで累乗計算)を追加してみようMainクラスから新しいメソッドをMathUtils.power(2, 3)のように呼び出してみよう
5. クラスの分割の設計
役割ごとにクラスを分ける
プログラムを設計するとき、役割ごとにクラスを分ける ことが重要である。
例:成績管理システム
- Studentクラス:生徒の情報を管理
- Gradeクラス:成績の計算を担当
- Mainクラス:プログラムの起点
見通しの良いコード
クラスを適切に分割することで、以下のメリットがある:
- 役割が明確:各クラスが何をするのかが分かりやすい
- 変更が簡単:1つのクラスを変更しても、他のクラスに影響しにくい
- チーム開発しやすい:クラスごとに担当を分けられる
クラス分割の例
実際の開発では、以下のように 役割ごとに別々のファイル として作成する:
ファイル1: Student.java(生徒の情報を管理)
public class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("名前: " + name + ", 年齢: " + age);
}
}
ファイル2: Grade.java(成績の計算を担当)
public class Grade {
public static double calculateAverage(int[] scores) {
int sum = 0;
for (int score : scores) {
sum += score;
}
return (double) sum / scores.length;
}
public static String getGradeLevel(double average) {
if (average >= 90) {
return "優";
} else if (average >= 70) {
return "良";
} else if (average >= 60) {
return "可";
} else {
return "不可";
}
}
}
ファイル3: Main.java(プログラムのエントリーポイント)
public class Main {
public static void main(String[] args) {
// Studentクラスを使う(newの使い方は次章で学ぶ)
Student student = new Student("太郎", 18);
student.introduce();
// Gradeクラスのstaticメソッドを使う
int[] scores = {80, 90, 75};
double average = Grade.calculateAverage(scores); // クラス名.メソッド名()
String level = Grade.getGradeLevel(average);
System.out.println("平均点: " + average);
System.out.println("成績: " + level);
}
}
以下は実行可能なコード(1つのコードブロックにまとめたもの):
やってみよう:
Gradeクラスに新しいstaticメソッド(例:getMaxScoreで最高点を返す)を追加してみようMainクラスからGrade.getMaxScore(scores)のように呼び出してみよう
クラス分割は、最初から完璧にする必要はない。 プログラムが大きくなってきたら、「この部分は独立したクラスにした方が良いかも」と考えて、 少しずつリファクタリング(コードの整理)していくと良い。
まとめ
この章では、複数クラスの連携 について学んだ。
学んだ内容
- パッケージ はクラスを整理する仕組みである
- import文 で他のパッケージのクラスを使える
- Eclipseの補完機能(
Ctrl + Shift + O、Ctrl + Space)を活用すると効率的にコードを書ける - 別クラスのstaticメソッド を
クラス名.メソッド名()の形で呼び出せる - 前章で学んだメソッド(関数)を 別ファイルに切り出して整理 できる
- 用途ごとにファイル(クラス)、フォルダ(パッケージ)を分ける ことで、管理しやすいプログラムになる
- 役割ごとにクラスを分ける ことで、見通しの良いコードになる
次のステップ
次の章では、例外処理 について学ぶ。 プログラム実行中に発生するエラーを適切に処理する方法を学ぶ。
その後の章で オブジェクト指向の基礎 を学び、 クラスとインスタンスの概念を深く理解していく。