
今回は
というテーマでお送りします。
基本データ型の引数と 参照型の引数 のお話です。
内部の受け渡しイメージの違いと 注意点の解説をしていきますね。



【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 には、その参照値(番地情報)が格納されます。
基本データ型と参照型については、以下の記事で解説しています。
こちらも、併せて参考にして頂けたらと思います。
例えば その番地が 100番地 とします。
すると、このように初期化されます。
そして、testArray を実引数 a で呼び出します。
この時に、メソッド側の仮引数 array には
a の値のコピーが格納されます。
ただし、ここは 参照値(番地情報)ですので
100番地 がコピーされて array に格納されることとなります。

「参照値の値渡し」(call by reference value) です。
ここは、配列が
丸々コピーされるのではない事がポイントです。
そして、メソッドの中で
array[0] に 50を代入しています。
これは 100番地から始まる配列要素の
0 番目 に 50 を代入する事となります。
したがって、呼び出し側で
testArray を呼び出した後に…
a[0] を表示すると 50 となります。

このように、参照値で渡されたデータの
参照先データを書き換えると…
呼び出し側の、参照先データに影響を与えます。
このように設計して
意図して行う場合には良いですが…
基本データ型と同様に考えて、間違えて処理してしまうと
思わぬ障害が発生してしまいます。
この部分も、押さえておきましょうね。

呼び出し側の元の値に影響はないけれど…
参照型の場合には参照先の実体が変われば
影響するという意味なんですね。
しっかり、ノートしておきました。

意図して使えば、活用できそうにも思えます。
【まとめ】
仮引数に渡される。
・メソッド側で書き換えても
呼び出し側に影響しない。
仮引数に渡される。
・メソッド側でその参照先を
書き換えると
呼び出し側に影響を与える。
・意図しない書き換えに注意。
今回も、ご覧いただき、ありがとうございます。