メソッドの基本概念と構文定義
Javaにおけるメソッドは、特定の処理や計算ロジックを一つの名前にまとめた再利用可能なコードブロックです。メソッドは独立して実行されるものではなく、必ず定義(作成)を行った上で、他の箇所から呼び出すことで初めて動作します。呼び出し側はメソッド名と必要な引数を指定し、処理結果として戻り値を取得します。
構文の構成要素
public static double processScore(int base, double multiplier) {
double adjusted = base * multiplier;
return adjusted;
}
- 修飾子:メソッドの公開範囲や動作特性を指定(例:
public,private,static,final)。 - 戻り値型:メソッドが返すデータの型。結果を返さない場合は
voidを指定。 - メソッド名:呼び出し時に使用する識別子。キャメルケースが推奨。
- 仮引数リスト:呼び出し側から渡されるデータを受け取る変数の型と名前。不要な場合は空
()とする。 - return文:処理の終了と、指定された型の値の返却を指示。戻り値型が
voidの場合は省略可能。
メソッドの4つの基本的な組み合わせ
戻り値の有無と引数の有無を組み合わせると、以下の4つのパターンが形成されます。
public class MethodPatterns {
// 1. 戻り値なし・引数なし
public static void showBanner() {
System.out.println("=== System Ready ===");
}
// 2. 戻り値あり・引数なし
public static int generateSeed() {
return (int)(Math.random() * 1000);
}
// 3. 戻り値なし・引数あり
public static void printMultiples(int factor, int limit) {
for (int i = 1; i <= limit; i++) {
System.out.println(factor + " x " + i + " = " + (factor * i));
}
}
// 4. 戻り値あり・引数あり
public static double computeCircleArea(double radius) {
return Math.PI * radius * radius;
}
}
各メソッドはシグネチャ(メソッド名と引数リスト)によって一意に識別され、main メソッド内から適宜呼び出してロジックを分離できます。
メソッドのオーバーロード
類似した処理を異なるデータ型や引数の数で実行したい場合、メソッド名を統一し、仮引数のリストのみを変更することで同じ名前のメソッドを複数定義できます。これをオーバーロードと呼び、APIの可読性と一貫性を向上させます。
public class OverloadExample {
public static void main(String[] args) {
int totalInt = merge(10, 20);
double totalDouble = merge(1.5, 2.3, 3.1);
System.out.println("整数合計: " + totalInt);
System.out.println("小数合計: " + totalDouble);
}
// 2つの整数を加算
public static int merge(int a, int b) {
return a + b;
}
// 3つの小数を加算
public static double merge(double x, double y, double z) {
return x + y + z;
}
}
オーバーロードの成立条件は以下の通りです:
- メソッド名が完全に一致していること。
- 引数の数、型、または宣言順序が異なること。
- 注意点:戻り値型の違いや仮引数の変数名の違いだけではオーバーロードとして認識されず、コンパイルエラーになります。
引数渡しの仕組み:値型と参照型
メソッド呼び出し時に渡される値(実引数)が、メソッド内部の変数(仮引数)にどのように割り当てられるかは、データ型によって挙動が異なります。
基本データ型の渡し方
整数や浮動小数点数などのプリミティブ型は、値そのものがコピーされて渡されます。メソッド内で仮引数を書き換えても、呼び出し側の変数には影響しません。
public static void main(String[] args) {
int original = 50;
int bonus = 30;
adjustValues(original, bonus);
System.out.println("main内の値: " + original); // 50のまま
}
public static void adjustValues(int x, int y) {
x = 0;
y = 0;
// 呼び出し側のoriginal, bonusには一切影響しない
}
参照型(配列・オブジェクト)の渡し方
配列やカスタムオブジェクトは、メモリ上のアドレス情報(参照)がコピーされて渡されます。メソッド内でその参照先のデータ構造を操作すると、呼び出し側の変数が指す実体も変更されます。
public static void main(String[] args) {
int[] dataset = {10, 20, 30};
applyMultiplier(dataset);
System.out.println("配列の先頭: " + dataset[0]); // 100 に変更されている
}
public static void applyMultiplier(int[] target) {
for (int i = 0; i < target.length; i++) {
target[i] *= 10;
}
}
Javaは厳密には「値渡し」のみを採用していますが、参照型の場合は「参照の値」がコピーされるため、間接的に実体が共有される挙動を示します。なお、String は参照型ですが不変オブジェクトであるため、基本型と同様にメソッド内での変更は呼び出し側に反映されません。
配列を引数および戻り値として扱う
配列もオブジェクトの一種であるため、メソッドの引数や戻り値として自然に受け渡すことができます。この際も前述の参照渡しルールが適用されます。
public class ArrayFlowDemo {
public static void main(String[] args) {
int[] source = {2, 4, 6, 8, 10};
// 配列を引数として渡す(参照がコピーされる)
displayContent(source);
// 配列を戻り値として受け取る
int[] reversed = createReversed(source);
System.out.print("反転配列: ");
displayContent(reversed);
}
// 配列を受け取り内容を出力
public static void displayContent(int[] input) {
for (int val : input) {
System.out.print(val + " ");
}
System.out.println();
}
// 新しい配列を生成して返却
public static int[] createReversed(int[] src) {
int[] dest = new int[src.length];
for (int i = 0; i < src.length; i++) {
dest[src.length - 1 - i] = src[i];
}
return dest;
}
}
引数として配列を渡す際はメモリ上の同一データを指すため、メソッド内で要素の書き換えを行うと呼び出し側の配列状態も変化します。一方、メソッド内で new 演算子により新規に生成された配列を return する場合、呼び出し側は生成された新しいメモリ領域の参照を受け取ることになります。