LINEで現役エンジニアに直接質問してみよう!登録無料

プログラミングの関数とは?引数・戻り値の意味や作り方を図解解説まとめ

この記事では、プログラミングの関数について図解、その使い方を解説します。

やっていることは簡単なので、ザクザク行けば、10分ぐらいで関数について理解できると思います。

よって、この記事は、

  • 関数の使い方や使い所が分からない🤔
  • そもそも関数を使うメリットが分からない😇
  • 関数の何処が便利なの?🧐

という疑問を持っている初心者向けの内容です。

この記事では、図解をつかってこのような疑問を解決する内容になっています。

なお、この記事は変数を知っている事が前提なので、「変数が分からない!」という人は「プログラミングの変数とは?型や箱などが分からない初心者向け解説」をみてください🎉

前提知識: 数学の関数とプログラミングの関数は全く違う!

関数と聞くと、y=2x+1のような数学の関数をイメージすると思います。
結論からいうと、「そもそも何も共通する部分はない!」というのが正解です。プログラミングの関数は数式とは全く役割が異なるんです。

では、数学の関数とプログラミングの関数が本当に違うのか比較してみましょう。

数学の関数の特徴

  • f(x) = 2x + 1のように右辺と左辺がある
  • x(引数)には「数字」しか使えない
  • 1文字のアルファベットで表す
  • =には「等しい」という意味がある
  • 必ず数返し、代入する先がある

プログラミングの関数

  • 左辺、右辺という概念はそもそもない
  • 引数は「数字以外」も使える
  • 関数名は1文字とは限らない
  • =か「等しい」ではなく「代入」という意味
  • 返す値があるとは限らない。数でない可能性もある。

いかがでしょうか?

もし、このような違いを「数学との違いは、、、」みたいに比較していたら、混乱していしまいますよね?

まず、そもそも全く異なるものなんだな。と覚えましょう。

プログラミングの関数(function)とは?

プログラミングの関数とは、初心者にわかりやすく簡単にいうとにいうと「自動販売機」のようなものです。

自動販売機は、お金を入れてボタンを押すとジュースなどの飲み物が出てきますよね?それは、「自動販売機がお金をジュースに変換した」と捉えることができます。

関数も同じで、「何かを入れると何かに変換されて出てくる」という役割になっています。

関数の使い方(定義と実行)

関数を使うには2つのステップが必要です。

  1. 関数を定義する
  2. 関数を呼び出す

関数を定義する

関数を定義するには2つの用語を覚えておきましょう。

  1. 「引数」… 関数に値を渡すための変数
  2. 「戻り値」… 関数から値を取り出すための変数

どちらも関数を作る上でとても重要です。

なお、引数と戻り値の個数は任意で、どちらも0個で作ることも可能です(関数のメリットはあまり受けられませんが、、)

関数の構造

関数全体のC言語を例に紹介します。それを例に解説していきます。

戻り値の型 関数名(引数){
    // 処理
    return 戻り値;
}

関数を作るのに必要な要素は下記の3つです

  • 「関数名」(必須) … 機能名として適切な名前を付けます。名前は自由に付けられます。
  • 「引数」(任意) … 関数を呼び出し時呼び出し時、受け取った値がここに入ります。
  • 「戻り値の型」… 関数から値を返す時の型を指定します。言語によっては不要です。
  • 「戻り値」(任意)… 関数から呼び出し元にわたす値を指定します。「戻り値の型」と同じ型でなければいけません。
  • 「処理」(必須) … その関数に任せたい処理を自分で自由に決めることができます。

関数を呼び出す

作った関数の呼び出し方を解説します。

関数の呼び出し方はとても簡単です。

関数名(引数);

これで関数を呼び出す事ができます。
関数からの戻り値を使いたい場合は、変数を定義して=でつなげればOKです。

int val = 関数名(引数);

これで、戻り値を利用できます。

関数をメリットとは?適切な関数の使い方

ここまでの解説で、関数のイメージが何となくわかったと思います。でも、学び始めて間もないので、

  • 関数の何処が便利なの?使い所は?
  • 関数の内部処理を毎回読み解く必要があり、面倒
  • 関数で分けて書くの煩わしくない?
  • もう、1つの関数にまとめて書けばいいじゃん!

と思っているかもしれません。

ここでは適切な関数の使い方やメリットについて紹介します。

同じ処理だから関数化するのは間違い!

このように思っている人は、単純に「同じ処理だから、この部分は関数化しちゃおう!」としているのでは無いでしょうか?この方法はやらないほうがいいです。
関数化するのは、1つの機能に対する処理を関数にまとめるべきです。

例えば、あなたがスクレイピングソフトを開発して、googleから検索結果を取得したいとします。その場合、機能的には

  • googleページから検索結果を取得
    – 1~10ページまでの結果を取得する(下記は10ループさせる)
    – HTTP通信で、生HTMLを取得する
    – HTMLを解析してタイトルなどの主要なデータを取得する
    – 1~10ページまでの結果を合体させる
  • 検索結果をCSV化
  • 検索結果を保存

のように、階層化出来ると思います。この階層化した1つ1つの機能を関数化させていくのです。

この際、プログラムの長さを気にしすぎる必要はありません。要は後で読み返した時に読めればいいので、無理に関数化しなくてもOKです。

関数化すると内部の実装を確認しなくても使える

機能を階層化して関数化していれば、内部の実装を確認しなくても使うことができます。「Xというデータを渡したらYという結果を返す(もしくは何か処理をする)」とさえ分かればOKなのです。

そのため、関数名には機能ごとにわかる名前をつけるのがベストです。

実際の業務でどのように役に立つの?

実際の業務では、「自分が書いたコード」と「他人が過去に書いたコード」と「自分が過去に書いたコード」を組み合わせてアプリケーションを作っていきます。

沢山の人が書いたコードなので、プログラムのすべてを読むのは時間的に無理です。また、すべての機能を把握するのにも時間がかかります。

このような時、機能ごとに関数が分かれていれば、内部の理解をせずにすぐ使い回す事ができます。他の人でも簡単に利用できる状態にしておくことが何よりも重要なのです。

機能追加や仕様変更もやりやすい

自分が書いたプログラムコードでも、時間が経つと全く見に覚えの無い他人が書いたも同然のコードになってしまいます。

なるべくわかりやすい機能に分類してそれをテストしておくと、機能追加や仕様変更があった時も、該当部分を修正して試験を追加するだけで良くなります。

もし、1つ1つの関数に処理のすべてを書いていると、そのすべてで試験を行う必要が出てきてしまいます。

このように、機能ごとに分割するのが良いプログラムを書く上でとても重要です。

「組み込み関数」と「ユーザー定義関数」の違い

プログラミングを初めた時、関数の種類として、

  • 組み込み関数
  • ユーザー定義関数

の2種類を説明されることもあると思います。

これらは、関数を用意した人が誰なのか。によって「組み込み関数」「ユーザー定義関数」に分かれます。

簡単にまとめると、下記のようになります。

  • 「組み込み関数」… プログラミング言語の作成側が標準で用意してくれている関数
  • 「ユーザー定義関数」… あなたやサードパーティー製のコミュニティによって作られた関数

詳しく解説します。

「組み込み関数」とは、プログラミング言語の作成側が標準で用意してくれている関数の事です。
C言語のprintfやRubyのputsなんかは、プログラミング言語をつかって開発する側(ユーザー)は、何の準備もナシで関数を使うことができますよね?

これが、「組み込み関数」と呼ばれている関数です。

一方で、「ユーザー定義関数」とは、あなたが作った関数の事です。また、会社の同僚が作った関数も、サードパーティー製のコミュニティによって作られたライブラリのユーザー定義関数に含まれます。

この記事を書いた人

自身がプログラミングを独学で勉強し始めて躓いた経験を元に、これから勉強をする人に向けに「イラスト多めでわかりやすい記事」にこだわって情報を発信しています。

現在はフルスタックエンジニアとしてサービス開発などのお仕事をしています。