こんにちは!ISAMU(@burlesca_isa)です!
今回の対象読者は
- 参照渡しと値渡しが理解できなくて悩んでいる方
この記事を読むと
参照渡しと値渡しの基本
が分かります。
参照とは
データの実態を指し示すアドレスのことです。
基本的にプログラムはメモリ領域にデータを保持します。
データが保存されたメモリ領域の場所のアドレス情報のことを参照値といいます。
参照を理解していないと
変数の値が意図した値にならない
など問題が発生します。
このコードを見てください。
①②③でこのような表示になることを説明できるのであれば
これ以上読み進めなくて大丈夫です。
説明できなかった方は少しずつ理解していきましょう。
まず、参照を意識する必要があるのは
- 変数
- 配列
- インスタンスの作成
今回は変数と配列について見ていきます。
まずはデータ型の基本を知ろう
データ型には基本データ型と参照型があります。
変数の書き方やデータ型について理解していない方は下記の記事を参照してください。
[nlink url=”https://kajirinyo.com/java_course_3/”]基本データ型はintやbooleanなどのことです。
参照型にはString型があります。
基本データ型と参照型はメモリの使い方が異なります。
- 基本データ型・・・直接メモリのデータを取り扱う
- 参照型・・・アドレス値を介してデータを取り扱う
基本データ型は直接メモリが使用されますが、
参照型はアドレス値を介して値を見に行きます。
詳しく説明します。
基本データ型のメモリの確保
例えば変数を宣言するときにintなどを指定すると思いますが、
intで変数宣言するとメモリ上に32bitの領域が確保されます。
そして変数に値を代入することでメモリ上に確保された領域に保存されます。
参照型のメモリの確保
Stringのデータ型は参照型ですが、参照型はメモリ上の2つの領域を確保します。
- アドレス値の領域
- データ格納する領域
例としてString型で変数宣言をしてみます。
String str;
変数宣言をするとメモリ上にデータを格納するための領域が確保されます。
この時点で注意したいのは、まだメモリ領域が確保されただけで、変数には何も格納されていません。
メモリ領域が確保された後、
確保された領域のアドレスがstrに格納されます。
変数にはデータそのものが代入されているのではなく、
データが格納されているメモリのアドレスが格納されるということです。
nameに直接データが格納されているわけではなく、
アドレス値→データという順番にアクセスします。
配列は参照型
配列は参照型なので、
配列を格納するメモリ領域を確保した後に格納先のメモリ領域のアドレスを変数に格納します。
次のサンプルコードを見てください。
5行目で変数num2にnum1の参照値を代入しています。
num1とnum2は同じデータの場所を見に行っていますので
num1のデータが変更されればnum2も変更されたデータの場所を見ている為影響を受けます。
12行目でnum2にnullを代入してみます。
14行目のnum1[0]では問題なく110が表示されます。
あくまでもnum2にはアドレス値が格納されているだけなので、
num1が参照しているデータには影響ありません。