Javaの値渡しと参照渡しの使用方法について現役エンジニアが解説【初心者向け】
初心者向けにJavaの値渡しと参照渡しについて解説しています。最初に引数とプリミティブ型、参照型の基本を説明します。値渡しと参照渡しの違いをサンプルコードで確認しましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Javaの値渡しと参照渡しについて、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
Javaについてそもそもよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まるでしょう。
なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。
今回は、Javaに関する内容だね!
どういう内容でしょうか?
値渡しと参照渡しについて詳しく説明していくね!
お願いします!
目次
引数とは
引数とはメソッドを呼び出す際にメソッドの内部の処理で使う値を渡す方法のことです。
引数はメソッド名の後ろの()の中に設定します。
引数の渡し方には、引数の種類によって値渡しと参照渡しの2種類の渡し方が存在増します。
値(プリミティブ)型とは
値型とは、Javaでデータを扱う型の一つでメモリ領域に決められた分のサイズをあけることで情報の保持が可能です。
値型はJavaには以下の8種類存在します
- byte型(8ビット)
- short型(16ビット)
- int型(32ビット)
- long型(64ビット)
- float型(32ビット)
- double型(64ビット)
- char型(16ビット)
- boolean型(1ビット)
例えばbyte型の場合だとメモリ領域に8ビット分領域を確保することができます。
参照型とは
参照型はデータが格納されているメモリ上の参照(アドレス)のコピーを保持している型です。
値型に含まれなかったものはすべて参照型に含まれます。
値渡しと参照渡しの違い
値渡しと参照渡しの違いは 渡した変数の状態が変化するかという点です。
実際に以下のソースを見ながら確認しましょう。
プログラムソースコード
public static void main(String[] args) { int num = 10; test(num); System.out.println(num); } public static void test(int num) { num += 10; System.out.println(num); }
実行結果
20
10
上記は値渡しを使ったサンプルコードです。
値型のint型の変数numに10を代入しました。
次にtestメソッドの中に値渡しで変数numを渡しています。
testメソッドの中では値渡しで受け取った引数にプラス10をしています。
結果、testメソッド内での出力は「20」と表示されるでしょう。
しかし、元のmainメソッドの出力は「10」のままです。
値渡しとは変数に格納されているデータの中身のみ渡して、その変数自体は書き換わらないことを意味します。
プログラムソースコード
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
今回は、参照型であるString[]の変数arrayをtestメソッドに渡しています。
testメソッドは中でString[]の0番目の要素を書き換えており、結果としてtestメソッドで出力し、String[]の0番目の値は書き換わった内容で出力されました。
そして、mainメソッドの方でも同じくString[]の0番目を出力すると同じく書き換わった内容が出力されています。
つまり、参照渡しで渡すと元の変数の内容も書き換わるということです。
Javaの参照渡し(参照の値渡し)について
通常参照渡しとはデータの場所、アドレスを渡すことで変数の内容自体を書き換えることを指します。
Javaの場合は参照渡しではなく参照の値渡しが可能です。
プログラムソースコード
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
おはようございます
先ほどの参照渡しと同じくString[]を渡しています。
しかし、testメソッド側で書き換えた内容がmain側では反映されていません。
これが参照の値渡しを意味します。
今回testメソッドのなかで引数に対して新たにString[]を初期化しました。
瞬間引数の参照する場所は引数としてわたっていたデータのアドレスではなく、新しく初期化したインスタンスが作られているアドレスを参照することになります。
しかし、mainメソッドの変数は参照するアドレスは変わりません。
元の変数と引数とで参照するアドレスが変わったことになり、これがJavaにおける参照渡しです。
執筆してくれたメンター
メンターSさん
システムエンジニアとしてこれまで行政システムや医療用システムの保守、開発に携わりました。 JavaやPython、PHP、Kotlinなど様々な言語での開発経験があります。 TechAcademyではJavaコース、Pythonコース、AIコースなど7コースを担当しています。 |
Javaの値渡しと参照渡しがよく分かったので良かったです!
ゆかりちゃん、分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でも、JavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプを開催しています。
また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。