【Java入門(1)メソッド編 #4】参照型の引数

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は

Java入門1 メソッド編 #4
参照型の引数

というテーマでお送りします。

基本データ型の引数と 参照型の引数 のお話です。

内部の受け渡しイメージの違いと 注意点の解説をしていきますね。

彩香
今回も、よろしくお願いします。
剛留
ガッツリ、理解します。
みのる
それでは 早速 いってみましょう。

【Youtube版】

Youtubeでもお伝えしていますので
是非チェックしてくださいね。

【1】 基本データ型の引数

基本データ型の引数の
データ受け渡しイメージを見ていきましょう。

この例の メソッド側 testVal は
テスト的に作ったため 意味の無いメソッドですが…。

int型の仮引数 val に値を受け取り
この val に 50 を代入するというメソッドです。

呼び出し側は、int型変数 a を宣言して
10 で初期化しています。

そして、メソッド testVal を実引数 a で 呼び出します。

この時に、メソッド側の仮引数 val には
a の値のコピーが格納されます。

10が格納されます。代入と同じ動きですね。

メソッド側では、val に 50 を代入するので
val の値は 50 になります。

そして、メソッドの終わりに達したので
呼び出し側に戻って、次のステートメントの実行です。

ここでは、変数 a の内容を 表示していますが
結果は「a:10」となります。

メソッド testVal を呼び出す時に 実引数に
a を指定して渡していますが…

これは、a の値をコピーして 渡しています。
この事を「値渡し」(call by value) といいます。

箱を渡しているのではなく「値」を渡している事を
認識しておいてくださいね。

ですので、a の箱の中は 10 のままです。

【2】 参照型の引数

次に、参照型の引数の
データ受け渡しイメージです。

今回は、配列の場合を考えましょう。

この例の メソッド testArray 。
こちらもテスト的に作ったため意味の無いメソッドですが…。

int型配列 array を受け取り
0 番目の要素 array[0] に 50 を代入します。

呼び出し側は int型配列 a を宣言して、要素を
{ 10, 20, 30 } で初期化しています。

ここで、配列は参照型であるため…

内部的には、配列要素はコンピュータのメモリ上の
別の領域に確保されて、初期化されて…

a には、その参照値(番地情報)が格納されます。

基本データ型と参照型については、以下の記事で解説しています。
こちらも、併せて参考にして頂けたらと思います。

【Javaプログラミング超入門 #06】データ型

 

例えば その番地が 100番地 とします。
すると、このように初期化されます。

そして、testArray を実引数 a で呼び出します。

この時に、メソッド側の仮引数 array には
a の値のコピーが格納されます。

ただし、ここは 参照値(番地情報)ですので
100番地 がコピーされて array に格納されることとなります。

「参照値の値渡し」(call by reference value) です。

ここは、配列が
丸々コピーされるのではない事がポイントです。

そして、メソッドの中で
array[0] に 50を代入しています。

これは 100番地から始まる配列要素の
0 番目 に 50 を代入する事となります。

したがって、呼び出し側で
testArray を呼び出した後に…

a[0] を表示すると 50 となります。

このように、参照値で渡されたデータの
参照先データを書き換えると…

呼び出し側の、参照先データに影響を与えます。

このように設計して
意図して行う場合には良いですが…

基本データ型と同様に考えて、間違えて処理してしまうと
思わぬ障害が発生してしまいます。

この部分も、押さえておきましょうね。

彩香
プリミティブ型を引数で渡す場合には
呼び出し側の元の値に影響はないけれど…

参照型の場合には参照先の実体が変われば
影響するという意味なんですね。

しっかり、ノートしておきました。

剛留
意図しない影響が出ないように気をつけます。
意図して使えば、活用できそうにも思えます。

【まとめ】

【1】 基本データ型の引数
・実引数の値のコピーが
 仮引数に渡される。

・メソッド側で書き換えても
 呼び出し側に影響しない。

【2】 参照型の引数
・実引数(=参照値)のコピーが
 仮引数に渡される。

・メソッド側でその参照先を
 書き換えると
 呼び出し側に影響を与える。

・意図しない書き換えに注意。