メソッドの基本

メソッド(関数)とは

メソッドは、いくつかの処理を一つにまとめた仕組みで、オブジェクトやクラスに関連する動作や機能を定義するコードの塊です。特にクラスで定義されたメソッドをクラスメソッドといいます。

数学の関数とプログラムの関数

関数は数学の関数のような考え方で、変数を与えて結果を返す(戻り値)といった機能のことをいいます。

$$y = x + 5\tag{関数}$$ $$x = 2\tag{変数}$$ $$y = 7\tag{戻り値}$$

再利用可能

このような処理を毎回プログラムを書くのは非効率なので、メソッド(関数)定義して再利用可能とします。

ビルトインメソッドとカスタムメソッド

メソッドには、ビルトインメソッドとカスタムメソッド(ユーザ定義関数) があります。ビルトインメソッドはプログラム言語に最初から定義されているメソッドです。逆に、カスタムメソッドは、ユーザー独自で定義するメソッドです。

ビルトインメソッドでコスト削減

ビルトインメソッドは、アプリ開発で頻繁に利用する処理が定義されています。ユーザが考えてプログラミングしなくても、ビルトインメソッドのルールを理解するだけで実行できます。よって、プログラムコードやファイルが削減できます。

カスタムメソッドでプログラムを拡張

アプリ開発では、独自の機能が必要となる場合がほとんどで、ビルトインメソッドだけでが困難です。そこでカスタムメソッドで定義することでプログラムを拡張できます。ただし、プログラムの品質は開発者に依存します。

メソッドの構造

メソッドは引数戻り値で構成します。引数は入力値、戻り値はメソッドで処理した値のことです。

引数や戻り値は必須ではなく、関数によっては引数や戻り値を利用しない処理をすることもできます。

メソッド定義

ファイル構成

src/
  └── sample/
        └── Method.java

「メソッド名」「修飾子」「戻り値」「引数」

メソッドは主に「メソッド名」「修飾子」「戻り値」「引数」で宣言します。データ型は戻り値にあわせます。

修飾子 データ型 メソッド名(引数の型 変数名, ...) {
    処理
    ....
    return 戻り値;
}

Methodクラスを作成し、メインメソッドを追加します。

sample/Method.java
package sample;

public class Method {
    
    public static void main(String[] args) {
        
    }

}

メインメソッドは staticメソッド

修飾子がstaticになっているメソッドを、staticメソッドといいます。プログラムを実行するmainメソッドは、staticメソッドです。

public static void main(String[] args) {

}

修飾子

アクセス修飾子

メソッドやプロパティがどこからアクセスできるか制御するワードをアクセス修飾子といいます。

アクセス修飾子の種類
修飾子 アクセス
public すべてのクラス
protected 現在のクラスとサブクラス
private 現在のクラスと同じパッケージのクラス
なし 現在のクラスのみ

その他修飾子

修飾子 説明
static staticクラスやメソッド
final 定数宣言

カスタムメソッドの定義

メソッド定義の概要

次の計算を、calculateメソッドを定義してみます。

$$y = x + 5$$

sample/Method.java
public static Float calculate(Float x) {
    Float y = x + 5;
    return y;
}

引数と戻り値

calculate() に、引数x、戻り値yを定義し、結果をreturnで返します。

メソッド定義

staticメソッドの入力

mainメソッド内で、「static」と入力し、コードアシスタントで「public_static_method」を選択します。

staticメソッドが自動入力できました。

sample/Method.java
public static void name() {

}

メソッド名(関数名)

メソッド名を calculate に変更します。

sample/Method.java
public static void calculate() {

}

引数の定義

引数は ( ) の中にデータ型を指定して定義します。Float型の変数 x を宣言します。

sample/Method.java
//引数 x を Float型で宣言
public static Float calculate(Float x) {

}

メソッドの処理

引数 x を利用して、変数 y を計算します。

sample/Method.java
public static void calculate(Float x) {
    Float y = x + 5;
}

戻り値

メソッドの戻り値の型を、void から Float に変更し、return で変数 y の結果を返します。

sample/Method.java
//戻り値の型を Float
public static Float calculate(Float x) {
    Float y = x + 5;
    //return で結果を返す
    return y;
}

メソッドの実行

メソッド実行の基本

メソッド名で実行

定義したメソッドは、メソッド名に () をつけて実行します。また、引数がある場合は、( ) の中に値を代入します。

引数がない場合
メソッド名();
引数がある場合
メソッド名(値);

メソッドの戻り値

メソッドの実行で戻り値がある(returnしている)場合、変数に代入できます。

データ型 変数 = メソッド名(値)

staticメソッドの実行

calculatemainメソッドは両方 staticメソッドです。この場合、お互い直接実行できます。

sample/Method.java
//main は staticメソッド
public static void main(String[] args) {
    //staticメソッド calculate() を実行できる
	Float answer = calculate(2f);
	System.out.println(answer);
}

//calculate は staticメソッド
public static Float calculate(Float x) {
    Float y = x + 5;
    return y;
}
結果
7.0

クラスメソッドの実行

つぎのカスタムメソッドcalculate2staticメソッドではなく、クラスメソッドといいます。クラスメソッドはstaticメソッドからは直接実行できず、コンパイルエラーになります。

sample/Method.java
//main は、staticメソッド
public static void main(String[] args) {
	Float answer = calculate(2f);
	System.out.println(answer);

    //コンパイルエラー:クラスメソッドは直接実行できない
	Float answer2 = calculate2(2f);
}

//クラスメソッド
public Float calculate2(Float x) {
	Float y = x + 5;
	return y;
}
コンパイルエラー

複数の引数定義

メソッドの定義

引数を複数宣言するには、引数を1つ1つ ,(カンマ) で区切ります。

修飾子 データ型 メソッド名(データ型 引数1, データ型 引数2, データ型 引数3, ...) {

}

メソッドの実行

メソッド名(引数1, 引数2, 引数3, ...) {

合計金額の計算

メソッドの定義

calculateTotalPrice() を定義して、合計金額を計算します。

sample/Method.java
public static int calculateTotalPrice(int price, int amount) {
    int totalPrice = price * amount;
	return totalPrice;
}

メソッドの実行

calculateTotalPrice() を実行します。

sample/Method.java
public static void main(String[] args) {
	...

	int totalPrice = calculateTotalPrice(200, 5);
    System.out.println(totalPrice + "円");
}
結果
1000円

可変長引数

変数のデータ型の直後に、... をつけると、引数を無限に代入できるようになります。これを可変長引数といいます。

可変長引数メソッドの定義

修飾子 データ型 メソッド名(データ型... 引数名) {

}

可変長引数メソッドの実行

メソッド名(引数1, 引数2, 引数3, ...) {

オーバーロード

オーバーロードとは

同じクラスの中で、同じ名前のメソッドを複数定義できるメソッドをオーバーロードといいます。引数を自由に変えたいときに便利です。

  • メソッド名が同じ
  • 引数やデータ型などが違う
  • 同じクラスで複数定義可能

オーバーロードの例

引数が違う「greet」メソッドの場合です。

メソッド名 引数
greet String name
greet String name, String weather
sample/Method.java
public static void main(String[] args) {
	greet("東京 太郎");
    greet("東京 太郎", "晴れ");
}

//引数が1つのメソッド
static void greet(String name) {
    System.out.println(name + "さん、こんにちは!");
}

//引数が2つのメソッド
static void greet(String name, String weather) {
    System.out.println(name + "さん。今日天気は" + weather + "です。");
}
結果
東京 太郎さん、こんにちは!
東京 太郎さん。今日天気は晴れです。

演習

問題1

つぎのsaticメソッドloginMessageで、【1】【2】にあてはまるコードはなんですか?

public static void main(String[] args) {
  String message = loginMessage("東京 太郎");
  System.out.println(message);
}

public 【1】 String loginMessage(String userName) {
  String message = "ようこそ" + userName + "さん!";
  【2】 message;
}
  1. 【1】void 【2】return
  2. 【1】static 【2】return
  3. 【1】void 【2】空欄
  4. 【1】static 【2】空欄

問題2

つぎのプログラムを実行した結果はどれですか?

public static void main(String[] args) {
  int point = calculatePoint(400);
  System.out.println(point + "pt");
  point = calculatePoint(400, 0.05f);
  System.out.println(point + "pt");
}

public static int calculatePoint(int price) {
  float point = price * 0.01f;
  return (int) point;
}

public static int calculatePoint(int price, float pointRate) {
  float point = (float) price * pointRate;
  return (int) point;
}
  1. 4pt 20pt
  2. 20pt 4pt
  3. 4pt 4pt
  4. 20pt 20pt

問題3

つぎの項目でcalculateTotalPriceメソッド を定義して、メインメソッドから実行みましょう。

引数 計算 戻り値
価格、個数 価格 × 個数 合計金額
価格、個数、消費税率 価格 × 個数 × 消費税率 合計金額
消費税率、価格1、価格2、... ※価格は可変長引数 (価格 + 価格 + ...)× 消費税率 合計金額