検索

キーワード


【Java】 メソッドの役割や型との関係、オーバーロードの使い方

  • 公開日:2020-08-20 16:38:45
  • 最終更新日:2021-01-25 18:31:37
【Java】 メソッドの役割や型との関係、オーバーロードの使い方

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めてメソッドについて紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:アクセス修飾子の使い方 / 命名規約とは? / インスタンスの生成方法 / クラスの役割 / 変数の使い方 / オーバーライドとは? / プリミティブ型と参照型の違い / 配列の使い方 / final修飾子とは?

メソッドの役割と使い方/オーバーロードの方法

計算する、読み込む、データをセットするなどクラスの一部として動作や機能の役割を担うのがメソッドです。

ここでは Java においてクラスと同じくらい重要な役割をしているメソッドを紹介させていただきます。



メソッドの概要

動作や機能を処理する役割を担うのがメソッドです。

クラスにメソッドの動作処理を書くことで、機能を持ったインスタンスを生成することができます。

メソッドはクラス内の一部にあたるため、

クラス外でメソッドを書くことはできなことに注意しましょう。

またメソッドは「動作」の役割をすることから基本的にメソッド名は「動詞」で命名されます。

 ※メソッドの詳しい命名規約は「命名規約の紹介」記事よりご確認ください。


メソッドの書き方

メソッドの基本的な書き方は以下となります。

・メソッドの基本的な構文: アクセス修飾子 戻り値の型 メソッド名(引数の型 引数) { 動作/処理内容 }

※アクセス修飾子は、「public, private, protected」などです。詳細は関連記事リンクよりご確認ください。

※型とは、「String, void, int」などです。

まずは実際のサンプルコードで書き方を確認してみましょう。


◆メソッドのサンプルコード(戻り値なし)

// MethodTest クラスの作成
public class MethodTest {
	// sample メソッドを作成
	public void sample(){		
	}
}

「void 型」はメソッドで戻り値なしの時に使われる型です。

戻り値とは、メソッドで処理をした結果を返すことを指していて、

処理結果を返す必要がない場合にvoid 型を使用します。

反対に void 型以外は戻り値が必要となります。

何かしらの void 以外の型を指定した場合は戻り値ありとなり、return で値を返す必要があります。


◆メソッドのサンプルコード(戻り値あり)

public class MethodTest {
	// 戻り値に int 型指定。return で int 型の1を返すメソッド
	public int method(){
		return 1;
	}
}

この場合は return がなければコンパイルエラーとなります。

併せて引数ありのメソッドも見てみましょう。

引数を設定することで、メソッドの処理に外部から値を渡すことができるようになります。


◆メソッドのサンプルコード(引数あり)

public class MethodTest {
	// 引数に int 型の number 変数を設定
	public int method(int number){
		return 1 + number;
	}
}

外部から整数を渡すと引数の number へ入り、number に+1をして返すメソッドです。

※戻り値の型はメソッドの型と同じでなければなりませんが、

 必ずしも引数の型をメソッドの型や戻り値の型と同じ型に合わせなくてもエラーにはなりません。



メソッドのオーバーロード

メソッドは基本的に1つのクラスに同名のメソッドを用意することはできませんが、

メソッドのオーバーロードをする場合は1クラス内に同名のメソッドを作ることができます。

オーバーロードとは引数の違う同名のメソッドのことを指します。

引数の数引数の型引数の順番で判断され、いずれか1つでも違えばオーバーロードしたメソッドとなります。

実際の例を見てみましょう。

以下同名メソッドは全て同じクラスにあっても引数に違いがあるためコンパイルエラーにはなりません。


◆メソッドのオーバーロード例

// 引数なし
public void method(){
}

// 引数 int でオーバーロード
public void method(int number){
}

// 引数 int 2つでオーバーロード
public void method(int number, int num){
}

// 引数 String でオーバーロード
public void method(String str){
}

// 引数 int, String でオーバーロード
public void method(int number, String str){
}

// 引数 String, int でオーバーロード
public void method(String str, int number){
}


オーバーロードをすると1つのメソッド名で、

様々な引数の組み合わせのメソッドを呼び出すことができます。

また上記例のメソッド同士でアクセスし合うことも可能です。


◆メソッド同士のアクセス

// 引数なしのメソッドを呼ぶと、引数が int のメソッドと String のメソッドも呼ばれる
public void method(){
	method(1); // int 型の method へ1を渡す
	method("a"); // String 型の method へaを渡す
}

// 引数が int のメソッド
public void method(int number){
}

// 引数が String のメソッド
public void method(String str){
}

上記からわかると思いますが、

メソッドの名前は同じため変数の型で、どのメソッドを実行するか判断されます。


※よく似た言葉の「オーバーライド」は、クラスの継承時にメソッドの機能変更を行う別物ですので注意しましょう。

 オーバーライドは別記事で紹介させていただきます。



メソッド引数(値渡し・参照渡し)

メソッドの引数には「値渡し」と「参照渡し」2種類のデータの取り扱い方法があります。

  値渡し  :int 型や long 型、double 型などの基本データ型(プリミティブ型)を引数とする。

 参照渡し:String のようなクラス型、もしくは配列を引数にする。

詳しい特徴をサンプルコードも交えてそれぞれ見ていきましょう。


値渡し

値渡しは int, long, float, double, boolean などのプリミティブ型が使われ、

指定の値をコピーしてメソッド内で使います。

コピーした値とコピー元の値はそれぞれ別の値になるため、

コピーした値を代入し直したり、演算をしてもコピー元の値への影響はありません。


◆値渡しの例

// main メソッド作成
public static void main(String[] arg) {
	int a = 100; // 変数 a に 100 を代入
	sample(a); // sample メソッドに変数 a の 100を渡す(値渡し)
	System.out.println(a); // 結果:コピー元の値 100 は影響を受けずに 100 を表示
}

// sample メソッド作成
public static void sample(int a) {
	a += 1; // mian メソッドの引数 a(100) を受け取り1足す
	System.out.println(a); // 結果:101を表示
}

main メソッドの変数 a とコピーを受け取った sample メソッドの変数 a は、

それぞれ別ものとして扱われるため sample メソッドの a に 1 を足しても、

main メソッドの a には影響がないことがわかります。


参照渡し

参照渡しを紹介するには「参照型」と「参照値」の理解が必要です。

参照型とは、引数や変数自体が値を持っておらず参照値を持っているものを指します。

参照値とは、値を保持している場所のアドレスが記されているものを指します。

 ※このようなアドレスのことを「ポインタ」と呼びます。

 ※記されるポインタは、クラスのインスタンスもしくは配列の値が格納されている場所を示します。


◆参照渡しの例

// main メソッドの作成
public static void main(String[] args) {

	String[] str = {"a", "b", "c", "e"}; // 配列に a, b, c, e の文字列を追加
	System.out.println(Arrays.toString(str)); // 配列内の値確認:a, b, c, e が表示される

	sample(str); // sample メソッドへ参照渡し
	System.out.println(Arrays.toString(str));  // sample メソッドで4番目の e に更新がかけられたため: a, b, c, d を表示
}

// sample メソッドの作成
public static void sample(String[] str) {
	str[3] = "d"; // main メソッドから渡された配列の最後尾を d へ入れ替え
	System.out.println(Arrays.toString(str)); // 結果:a, b, c, d を表示
}

main メソッドと sample メソッドで使われている変数 str の参照先が同じため、

sample メソッドの参照先で変数 str を更新すると、

main メソッドで変数 str を参照した際も更新後の値が取得されます。


余談

「参照渡し」「参照の値渡し」という2つの言葉がありますが、

他言語で「参照渡し」とされる機能と、Java でできる「参照渡し」が異なるため

区別される形で Java では「参照の値渡し」という言葉が生まれました。

そのため他言語の参照渡しとは違った動きをする場合があるので注意しましょう。



可変長引数

メソッドの引数が受け取る値の数が固定されていないと想定される際に便利なのが可変長引数です。

可変長引数は「...」で表記します。

・メソッドの可変長引数 構文: アクセス修飾子 型 メソッド名 (型 ... 引数名)  { 処理内容 }

<可変長引数の特徴>

 ▶ 配列として処理されます。呼び出す際は配列として扱いましょう。

 ▶ 可変長引数にできるのは1つの型のみで、複数の型を指定はできません。

 ▶ 1つのメソッドに1つの可変長引数が利用可能です。

 ▶ メソッドの引数を複数持たせる場合、可変長引数は末尾で利用する必要があります。


◆可変長引数の例

 【可変長引数を持つメソッドのクラス】

public class MethodTest1 {

	public static void sample(String ... a) {
		System.out.println(Arrays.toString(a)); // 結果:abc, def, ghi を表示
	}
}

 ※ Arrays.toString() は配列を文字列へ変換するメソッドです。

 【可変長引数を持つメソッドを呼び出すクラス】

public class MetnodTest2 {
	public static void main(String[] arg) {

		MethodTest1.sample("abc","def","ghi");
	}
}


複数の引数を利用する場合の書き方は以下のように表記できます。

◆複数の引数を利用した場合の可変長引数例

public class MethodTest3 {
	public static void sample(int a, double b, String ... c) {
		System.out.println(a); // 1 を表示
		System.out.println(b); // 1.5 を表示
		System.out.println(Arrays.toString(c)); // abc, def, ghi を表示
	}
}
MethodTest3.sample(1, 1.5, "abc","def","ghi");



final修飾子を付けた引数

1度保持した値をそれ以降変更不可にすることができるのが final修飾子です。

メソッドの引数に final修飾子を付けると、メソッド内の引数に対して代入を阻止することができます。


◆ final修飾子を付けた引数の例

public void test(final String str) {
	str = "sample"; // str への代入をしようとしているためコンパイルエラーとなる
}



まとめ

Java でプログラミングを行う際の基礎となるのがメソッドです。

様々な場面で利用される分、様々なメソッドの使い方が用意されています。

コーディングをしながら少しずつ覚えていきましょう。


関連記事リンク

アクセス修飾子の使い方 / 命名規約とは? / インスタンスの生成方法 / クラスの役割 / 変数の使い方 / オーバーライドとは? / プリミティブ型と参照型の違い / 配列の使い方 / final修飾子とは?


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様