1. はじめに
プログラミングを始めたばかりの頃は、コードを上から順に書いていけば動くように思えるかもしれません。しかし、プログラムが少し複雑になると、どこに何があるのか、なぜそう書かれているのか、1行だけ直したいときにその行がどこにあるのか、頭の中がごちゃごちゃになりがちです。
そこで Java をはじめとする多くのモダンな言語は、いつでもプログラムの動作を理解し、必要な場所をすばやく見つけられるように、コードを「整理整頓」する仕組みを提供しています。
会社を想像してください。人事部、経理部、IT 部門、物流部門などがあります。各部門にはそれぞれの責任範囲、スタッフ、タスクがあります。
Java のプログラムでも、こうした各「部門」に相当するのが クラス です。あるクラスはユーザー関連、別のクラスは計算処理、もうひとつはファイル操作、といった役割を担います。
簡単なプロジェクトの典型的な構成は次のとおりです。
- Main.java — 本社:ここが「エントリーポイント」で、すべてが始まる場所。
- User.java — ユーザーデータの保存と処理を行う部門。
- Calculator.java — 計算担当。
- FileHelper.java — ファイルの専門家。
ごく小さなプログラムでも、通常は少なくとも1つのクラスがあります。大規模なプロジェクトは、何百ものクラスからなる「超高層ビル」のようなものです!
2. クラスは道具箱
Java は オブジェクト指向言語で、すべてがオブジェクトです。オブジェクトの型は クラス と呼ばれます。
クラス は、変数やメソッドといった必要なものを入れておく箱やロッカーのようなものです。「ハンマー」と書かれた箱には、ハンマーに関係する道具だけが入っています。
class Example
{
// ここに私たちの道具(変数とメソッド)が入る
}
クラスは通常、変数と関数を持ちます。Java ではクラスの変数を フィールド、クラスの関数を メソッド と呼ぶのが一般的ですが、意味は変わりません。
最初のコードを覚えていますか?
System.out.println("みなさん、こんにちは!");
このコードにはクラスもメソッドも登場しています。
- System — システム操作用のメソッド群を持つクラス。
- out — PrintStream クラスのオブジェクトであるフィールド。
- println — テキストを画面に出力する、PrintStream クラスのメソッド。
プログラミングとは突き詰めると、自分のクラスやメソッドを書き、それらが他のクラスのメソッドを呼び出す、ということの積み重ねです。
3. main() メソッドの短縮記法
実は、最小の Java プログラムは次のようになります。
class Program
{
public static void main(String[] args)
{
// ここにあなたのコード
}
}
最低でも1つのクラスがあり、そのクラスには次のヘッダー(シグネチャ)を持つ main メソッドが必要です。
public static void main(String[] args)
main メソッドのシグネチャ
しかし Java 21 では、main() メソッドを短く書けるようになりました。Javaコンパイラは(コンパイル時に)それを正しい main() メソッドに変換してくれます。
つまり、次のようなコードを書くと:
void main()
{
Scanner console = new Scanner(System.in);
int age = console.nextInt();
System.out.println("年齢: " + age);
}
Javaコンパイラは次のコードに変換します。
class Program
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
int age = console.nextInt();
System.out.println("年齢: " + age);
}
}
4. 典型的なJavaクラス
典型的な Java クラスは次のようになります。
public class MathUtils
{
// 静的変数(クラス全体で共有)
static final double PI = 3.14159;
static int callCounter = 0;
// 静的メソッド: 円の面積を計算
public static double circleArea(double radius)
{
callCounter++;
return PI * radius * radius;
}
// 静的メソッド: 2つの数の最大値を求める
public static int max(int a, int b)
{
callCounter++;
return (a > b) ? a : b;
}
// 静的メソッド: メソッド呼び出し回数を返す
public static int getCallCount()
{
return callCounter;
}
// main() からフィールドとメソッドを利用
public static void main(String[] args)
{
System.out.println("円の面積: " + circleArea(5));
System.out.println("最大値: " + max(10, 42));
System.out.println("メソッドは " + getCallCount() + " 回呼び出されました");
}
}
ここでわかること:
- クラスは複数のメソッドを持つことができます。
- クラスは独自の変数を持つことができます。
- クラスのメソッド同士は互いに呼び出せます。
- クラスのメソッドは共通の変数にアクセスできます。
- 各メソッドの前には public や static といった同じ「魔法の言葉」が付いています。
- 各メソッドにはそれぞれ異なる型が付いています(int、double、void など)。
これらの点について、以下で順に見ていきます。
5. クラスのフィールド(変数)はその「記憶」
クラスの内部には変数を保存できます。これらはよく フィールド(fields)と呼ばれ、メモリの小部屋のようなもので、データを入れておきます。
public class MathUtils
{
// 静的変数(クラス全体で共有)
static final double PI = 3.14159;
static int callCounter = 0;
}
フィールドによって、クラスは異なるメソッド呼び出しの間に何かを記憶できます。たとえばボタンが押された回数や、メソッドが呼び出された回数(callCounter)などです。フィールドの数に制限はありません。
6. メソッド: クラスが実行できる処理
メソッド は、そのクラスの「できること」です。もしクラスが社員だとしたら、メソッドはその技能(スキル)にあたります。
たとえばメソッドは次のようなことができます。
- 画面に何かを表示する
- 2つの数の合計を計算する
- 「入力」を受け取り、結果を返す
メソッドの構成:
- 戻り値の型(たとえば、何も返さないなら void、数値を返すなら int など)。
- メソッド名(例:circleArea)。
- 括弧内のパラメータ(省略可)。
- 波括弧 { ... } — 本体。
public class MathUtils
{
// 静的メソッド: 円の面積を計算
public static double circleArea(double radius)
{
callCounter++;
return PI * radius * radius;
}
// 静的メソッド: 2つの数の最大値を求める
public static int max(int a, int b)
{
callCounter++;
return (a > b) ? a : b;
}
}
メソッドやその周辺の細かな話は、次回以降の講義で詳しく学びます。
7. アクセス修飾子
Java では、クラスの一部を他のクラスから見えるようにするか、内部専用にするかを制御できます。これに使われるのが アクセス修飾子 です。
- public — 誰からでも見える。プログラムのどこからでも使用・呼び出しが可能。
- private — 同じクラスの内部からだけ見える。外部に晒したくない内部の詳細。まるで存在しないかのように外からは見えません。
public class MathUtils
{
// 静的変数(クラス全体で共有)
private static final double PI = 3.14159;
private static int callCounter = 0;
// 静的メソッド: 円の面積を計算
public static double circleArea(double radius)
{
callCounter++;
return PI * radius * radius;
}
}
黄金律:フィールド は通常 private にし、外部に「公開」するのは必要な メソッド に限って public を付けます。可視性(アクセス修飾子)の詳細は次回以降で扱います。
8. static なメソッドと変数
通常、Java ではクラスをテンプレートとして使い、new キーワードでそのクラスのオブジェクトを生成し、生成したオブジェクトのメソッドを呼び出します。
しかし、もうひとつの使い方として、クラスをグローバルな変数やメソッドのコンテナとして使う方法があります。これに使われるのがキーワード static です。これは Java コンパイラに対して、メソッドやフィールドがクラスのインスタンスではなくクラスそのものに紐づくことを示します。そのため、クラスのオブジェクトを作らずに呼び出すことができます。
実際、以下のようなメソッドは常に使っています。
Integer.parseInt(); // Integer クラスの静的メソッド parseInt()
String.valueOf(); // String クラスの静的メソッド valueOf()
Double.isInfinite(); // Double クラスの静的メソッド isInfinite()
Arrays.copy(); // Arrays クラスの静的メソッド copy()
main() メソッドは常に static として宣言されます。あなたの Java プログラムはそこから実行が始まるため、オブジェクトを作成する前に呼び出されるからです。
9. IDEA の小技
main() メソッドの完全なシグネチャは次のとおりです。
public static void main(String[] args)
これを毎回 IntelliJ IDEA で手打ちしないように、スニペットが用意されています。psvm と入力して Tab を押すだけで、IntelliJ IDEA が次のコードを自動入力してくれます。
public static void main(String[] args)
{
}
覚え方は簡単です。psvm は、public static void main の頭文字です。
GO TO FULL VERSION