値渡し・参照渡し・Javaの参照の値渡しについて

Programming
スポンサーリンク

こんにちは、しょうぞうです。

先日、業務内で参照渡しを使ったコードがあって混乱したのでアウトプットがてら値渡し・参照渡し・Javaの参照の値渡しの違いについて復習したいと思います。

スポンサーリンク

値型とは

boolean 1bit
byte 8bit
char 16bit
short 16bit
int 32bit
float 32bit
long 64bit
double 64bit
スクロールできます

値型の特徴は、全て変数のサイズが決まっていて、それ以上のサイズを格納することができません。

スポンサーリンク

参照型とは

値型以外のもので、値そのものを保持するのではなく、値が置いてある場所を保持するものです。

有名なところだとString、[]の配列型、クラス型、インタフェース型などが挙げられます。

値渡しと参照渡しの違い

値渡しと参照渡しの違いは、渡した値に変化があるかどうかが重要です。
値渡しのサンプルプログラムが以下のものです。

public class Practice {
public static void main(String[] args) {
int num = 10;
calA(num);
System.out.println(num); // 10が出力されます
}
public static void calA(int num) {
num += 10;
System.out.println(num); // 20が出力されます
}
/*実行結果
20
10
*/
}
view raw AtaiWatashi hosted with ❤ by GitHub

サンプルプログラムでは、
int型に10を格納

calAメソッドで10を足す。
という流れです。

変数宣言したnumの値がメソッドを通した後に何も変化していないということがわかります。

値渡しでは、変数に格納している値のみを渡して、宣言した変数の内容は書き換わらないということになります。

一方参照渡しのサンプルプログラムでは、

public class Practice2 {
public static void main(String[] args) {
String[] array = { "おはようございます", "こんにちは", "こんばんは" };
test(array);
System.out.println(array[0]);
}
public static void test(String[] array) {
array[0] = "Hello";
System.out.println(array[0]);
}
/*実行結果
Hello
Hello
*/
}
view raw SanshoWatashi hosted with ❤ by GitHub

変数で宣言したarrayがtestメソッドによってHelloに書き換えられていて、その後のmainメソッド内でのarray[0]もHelloに書き換わっていることがわかります。

つまり参照渡しだと、変数宣言した値も書き換わるということです。

Javaにおける参照渡しとは

通常の参照渡しは、宣言した変数の内容も書き換えるものです。

Javaの場合は、参照渡しではなく参照の値渡しができます。
サンプルプログラムは以下のものです。

public class Practice3 {
public static void main(String[] args) {
String[] array = { "おはようございます", "こんにちは", "こんばんは" };
test(array);
System.out.println(array[0]);
}
public static void test(String[] array) {
array = new String[3];
array[0] = "Hello";
System.out.println(array[0]);
}
/*実行結果
Hello
おはようございます
*/
}

今までの値渡しと参照渡しとの違いは、testメソッド内で初期化を行なっています。
この瞬間参照しているアドレスは、新たに初期化したarrayを参照しています。

一方、main側の参照は当初のものなので何も変更が加わっていません。

元の変数と引数とで参照するアドレスが変わったことになります。
これがJavaにおける参照渡しです。

まとめ

今回のアウトプットで値渡しと参照渡しの違い、Javaにおける参照の値渡しの理解が深まりました。
今後もこのように、業務内で詰まったところをどんどん書いていきます!

継続できるように!

コメント

タイトルとURLをコピーしました