【プログラミング基礎】関数とは?わかりやすく解説
関数はどのプログラミング言語でも出てくるので、しっかりと基本を押さえておきましょう!
関数とは?
疑問を抱く人
関数をわかりやすく例えると「工場の加工ライン」のようなイメージです。
プログラム全体を以下のように考えるとわかりやすいかもしれません。
・プログラム全体 = 工場
・変数 = 箱
・関数 = 加工ライン ← この記事ではここを解説
工場はデータをユーザーが望む形にする必要があり、そのためにプログラムでさまざまなデータの加工を行います。
そして、加工ラインでは「特定のデータ」を投入すれば、毎回同じ「加工済みのデータ」ができあがってきます。
関数というのもまさにこのような感じでして、何かしらのデータを加工するためにまとめられたプログラムの処理です。
最初にいきなり「変数 = 箱」と例に出しましたが、変数がまだわからないという方は先に下記の記事を読んでおくと理解がスムーズになります。
プログラミングの変数とは?わかりやすく基礎から徹底解説!
関数が理解できない原因
実際、関数はそんなに難しいものではありません。
実際に僕が陥っていた状況を振り返り、考えられるのは次の3つのうちどれかだと思うので、それぞれ見ていきましょう!
変数が理解できない原因
知らない単語が多すぎて整理できていない
具体的な使い方や便利さの体験ができていない
仕組みを理解しないと納得できない性格
知らない単語が多すぎて整理できていない
今までプログラミングに触れたことがない人にとっては、初めて聞く単語がとても多いはずです。
関数、定数、引数、戻り値、返り値、クラス、メソッド、オブジェクト…
他にもたくさん!
そのため、「関数」が理解できないのではなく、他の単語との区別ができていなかったり、機能を勘違いしていたりすることが考えられます。
「関数とは何か?」をしっかり理解することで他との区別を明確にしましょう!
具体的な使い方や便利さの体験ができていない
理屈はわかっているはずなんだけど、簡単な例でしか関数を使ったことがないから、腹落ちしていないケース。
簡単な例とは以下のような感じですね。
int sum(int a, int b) {
return a + b;
}
sum(1, 2);
「なんとなくわかった。…で?」
となってしまうのではと思います。
何かしらアプリなどを作る過程で覚えていくのが1番理解が深まる方法ではありますが、この問題についてもなるべく便利さが伝わるようにこの記事で解説していきます。
例え話じゃなく仕組みまで理解しないと納得いかない性格
人によっては「仕組みを知らないとスッキリしない・納得いかない」性格の場合もあると思います。
ですが、関数に限っては、今の段階で仕組みだけ知っても理解は深まらないと思います。
関数で重要なのは「どのように処理をまとめるのか?」ということに尽きるからです。
そうは言っても、いずれかは関数の仕組みも理解するべきなので、また別の記事で紹介するか、今後当記事に追記しようと思います。
関数を使うには「作る」と「呼び出す」
関数を使うための手順は
関数を使う手順
関数を作る
関数を呼び出す
の2ステップです。
また、一度作った関数は何回でも呼び出すことができます。
これは、「工場の加工ライン」も一度工場に設置してしまえば、何回でも加工できるようなイメージですね。
それでは詳しい内容を見ていきましょう。
【定義】関数を作る
関数を作ることを「定義」と言います。
関数を定義するには下記が必要となります。
・関数名:関数の名前。自由につけられる
・仮引数:関数が受け取る値
・関数の処理:関数内にまとめられたプログラム
・戻り値の型:関数が返す値のデータ型
・戻り値:関数から返す値。戻り値の型に合う値が必要
まずは関数の定義がどんなものか見てみましょう。
関数定義の形式
戻り値の型 関数名(仮引数) {
関数の処理
return 戻り値
}
実際の関数定義
int sum(int a, int b) {
int total = a + b;
return total;
}
関数定義の形式と実際の関数定義を照らし合わせると次のようになります。
・戻り値の型 :int
・関数名 :sum
・仮引数 :「int a」と「int b」の2つ
・関数の処理 :int total = a + b;
・戻り値 :return total;
【呼び出し】関数を使う
関数を使うことを「呼び出す」とも言います。
関数の呼び出し方は次のようになります。
関数名( 仮引数 );
関数名の後に続けて、引数に値を設定します。
先程、関数の定義で説明したsum関数を呼び出した場合は次のようになります。
int result = sum(10, 30);
上記はsum関数を呼び出し、戻り値をresult変数に代入しています。
関数の引数
ここまでで何度か出てきていますが、関数が受け取る値のことを「引数」と言います。
関数内では、受け取った値を変数のように扱うことができます。
関数を定義するときに引数は必須ではなく、引数がない関数も定義することができます。
int getOne() {
return 1;
}
反対に引数を複数受け取るように定義することもでき、その場合は「, (カンマ)」で区切ります。
int someCalc(int a, int b, intc) {
return a + b - c;
}
関数の戻り値(返り値)
関数が呼び出し元に返す値のことを「戻り値」または「返り値」と言います。
関数内でreturnを使って値を返すことができます。
int sum(int a, int b) {
return a + b;
}
上記の場合は「a + b」の計算結果が戻り値となります。
また、戻り値がない関数を定義することもできます。
void two_print() {
printf(“print 1!”);
printf(“print 2!”);
}
関数がなぜ重要なのか?
結論、プログラムを整理整頓するためです。
整理整頓されていないプログラムはバグの温床となってしまいます。
関数を使うことで同じことを何度も書かなくてよくなるので、プログラム全体の見通しがよくなるんですね。
また、同じことを書いたつもりでもミスするのが人間です。
関数を使うことで、処理内容が毎回同じであることを保証してくれます。
これから出会う関数の関連用語
関数の基本について一通り解説してきました。
ここでは、関数に関連している用語について簡単に紹介しておこうと思います。
ちなみに、ここで挙げる用語は、全て「関数」です!
特定の状況や定義方法の違いによって呼び方が変わっているだけということを覚えておきましょう。
メソッド
「メソッド」とは、オブジェクト指向の用語です。
教本などの表現は「オブジェクトの振る舞い」のように解説されますが、簡単に言うと、クラス内で定義された関数がメソッドと呼ばれます。
コールバック関数
「コールバック関数」とは、関数を引数のように渡して、渡された側で呼び出してあげることです。
今までの関数の説明ではピンとこないと思いますが、関数の実態もただのデータなので引数として渡すことができます。
JavaScriptで特によく見かけられます。
ラムダ式
通常とは異なった関数の定義方法です。
C#の書き方を例に出すとこんな感じです。
var func = () => { Console.WriteLine(“Hello World!”); };
func();
「() => { Console.WriteLine(“Hello World!”); };」の部分がラムダ式で定義した関数になります。
数学のラムダ計算というものからきているらしいです。
まとめ:基本を覚えたら手を動かそう!
関数の基本は簡単で、作って使うだけ。
基本は簡単なのですが、上手に使いこなそうと思うとやはり難しいですが、腕の見せ所でもあるので実践をまじえて磨いていきましょう。
それでは、重要なポイントをおさらいします。
・関数は「定義」と「呼び出し」
・関数が受け取る値が「引数」
・関数から返される値が「戻り値(返り値)」
僕も最初は変数や関数の違いもわからないまま、なんとなくプログラムを書いていました。
当然エラーも多発しましたが、なぜエラーが発生したのか頭を悩ませながらなんとか動くプログラムを作ることを繰り返すうちに自然と変数や関数を使えるようになっていました。
この記事に書いてある内容を頭に入れつつ、手を動かしていきましょう。
Discussion