第5章 メソッド

はじめに

今までのJavaプログラムの処理は、全てmain()メソッド内に記述していました。Javaプログラムの処理は、全てメソッド内に記述することになっています。メソッドには、変数の宣言や実行文を書いて、実行する処理を定義します。メソッドは、必要に応じてプログラマが複数定義することができます。ここでは様々なメソッドの定義方法や実行方法について学習します。

目次

  • メソッドとは
  • メソッドの処理の流れ
  • メソッドの呼び出し
  • メソッドの定義
  • メソッドの注意点
  • 応用的なメソッド
  • 標準クラスのメソッド利用
  • 独自クラスのメソッド作成
  • Stringクラスのメソッド利用
  • 章のまとめ

目標

  • メソッドの構成要素と定義方法及び使い方を理解する

メソッドとは

メソッドとは、処理の塊ことで、他から呼び出されることにより、メソッドに記述された処理が実行されます。main()メソッドは、javaコマンドを利用してプログラムを実行した時に最初に呼び出されるメソッドです。main()メソッド以外のメソッドは、プログラマが独自に作成し、明示的に呼び出すことにより、処理が実行されます。

今まではすべての処理をmain()メソッドに書いていましたが、処理が増えてくるとmain()メソッドの処理が複雑になってしまいます。プログラム作成の基本は、1つのメソッドには1つの機能を割り当てることです。

main()メソッド内に全ての処理を記述せず、別のメソッドで処理を分けることで、何度も同じ処理を書くことを避けることができます。また、行うべき処理が明確になり、デバッグが容易になります。

ここでは、まずはメソッドの処理の流れについて理解してください。

メソッドの処理の流れ

以下、複数のメソッドに分けた例です。

上記の処理の流れは以下の順番で実行されます。

return文

上記はreturn文です。return文はメソッドから呼び出し元のメソッドに戻ることを指示する命令です。
return文がなくても、メソッドの最後まで実行すると、呼び出し元のメソッドへ処理が戻るので、return文は省略ことも可能です。

例題

以下、コーディングして、実行結果を通して実行順序を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec00
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec00 {
/**
* mainメソッド
*/
public static void main(String[] args) {

System.out.println("start");
message();
System.out.println("end");

}

public static void message() {
System.out.println("こんにちはたろうくん");
return;
}
}

コンパイル例:

> javac chapter5¥methodExec00.java

実行例:

> java chapter5.methodExec00
start
こんにちはたろうくん
end

メソッドの呼び出し

メソッドを使用することをメソッドの呼び出しといいます。
他のメソッドを呼び出すには、メソッド名引数を指定します。

※main()メソッドと同じクラスに定義されているメソッドを呼び出す場合は

メソッド名

メソッド名は、呼び出すメソッドの名前のことです。

引数リスト

引数リストとは、呼び出すメソッドに渡す具体的な値(データ)のリストのことで、実引数ともいいます。
引数リストに複数の引数を指定する場合は ,(カンマ)区切りで指定します。引数リストがない場合は、( )(括弧)のみを指定します。

メソッドの呼び出し例(引数リストがない場合)

メソッドの呼び出し例(引数リスト(1つ)がある場合)

メソッドの呼び出し例(引数リスト(2つ)がある場合)

メソッドの定義

メソッドは以下のような形式で定義します。

修飾子

修飾子は、static修飾子アクセス修飾子final修飾子abstract修飾子を指定することができます。

static修飾子

static修飾子が指定されたメソッドはクラスメソッドと呼びます。
クラスメソッドは、オブジェクトを作成しなくても利用できるメソッドです。
クラスメソッドの実行方法については、後述(Mathメソッド())で解説します。

アクセス修飾子

アクセス修飾子は、参照の有無を判断する修飾子です。
指定しない場合はデフォルトアクセス修飾子が指定されます。
詳細については次回の章で詳しく解説します。

final修飾子

final修飾子は、後から変更できないという意味があります。
メソッドに付与するとオーバーライドできなくなります。
オーバーライドについては後の章で詳しく解説します。

abstract修飾子

abstract修飾子を付与すると抽象メソッドになります。
抽象メソッドについては、後の章で詳しく解説します。

メソッド名

定義するメソッドの名前です。
メソッド名は通常、頭文字は小文字で指定することが推奨されています。
(頭文字を大文字で指定することも可能です。)

引数リスト

呼び出し元のメソッドから渡される値(データ)を受け取るための変数です。
引数リストが複数の場合には、各引数を , (カンマ)で区切ります。
引数がない場合には、( )(括弧)のみを記述します。

戻り値の型

戻り値とは、呼び出されたメソッドが、処理した結果を呼び出し元のメソッドに戻す値(データ)のことです。
呼び出し元のメソッドに値(データ)を返さないメソッドの場合は、voidを指定する。

return文(戻り値がない場合)

return文は、処理をメソッドを終了する文です。戻り値がない場合、return文は省略可能です。

メソッドの定義例(戻り値なし)

メソッドの定義例(引数リスト(1つ)有り/戻り値なし)

メソッドの定義例(引数リスト(2つ)有り/戻り値なし)

return文(戻り値がある場合)

戻り値があるメソッドの場合には return [式]; の記述が必須です。
戻り値の型には[式]のデータ型を指定します。
return文を実行すると、[式]の値(データ)が呼び出し元のメソッドへ送られます。
また、処理の制御も呼び出し元のメソッドへ戻ります。

メソッドの定義例(戻り値あり)

例題

以下のソースコードは消費税額を計算するクラスです。
コーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec04
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec04 {
/**
* mainメソッド
*/
public static void main(String[] args) {
int myTax;
myTax = tax(3000);
System.out.println("税額は" + myTax + "円");
}

//消費税額を計算する
public static int tax(double gaku){
double d = gaku * 0.10;
return (int)d;
}

}

コンパイル例:

> javac chapter5¥methodExec04.java

実行例:

> java chapter5.methodExec04 5000
税額は300円

メソッドの注意点

booleanの値を返すメソッドは検査用のメソッドでよく利用されます。

以下のソースコードはコマンドラインで指定した文字列を数字に変換し、その数字が偶数かどうか判定するメソッドです。
以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec06
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec06 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int inputValue = Integer.parseInt(args[0]);

if(isCheck(inputValue)){
System.out.println( inputValue + " は偶数です。");
}else{
System.out.println( inputValue + " は奇数です。");
}

}

//偶数か奇数かチェックするメソッド
public static boolean isCheck(int i){

if(i % 2 == 0){
return true;
}else{
return false;
}
}

}

コンパイル例:

> javac chapter5¥methodExec06.java

実行例:

> java chapter5.methodExec06 10
10 は偶数です。

> java chapter5.methodExec06 15
1 は奇数です。

上記の処理は以下の順番で実行されます。

booleanの値を返すメソッドの注意点

上記のように、booleanの値を返すメソッド呼び出しでは、if文の中に直接メソッド呼び出しを書きます。
以下は上記と同じ意味です。通常は上記のように書きますので以下のように書かないように注意しましょう。

また、一般にJava言語では is⚪︎⚪︎というメソッド名はtruefalseを返すメソッドに使います。

例題

以下うるう年を判定するメソッドです。うるう年の判定方法は以下です。

「4で割り切れ、かつ、100では割り切れない年」、または「400で割り切れる年」

以下、コーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec07
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec07 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int year = Integer.parseInt(args[0]);

if(isLeapYear(year)){
System.out.println( "うるう年です。");
}else{
System.out.println( "うるう年ではありません。");
}


}

//うるう年かどうかチェックするメソッド
public static boolean isLeapYear(int n){

if( n % 4 == 0 && n % 100 != 0 || n % 400 == 0 ){
return true;
}else{
return false;
}
}

}

コンパイル例:

> javac chapter5¥methodExec07.java

実行例:

> java chapter5.methodExec07 2018
うるう年です。

> java chapter5.methodExec07 2020
うるう年ではありません。

応用的なメソッド

これまでは2つのメソッドを持つクラスを扱ってきましたが、通常、ひとつのクラスの中にはもっとたくさんのメソッドがあります。処理を細かくメソッドに分割することで、行うべき処理が明確になり、デバッグが容易になります。

例題(複数のメソッドを使う例)

以下は3つの整数の最大値と最小値を求めるプログラムです。最大値を求めるメソッドと最小値を求めるメソッドを別に作成し、mainメソッドからそれらを利用して全体の処理を実行しています。

以下、コーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec08
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec08 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int intValue1 = Integer.parseInt(args[0]);
int intValue2 = Integer.parseInt(args[1]);
int intValue3 = Integer.parseInt(args[2]);

int maxVal = max(intValue1,intValue2,intValue3);
int minVal = min(intValue1,intValue2,intValue3);

System.out.println("最大値は" + maxVal + "です。");
System.out.println("最小値は" + minVal + "です。");

}

//最大値
public static int max(int a, int b, int c){
int maxVal = a;
if(maxVal < b){ maxVal = b ; }
if(maxVal < c){ maxVal = c ; }
return maxVal;
}

//最小値
public static int min(int a, int b, int c){
int minVal = a;
if(minVal > b){ minVal = b ; }
if(minVal > c){ minVal = c ; }
return minVal;
}

}

コンパイル例:

> javac chapter5¥methodExec08.java

実行例:

> java chapter5.methodExec08 20 100 999
最大値は999です。
最小値は20です。

ローカル変数

メソッドの中で宣言される変数をローカル変数といいます。
ローカル変数はそのメソッドの範囲内のみで有効に利用できる変数です。
メソッドが異なれば別の変数として扱われます。したがって、異なるメソッドでは同じ名前ローカル変数を扱うことができます。

先ほどの最大値と最小値を求めるプログラムであるmethodExec08クラスでは、maxValとminValがmain()メソッドやmax()メソッド、min()メソッドで使われていますが、これらはローカル変数です。
また、仮引数もローカル変数と同じ扱いです。例えば先ほどの最大値と最小値を求めるプログラムであるmethodExec08クラスでは、maxもminも仮引数の変数宣言の名前はa、b、cとなっています。メソッドが異なれば同じ名前の仮引数を利用することができます。

メソッドからメソッドを呼び出す

main以外のメソッドでも他のメソッドを呼び出して利用することができます。

以下のソースコードは3つの数値の平均値を計算して表示する例です。main()メソッドは平均値を計算するためにmean()メソッドを呼び出しますが、mean()メソッドも、値の合計値を得るためにsum()メソッドを呼び出しています。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec09
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec09 {
/**
* mainメソッド
*/
public static void main(String[] args) {

double dValue1 = Double.parseDouble(args[0]);
double dValue2 = Double.parseDouble(args[1]);
double dValue3 = Double.parseDouble(args[2]);

double average = ave(dValue1,dValue2,dValue3);

System.out.println("平均値は" + average + "です。");

}

//平均値を計算する
public static double ave(double a, double b, double c){
double total = sum(a,b,c);
return total / 3;
}

//合計値を計算する
public static double sum(double a, double b, double c){
double t = a + b + c;
return t;
}

}

コンパイル例:

> javac chapter5¥methodExec09.java

実行例:

> java chapter5.methodExec09 9.5 5.0 6.5
平均値は7.0です

処理の流れは以下の順番で実行されます。

上記は「平均を計算」する処理を作成し、さらにその処理が「合計を計算」する処理を呼び出すように細分化しています。このような手法を段階的詳細化といいます。

例題(メソッドからメソッドを呼び出す)

以下のソースコードは単価と個数を入力し、販売金額を計算して表示するプログラムです。

販売金額は以下の公式で求めることができます。

販売金額 = 単価 × 個数 × (1 - 割引率))

割引率は個数に応じて次のように決まっています。

1-100未満 0%
100-500未満 10%
500以上 20%

以下、コーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec10
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec10 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int price = Integer.parseInt(args[0]);
int n = Integer.parseInt(args[1]);
int gaku = (int)sales(n,price);

System.out.println("売上金額=" + gaku + "円です。");

}

//売上金額を計算するメソッド
public static double sales(int n, int price){
return price * n * ( 1 - rate(n) );
}

//割引率を計算するメソッド
public static double rate(int n){
double r;
if(n < 100){
r = 0.0;
}else if(n < 500){
r = 0.1;
}else{
r = 0.2;
}
return r;
}

}

コンパイル例:

> javac chapter5¥methodExec10.java

実行例:

> java chapter5.methodExec10 50 3000
売上金額=120000円です。

> java chapter5.methodExec10 200 3000
売上金額=480000円です。
> java chapter5.methodExec10 700 3000
売上金額=1680000円です。

配列を受け取るメソッド

配列を引数として受け取るといろいろな処理ができるようになります。次のメソッドはコマンドライン引数を仮引数に指定し、全要素を表示するメソッドです。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec11
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec11 {
/**
* mainメソッド
*/
public static void main(String[] args) {

disp(args);
}

//配列(args)の参照を受け取って全要素を表示するメソッド
public static void disp(String[] x){
for(String str : x){
System.out.print(str + " ");
}
}

}

コンパイル例:

> javac chapter5¥methodExec11.java

実行例:

> java chapter5.methodExec11 ABC DEF GHI
ABC DEF GHI

メソッドで配列の内容を変更する

配列を実引数としてメソッドへ渡す場合、配列への参照が渡されるので、メソッド側は同じ配列を共有しています。これは、メソッド側でオリジナルの配列要素の値を変更することが出来ることを意味します。
配列そのものに変更を加えるので、配列データのクリアーやデータセットなどもメソッドで行うことが可能です。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec12
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec12 {
/**
* mainメソッド
*/
public static void main(String[] args) {

clear(args);
for(String str : args){
System.out.println(str);
}

}

//配列要素をクリアーするメソッド
public static void clear(String[] x){
for(int i = 0; i < x.length ; i++){
x[i] = "aaa";
}
}

}

コンパイル例:

> javac chapter5¥methodExec12.java

実行例:

> java chapter5.methodExec12 ABC DEF GHI
aaa
aaa
aaa

上記は、配列名argsを実引数として、引数のxへ値を渡しています。argsとxは同じ配列を共有しています。

配列を受け取って処理結果を返すメソッド

メソッド内で新規で作成した配列を戻り値として返すこともできます。
以下のソースコードはコマンドライン引数で指定した値を足し算するクラスです。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス methodExec13
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class methodExec13 {
/**
* mainメソッド
*/
public static void main(String[] args) {

//1. start()メソッドの呼び出し
start("開始",args);

//2. input()メソッドの呼び出し
int[] intArray = input(args);

//3. calc()メソッドの呼び出し
int result = calc(intArray);

//4. output()メソッド呼び出し
output(result);

//5. close()メソッド呼び出し
close();

}

//開始処理用メソッド
static void start(String s, String[] strArry){

//1-1. 開始メッセージをコンソールへ出力する
for(String str : strArry){
System.out.print(str + "と");
}
System.out.println("の足し算を" + s + "します。");
}

//入力処理用メソッド
static int[] input(String[] strArray ){

//2-1. 配列の個数を代入
int[] intArr1 = new int[strArray.length];

//2-2. 配列要素用の変数初期化
int i = 0;

//2-3. String型からint型へ変換し、int型の配列へ代入
for(String str : strArray ){
intArr1[i] = Integer.parseInt(str);
i++;
}

//2-4. int型の配列intArr1を呼び出し元へ返す
return intArr1;

}

//計算処理用メソッド
static int calc(int[] intArr2){

//3-1. 合計用の変数resを初期化
int res = 0;

//3-2. 計算処理実行
for(int i : intArr2 ){
res += i;
}

//3-3. int型の変数resを呼び出し元へ返す
return res;

}

//出力処理用メソッド
static void output(int e){

//4-1. 合計をコンソールへ出力する
System.out.println("合計は " + e + " です。");

}

//終了処理用メソッド
static void close(){

//5-1. 「処理を終了します」とコンソールへ出力する
System.out.println("処理を終了します。");

}

}

コンパイル例:

> javac chapter5¥methodExec13.java

実行例:

> java chapter5.methodExec13 20 44 55 66 77 88 100
20と44と55と66と77と88と100との足し算を開始します。
合計は 450 です。
処理を終了します。

標準クラスのメソッド利用

Java SE Development Kit で提供されるクラスやインターフェースなどのライブラリのことを標準クラスといいます。
代表的な標準クラスには以下があります。

今まで利用していた
Systemクラスのout.printlnも標準クラスです。CalenderクラスとDateクラスは日付を操作するためのクラスです。

これらの標準クラスの使い方については、Java APIというOracle社から提供されているドキュメントを見ると詳しく記載されています。

Java API(Java™ Platform, Standard Edition 8 API 仕様)

ドキュメントは以下の①〜③の順番で確認します。

今回はMathクラスを例に説明します。

① 利用したいパッケージを選択

ドキュメントへアクセスすると3つの画面構成になっています。
まずは右上の画面から利用したいパッケージを選択します。
今回利用したいクラスであるMathクラスは「java.lang」パッケージに含まれていますので、
java.langパッケージを選択してください。

選択をすると右下の画面にjava.langと表示されます。

② 利用したいクラスを選択

次に、右下の画面から「Math」クラスを選択します。

選択すると、中央の画面にMathクラスの詳細画面が表示されます。

③ クラスの詳細を確認する

詳細画面の構成は主に以下の5つのセクションに分かれています。

クラスの概要

クラス全体の説明が記載されています。

フィールドのサマリー

フィールドの概要が記載されています。

※フィールドの詳細へ移動したい場合にはフィールド名をクリックします。

メソッドのサマリー

メソッドの概要が記載されています。

※メソッドの詳細へ移動したい場合にはメソッド名をクリックします。

フィールドの詳細

フィールドの詳細が記載されています。

メソッドの詳細

メソッドの詳細が記載されています。

クラスメソッドの実行

staticのついたメソッドをクラスメソッドといいます。クラスメソッドは実行方法は以下です。

[構文]

クラス名.メソッド名();

Mathクラス

Mathクラスは指数関数、対数関数、平方根、および三角関数といった基本的な数値計算ができる機能を提供している
クラスです。まずはMathクラス内に定義されているroundメソッド、powメソッド、maxメソッド、minメソッド、sqrtメソッド、randomメソッドの使い方について学習していきます。

事例(roundメソッド)

四捨五入をしたい場合には、roundメソッドを利用します。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス RoundExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class RoundExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

long n = Math.round(1.99999);
System.out.println("1.99999を四捨五入すると" + n);

}

}

コンパイル例:

> javac chapter5¥RoundExec.java

実行例:

> java chapter5.RoundExec
1.99999を四捨五入すると2

上記ではMath.round(1.99999)の実行結果をlong型の変数nに代入しています。Math.round(1.99999)で指定しているカッコ「()」内が引数、実行結果が戻り値です。

事例(powメソッド)

べき乗を計算する場合にはpowメソッドを利用します。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス PowExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class PowExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

double x = Math.pow( 2, 4 );
System.out.println( "2の4乗は" + x );

}

}

コンパイル例:

> javac chapter5¥PowExec.java

実行例:

> java chapter5.PowExec
2の4乗は16.0

事例(maxメソッド)

maxメソッドはどちらか大きい方の値を返すメソッドです。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス MaxExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class MaxExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

double x = Math.max(22.2, 33.3);
System.out.println("22.2と33.3では" + x + "の方が大きい");

}

}

コンパイル例:

> javac chapter5¥MaxExec.java

実行例:

> java chapter5.MaxExec
22.2と33.3では33.3の方が大きい

事例(minメソッド)

minメソッドはどちらか小さい方の値を返すメソッドです。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス MinExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class MinExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

double x = Math.min(22.2, 33.3);
System.out.println("22.2と33.3では" + x + "の方が小さい");

}

}

コンパイル例:

> javac chapter5¥MinExec.java

実行例:

> java chapter5.MinExec
22.2と33.3では22.2の方が小さい

例題(sqrtメソッド)

sqrtメソッドは平方根を計算するメソッドです。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス SqrtExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class SqrtExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

double x = Math.sqrt(2.0);
System.out.println("2.0の平方根は" + x + "です。");

}

}

コンパイル例:

> javac chapter5¥SqrtExec.java

実行例:

> java chapter5.SqrtExec
2.0の平方根は1.4142135623730951です。

例題(randomメソッド)

randomメソッドは乱数を返すメソッドです。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス RandomExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class RandomExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

double x1 = Math.random();
double x2 = Math.random();
double x3 = Math.random();

System.out.println("乱数x1は" + x1 + "です。");
System.out.println("乱数x2は" + x2 + "です。");
System.out.println("乱数x3は" + x3 + "です。");

}

}

コンパイル例:

> javac chapter5¥RandomExec.java

実行例:

> java chapter5.RandomExec
乱数x1は0.5255546925297682です。
乱数x2は0.4771077870144361です。
乱数x3は0.9289028989567646です。

独自クラスのメソッド作成

今まで学習した内容をもとに計算機アプリを作成してみましょう。

以下の内容でパッケージクラスを新規で作成してください。

プロジェクト 説明
alj_study 研修用
パッケージ名 説明
kadaiCal 計算機アプリ用
クラス名 説明
CalculatorExec 計算機実行機能
Calculator 四則演算機能

CalculatorExecクラスはmain()メゾットが定義されており、
実際に実行する時に指定するクラスです。

CalculatorクラスはCalculatorExecクラスから呼ばれるクラスです。

Calculatorクラスには以下4つのメソッドを作成してください。

メソッド名 引数 処理内容 戻り値 説明
getTashizan 2つ(int型) 引数の値を足す。 足した結果(int型) 足し算メソッド
getHikizan 2つ(int型) 引数の値を引く。 引いた結果(int型) 引き算メソッド
getKakezan 2つ(int型) 引数の値を掛ける。 掛けた結果(int型) 掛け算メソッド
getWarizan 2つ(int型) 引数の値を割る。 割った結果(int型) 割り算メソッド

以下はgetTashizan()メソッドの作成例です。

package kadaiCal;
/**
* 四則演算機能
* @version 1.0
* @author Yamamoto
*/
public class Calculator {
/**
* 足し算メソッド
* @param input1 入力値1
* @param input2 入力値2
* @return int
*/
public static int getTashizan(int input1, int input2){
return input1 + input2;
}

}

上記を参考にしてgetHikizan()メソッドgetKakezan()メソッドgetWarizan()メソッドを作成してみてください。

続いて、CalculatorExecクラスのメソッドを作成していきます。

今回はコマンドラインを利用して2つの整数を入力させるようにします。入力した整数を四則演算を行い、結果をコンソール上に表示させます。

package kadaiCal;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class CalculatorExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

//コマンドラインからの入力文字列を数値へ変換
int input1 = Integer.parseInt(args[0]);
int input2 = Integer.parseInt(args[1]);

}
}

CalculatorクラスのgetTashizanメソッドにinput1input2を引数として渡し、結果をaddTashizanへ代入し、System.out.printlnでコンソールへ表示させます。

package kadaiCal;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class CalculatorExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

//コマンドラインからの入力文字列を数値へ変換
int input1 = Integer.parseInt(args[0]);
int input2 = Integer.parseInt(args[1]);

//getTashizan()メソッドの呼び出し
int addTashizan = Calculator.getTashizan(input1, input2);

//足し算結果出力
System.out.println(input1 + "と" + input2 + "を足すと..." + addTashizan + "です。");
}

}

上記、実行して動作を確認してください。

コンパイル例:

> javac kadaiCal¥Calculator.java
> javac kadaiCal¥CalculatorExec.java

実行例:

> java kadaiCal.CalculatorExec 100 200
100と200を足すと...300です。

確認できたら足し算(getTashizan)以外の処理も追加し、動作確認してみてください。

実行例:

> java kadaiCal.CalculatorExec 100 200
100と200を足すと...300です。
100と200を引くと...-100です。
100と200を掛けると...20000です。

Stringクラスのメソッド利用

Stringクラスとは、文字列(String型)を定義しているライブラリクラスです。intやdoubleと違って文字列はライブラリクラスで定義されています。そのため文字列には他の型にはないような機能が沢山あります。

文字列の長さを得る

文字列の長さとは、その文字列が何文字あるかという値です。文字列リテラルや、String型の変数では、次のようにlength()メソッドを使うと簡単に長さを知ることができます。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス StringExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class StringExec{
/**
* mainメソッド
*/
public static void main(String[] args){

//文字列のリテラルにlength()を適用
int len = "aaaaabbbcccc".length();
System.out.println(len);

String str = "aaaaabbb";
//文字列の変数にlength()を適用
len = str.length();
System.out.println(len);

}
}

上記、実行して動作を確認してください。

コンパイル例:

> javac chapter5¥StringExec.java

実行例:

> java chapter5.StringExec
12
8

今回のlength()メソッドは.(ドット)の前にクラス名ではなくリテラル変数名を記載します。これはlength()メソッドがインスタンスメソッドというメソッドの為です。

インスタンスメソッド

インスタンスとはオブジェクトの別名です。つまりインスタンスメソッドはオブジェクトメソッドです。

文字列もオブジェクトなので、文字列データ以外にもたくさんのインスタンスメソッドを持つように設計されています。
length()メソッドはその一つです。文字列の基本的なインスタンスメソッドは以下です。

インスタンスメソッド 機能
boolean equals(String str) 文字列が別の文字列strと等しい時trueを返す
char charAt(int i) 先頭からi番目の文字(char)を返す(0から数える)
int indexOf(int ch) 文字chが文字列の中で最初に出現する位置を返す
boolean isEmpty() 文字列の長さが0の時のみtrueを返す
int length() 文字列の長さ(文字数)を返す
String replace(String a , String b) 文字列内の内部文字列aをbに書き換えた文字列を返す
String substring(int s) s番目以降を取り出した部分文字列を返す(0から数える)
String substring(int s,int e) s番目からe-1番目を取り出した部分文字列を返す(0から数える)
String toLowerCase() 英字を小文字にした文字列を返す
String toUpperCase() 英字を大文字にした文字列を返す
String trim() 先頭と末尾の空白を削除した文字列を返す
String valueOf(…) ・・・を文字列にして返す。・・・は任意の型の値(数値など)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス StringInstanceExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class StringInstanceExec{
/**
* mainメソッド
*/
public static void main(String[] args){
String aa = "aaAAあああ月火水BBbbb";

//長さ
int len = aa.length();
//出現位置
int pos = aa.indexOf('水');
//先頭から6番目の文字
char ch = aa.charAt(5);
//小文字変換
String str = aa.toLowerCase();

System.out.println("長さ = " + len);
System.out.println("水は" + pos + "番目");
System.out.println("6番目の文字列は " + ch);
System.out.println(aa + "→" + str);
}
}

上記、実行して動作を確認してください。

コンパイル例:

> javac chapter5¥StringInstanceExec.java

実行例:

> java chapter5.StringInstanceExec
長さ = 15
水は9番目
6番目の文字列は あ
aaAAあああ月火水BBbbb→aaaaあああ月火水bbbbb

nullによる初期化

何も値の入っていない変数は「初期化されていない」といいます。宣言しただけの変数は、中身は空で、初期化されていない状態です。そのような初期化されていない変数に対してインスタンスメソッドを使うと、コンパイルエラー(文法エラー)になります。

String aa;
//コンパイルエラー
int len = aa.length();

一方、nullを代入した変数の場合は、コンパイルエラーにはなりません。nullは「無効な文字列」を表すリテラルですが、初期化されているとみなされます。

nullが代入されたままの変数を実行すると実行時例外が発生します。

String aa = null;
//コンパイルエラーにならないが実行時エラーが発生する。
int len = aa.length();

変数の中身がnullかどうかは常に注意が必要です。

例外(nullによる初期化)

項目 名前
プロジェクト alj_study
パッケージ chapter5
クラス StringInstanceExec
package chapter5;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class StringInstanceExec{
/**
* mainメソッド
*/
public static void main(String[] args){

//-----ここから(修正)-----
String aa = null; //nullを代入
//-----ここまで(修正)-----

//長さ
int len = aa.length(); //コンパイルエラーにならないが実行時例外が発生する。
//出現位置
int pos = aa.indexOf('水');
//先頭から6番目の文字
char ch = aa.charAt(5);
//小文字変換
String str = aa.toLowerCase();

System.out.println("長さ = " + len);
System.out.println("水は" + pos + "番目");
System.out.println("6番目の文字列は " + ch);
System.out.println(aa + "→" + str);
}
}

コンパイル例:

> javac chapter5¥StringInstanceExec.java

実行例:

> java chapter5.StringInstanceExec
Exception in thread "main" java.lang.NullPointerException
at chapter5.StringInstanceExec.main(StringInstanceExec.java:12)

「int len = aa.length();」を実行すると、aaはnullが代入されている為、実行時例外(NullPointerException)が発生します。

章のまとめ

以下の要点を理解できたら次の章へ進んでください。

メソッドとは

  • メソッドとは、処理の塊のこと(関数のようなもの)
  • main()メソッドは、プログラムを実行した時に最初に呼び出されるメソッド
  • main()メソッド以外のメソッドは、プログラマが独自に作成し、明示的に呼び出す
  • 同じような処理を1つのメソッドにまとめ、重複して書くことを避ける

メソッドの処理の流れ

  • return文呼び出し元のメソッドに戻る命令のこと

メソッドの呼び出し

  • メソッドを使用することをメソッドの呼び出しという
  • 他のメソッドを呼び出すには、メソッド名引数リストを指定する
  • メソッド名は、変数と同じように識別子のルールに沿って自由につけることが出来る
  • メソッド名は、小文字でつけることが推奨されている
  • 引数リストとは呼び出すメソッドに渡す具体的な値(データ)のことで、実引数ともいう
  • 引数リストに複数の引数を指定する場合は ,(カンマ)区切りで指定する
  • 引数リストがない場合は、()(括弧)のみを記述する

メソッドの定義

  • 修飾子にはstatic修飾子アクセス修飾子final修飾子を付与することができる
  • 戻り値とは呼び出し元のメソッドへ返す値(データ)のこと
  • 戻り値の型には呼び出し元のメソッドに返す値のデータ型を指定する
  • 値を返さないメソッドの場合は、voidを指定する
  • 引数リストは呼び出し元のメソッドから渡されるデータを受け取る変数のこと
  • 引数リストは仮引数ともいわれており、変数の宣言を記述する
  • メソッドを終了する命令をreturn文という
  • 戻り値があるメソッドの場合には returnの後に式や値(データ)の記述が必須である

booleanの値を返すメソッド

  • booleanの値を返すメソッドは、if文の中に直接メソッド呼び出しを書く

応用的なメソッド

  • メソッド内で宣言した変数をローカル変数という
  • ローカル変数は、そのメソッド内だけで有効である
  • 引数もローカル変数と同じ扱いである
  • メソッドが異なれば同じ名前のローカル変数、引数を使って良い

標準クラスの利用

  • Java SE Development Kit で提供されるクラスやインターフェースなどのライブラリのことを標準クラスという。
  • これらの標準クラスの使い方については、Java APIで詳しく記載されている。
  • staticのついたメソッドをクラスメソッドという。
  • クラスメソッドの利用方法は、「クラス名.メソッド名()」である。

Stringクラス

  • インスタンスとはオブジェクトの別名のこと。

  • 主なインスタンスメソッド

インスタンスメソッド 機能
boolean equals(String str) 文字列が別の文字列strと等しい時trueを返す
char charAt(int i) 先頭からi番目の文字(char)を返す(0から数える)
int indexOf(int ch) 文字chが文字列の中で最初に出現する位置を返す
boolean isEmpty() 文字列の長さが0の時のみtrueを返す
int length() 文字列の長さ(文字数)を返す
String replace(String a , String b) 文字列内の内部文字列aをbに書き換えた文字列を返す
String substring(int s) s番目以降を取り出した部分文字列を返す(0から数える)
String substring(int s,int e) s番目からe-1番目を取り出した部分文字列を返す(0から数える)
String toLowerCase() 英字を小文字にした文字列を返す
String toUpperCase() 英字を大文字にした文字列を返す
String trim() 先頭と末尾の空白を削除した文字列を返す
String valueOf(…) ・・・を文字列にして返す。・・・は任意の型の値(数値など)
  • nullが代入されたままの変数を実行すると実行時例外が発生します。