※2024/5/5更新
※ 本記事では、基本情報技術者試験の対策として私が勉強したことを備忘録的にまとめておきたいと思います。
少しでも参考になれば嬉しいです。
はじめに
さて今回は、関数に値を渡す方法についてまとめたいと思います。
プログラミングの世界は、言語やフレームワークが次々と進化する中で、コードをより洗練させるための無限の可能性が広がっています。その中でも、私たちがコードを構築する際に欠かせない1つが「引数渡し」という手法です。
この引数渡し方法は、プログラムの振る舞いや効率に直結する重要な要素であり、今回はその中でも特に興味深い「参照呼出し」、「値呼出し」、「名前呼出し」という3つの手法にスポットライトを当ててみたいと思います。
混同しないようイメージと結び付けて覚えやすくしているので、ぜひ読んでもらえると嬉しいです。
ちなみに私はこの参考書を使って勉強してました。
漫画形式で読みやすく、分かりやすい内容になっているため、無理なく学習を進められると思います。
過去問を解きまくり、不明点があれば参考書で知識を補う、このサイクルで試験対策するのが私のオススメです!
最新版はこちらです。
少し内容が異なる部分もあるかもしれませんが、大まかには変わらないはずですので、安心して下さい。
参照呼出し・値呼出し・名前呼出し
繰り返しにはなりますが、関数に値を渡す方法は3種類あり、「参照呼出し」、「値呼出し」、「名前呼出し」と呼ばれます。
それぞれの特徴に触れる前に、以下の点は必ず覚えておいてください。
プログラム上では、「変数」、「値」、「アドレス」というのが重要になります。
「変数」の中に「値」が格納されており、その「変数」が保存されているメモリの場所を「アドレス」で指定します。
これらを頭に入れた上で、それぞれの特徴を見ていきましょう。
※ おまけ
関数とサブルーチンには注意して下さい。
プログラム中で呼び出される処理はサブルーチンと呼ばれます。厳密には違う意味合いを持っているみたいなのですが、ほとんど同じ意味なので今回は区別しません。
参照呼出し(call by reference)
参照呼出し(call by reference)とは??
参照呼出しとは、変数が格納されているメモリのアドレスを渡す方法です。
メモリのアドレスとはメモリ上の住所みたいなものです。
要するに、変数がどこにいるかを関数に教えてあげる渡し方になります。
関数はそのアドレスをたどって変数に直接アクセスし、値を上書きするため、メモリ上に格納されている変数の値も変わってしまいます。
参照呼出し(call by reference)のメリット・デメリット
★メリット
- メモリ効率の向上:
参照呼び出しでは、データをコピーせずに渡すため、大きなデータ構造を扱う際にメモリ使用量が削減されます。
- 効率的なデータの共有:
参照呼び出しは、同じデータを複数の関数で共有する場合に効果的です。データをコピーする代わりに、複数の関数で同じデータにアクセスできます。
- 関数の戻り値として使用:
参照呼び出しを利用すると、関数が複数の値を返すのに便利です。関数内で変更されたデータが呼び出し元に反映されます。
★デメリット
- 予期しない変更:
参照呼び出しはデータを共有するため、関数内での変更が予期せず元のデータに影響を与える可能性があるため、注意が必要です。
- 可読性の低下:
参照呼び出しはどの部分でデータが変更されるかを把握しにくくすることがあり、コードの理解が難しくなることがあります。
値呼出し(call by value)
値呼出し(call by value)とは??
値呼出しとは、変数の値をコピーして渡す方法です。
渡された値は関数の中でのみ使うことができ、関数内で呼び出されてきた(コピーされた)値は、関数内部の別の変数に格納され、メモリ上の新しい領域に保存されるため、コピー元の変数に影響は与えません。
値呼出し(call by value)のメリット・デメリット
★メリット
- 予測可能な動作:
関数内での変更が呼び出し元に影響を与えないため、プログラムの動作を予測しやすくします。
- データの保護:
引数の値を変更される心配がないため、意図しない変更を防ぐことができます。
- 再帰呼び出しに適している:
再帰関数を実装する際、値呼び出しは適切な場合があります。関数が自身を呼び出す際に、新たなコピーが作成されるため、関数間でのデータが干渉しません。
★デメリット
- メモリ使用量の増加:
値がコピーされるため、引数が大きなデータ構造である場合、メモリ使用量が増加する可能性があります。 - パフォーマンスの低下:
大きなデータ構造をコピーする必要がある場合、パフォーマンスの低下が起こる可能性があります。
名前呼出し(call by name)
名前呼出し(call by name)とは??
名前呼出しとは、変数名を指定し、関数に未評価の式を渡す方法です。
「評価」とは、式の保持している内容が「確定」することです。すなわち未評価の式とは、まだ中身の内容が確定していないことを意味します。
変数とはあくまでも「入れ物」にすぎませんからね。中身が確定するかどうか、どう変わるかが重要なわけです。
未評価の式の名称(名前)を渡し、関数内部で必要になった場合、評価されて値が確定します。
この呼出し方法も変数の中身が変わってしまいます。
名前呼出し(call by name)のメリット・デメリット
★メリット
- 遅延評価(Lazy Evaluation):
引数が関数内で必要なときに評価されるため、必要な場面でのみ計算が行われます。これにより、計算の無駄を減少させることができます。
- 再帰呼び出しに適している:
再帰関数の実装において、名前呼び出しは適切な場合があります。再帰的に同じ式が評価される際、新たなコピーが作成されることがないため、効率的です。
★デメリット
- 評価回数の増加:
引数が関数内で複数回使用される場合、同じ式が複数回評価されることになります。これにより計算が予期しない回数行われる可能性があります。 - 予測困難さ:
式が関数内で使用されるたびに評価されるため、プログラムの振る舞いを理解しやすくない場合があります。
最後に・・・これだけは覚えよう!
さて今回は、関数に値を渡す方法についてまとめました。
しっかりとポイントをおさえて覚えるようにしましょう。
★参照呼出し:
変数が保存されている「アドレス」を渡す方法
★値呼出し:
変数に格納されている「値」をコピーして渡す方法
★名前呼出し:
変数を「名前」で指定して渡す方法
重要なのは、「値呼出し」の場合、元の変数に影響を与えないということです。
それぞれの特徴と、「値呼出し」の場合は元の変数の内容は変わらない、これらを必ず覚えておけば大丈夫です。
目指せ試験合格!
前回まとめた記事も読んでもらえると嬉しいです!
基本情報以外の勉強記事も是非!
オススメ参考書 & Udemy講座
過去問編
兎にも角にも過去問を解かないことには始まりません。解いて解いて解きまくりましょう!
特に以下の参考書は問題数が多いのでオススメです。
この1冊だけ買って、とりあえず1周すれば合格がかなり近くなると思います!
科目A+B両方合わせて4セット収録されてるとかヤバすぎます・・・
知識網羅編
以下は知識網羅編として、講義系の参考書、動画をピックアップしています。
1からしっかりと学習し、知識を身に着けたい方はとてもオススメです。
過去問を解きまくり、不明点を参考書で補う。これが最高の勉強サイクルです~
私が勉強する際に使用していたオススメ参考書は以下です。
上記シリーズの最新版は以下です。(内容はそこまで変わらないはずですが・・・)
私がぜひオススメしたい、Udemyの講座もいくつかピックアップしておきます。
誰かに解説してもらった方が分かりやすい場合もありますからね~
画像でもボタンでも、どちらを押下しても講座へ飛べるようにしてありますので是非!
コメント