プログラミングの関数とは?引数・戻り値・使い方を基礎から解説

Mirai

プログラミングで「関数」ってよく出てくるけど、何のことなのかよくわからないんですが……。

Zetto

関数は「処理をひとまとめにした箱」のようなものですね。一度作っておけば何度でも使い回せるので、コードがぐっとシンプルになりますよ。

この記事では、プログラミングの関数とは何か・引数・戻り値・使い方を基礎からわかりやすく解説します。

現役エンジニアのZettoです。Java GoldやJava Silverの資格を持ち、実務でJavaやTypeScriptを使った開発を長年経験しています。

この記事を読めば、関数の仕組みから引数・戻り値の使い方、実務での考え方まで一通り理解できます。

ぜひ参考にしてみてください。

目次

プログラミングの関数とは

プログラミング関数とは
  • 関数を一言で表すと「処理をまとめる箱」
  • 関数がないコードと比べてみる

それぞれ解説します。

関数を一言で表すと「処理をまとめる箱」

関数とは、複数の処理をひとつにまとめて名前をつけたものです。

イメージとしては、「材料を入れたら、決まった料理が出てくる機械」に近いですね。

たとえばコーヒーメーカーで言うと、コーヒー豆と水を入れれば(=材料を渡す)、コーヒーが出てくる(=結果が返ってくる)。

これが関数の動き方とほぼ同じです。

プログラミングでは、この「材料」のことを引数(ひきすう)、「出てくる結果」のことを戻り値(もどりち)と呼びます。

関数のメリット

関数のメリットをまとめると次の通りです。

  • 同じ処理を何度も書かなくてよくなる
  • コードが読みやすくなる
  • 修正するときに1か所直すだけで済む

「一度作れば何度でも使い回せる」というのが、関数の最大の特徴ですね。

Zetto

関数は「名前をつけた処理の箱」。作っておけば何度でも呼び出せるのが強みです。

関数がないコードと比べてみる

関数の良さは、比較するとわかりやすいです。

たとえば「2つの数を足して結果を表示する」という処理を3回書くとします。

関数なしのコード(JavaScript)はこうなります。

console.log(1 + 2);
console.log(3 + 4);
console.log(5 + 6);

これだけなら短いですが、「表示形式を変えたい」となった瞬間に3か所全部直さないといけません。

一方、関数を使うとこうなります。

function add(a, b) {
    console.log(a + b);
}

add(1, 2);
add(3, 4);
add(5, 6);

表示形式を変えたいときは、`function add` の中身を1か所直すだけでOKです。

コードの量が増えるほど、この差は大きくなっていきます。僕自身、最初に関数を使わずにコードを書いて、修正のたびに10か所以上直す羽目になった経験があります。

Zetto

関数を使うかどうかで、コードの管理しやすさが大きく変わります。

関数の基本的な使い方

関数の基本的な使い方

ここからは関数を実際にどう書くか、具体的に解説します。

  • 関数の定義と呼び出しの2ステップ
  • 引数(ひきすう)の役割と渡し方
  • 戻り値(return)の役割と受け取り方
  • 組み込み関数とユーザー定義関数の違い

ひとつずつ見ていきましょう。

関数の定義と呼び出しの2ステップ

関数を使うには、「定義する」と「呼び出す」の2つの操作が必要です。

ステップ1:関数を定義する

「定義する」とは、関数の中身を書くことです。

JavaScriptでは `function` というキーワードを使って定義します。

function greet() {
    console.log("こんにちは!");
}

言語によって書き方は違いますが、「関数の名前」と「中身の処理」を書くのは共通です。

ステップ2:関数を呼び出す

定義した関数は、名前を書くことで実行できます。これを「呼び出す」と言います。

greet();  // → こんにちは!と表示される

この `greet()` という一行を書くだけで、定義した処理が動きます。10回使いたければ10回 `greet()` を書けばOKです。

定義は「レシピを書くこと」、呼び出しは「そのレシピを使って料理すること」のイメージですね。

引数(ひきすう)の役割と渡し方

引数とは、関数に渡す「材料(値)」のことです。

先ほどの `greet()` 関数は誰でも同じ「こんにちは!」を表示しますが、引数を使うと名前を変えて挨拶できるようになります。

function greet(name) {
    console.log("こんにちは、" + name + "さん!");
}

greet("Zetto");   // → こんにちは、Zettoさん!
greet("Mirai");   // → こんにちは、Miraiさん!

`name` の部分が引数です。呼び出すときに値を渡すと、その値が関数の中で使われます。

引数は複数渡すこともできます。

function add(a, b) {
    console.log(a + b);
}

add(3, 5);   // → 8

この場合、`a` に3・`b` に5が入り、足し算の結果が表示されます。

引数を使うと「同じ処理でも、渡す値によって結果を変える」ことができます。柔軟に使い回せるのが引数の強みですね。

戻り値(return)の役割と受け取り方

戻り値とは、関数が処理した結果を「返す」仕組みのことです。

`console.log()` で表示するだけなら戻り値は不要ですが、「計算した結果を別の処理で使いたい」場合は `return` が必要になります。

function add(a, b) {
    return a + b;
}

const result = add(3, 5);
console.log(result);   // → 8

`return a + b` と書くことで、足し算の結果が呼び出した側に返ってきます。返ってきた値は変数 `result` に受け取って、その後の処理で使えます。

`console.log` との違いをまとめると次の通りです。

  • console.log:画面に表示するだけ。値を返さない
  • return:値を返す。返した値を別の処理で使える

戻り値がある関数の方が汎用性が高く、実務でもよく使います。

戻り値は「関数からのお土産」のようなものです。returnを書くと、結果を外へ持ち出せるようになります。

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

関数には大きく2種類あります。

  • 組み込み関数(ビルトイン関数):最初から使える関数
  • ユーザー定義関数:自分で作る関数

組み込み関数は、プログラミング言語に最初から用意されているものです。

JavaScriptの例を挙げると次の通りです。

  • `console.log()`:画面に表示する
  • `String().length`:文字数を調べる
  • `Number()`:文字を数値に変換する

これらは自分で定義しなくてもすぐ使えます。

ユーザー定義関数は、自分でゼロから作る関数です。

組み込み関数だけでは対応できない処理を作りたいときや、同じ処理を使い回したいときに作ります。実務では、このユーザー定義関数を作るスキルが特に重要になります。

まずは「組み込み関数を使う練習」と「自分で簡単な関数を定義する練習」を交互にやっていくと理解が深まりますね。

ここまでで、関数の基本的な書き方と仕組みはひと通りつかめたと思います。定義・引数・戻り値の3点セットが関数の核心です。

実務で使える関数の考え方

実務での関数活用

基本を覚えたら、次は「どう使うか」の考え方を身につけましょう。

  • 1つの関数には1つの役割だけ持たせる
  • 初心者がはまりやすいエラーと対処法
  • 関数を覚えた後に学ぶこと

それぞれのポイントを解説します。

1つの関数には1つの役割だけ持たせる

関数を作るときの基本ルールがあります。「1つの関数に詰め込みすぎない」ことです。

悪い例を見てみましょう。

function processUser(name, age) {
    console.log("名前:" + name);
    console.log("年齢:" + age);
    if (age >= 18) {
        console.log("成人です");
    } else {
        console.log("未成年です");
    }
    // ここにデータベース保存の処理も書く
    // ここにメール送信の処理も書く
}

この関数は「表示・判定・DB保存・メール送信」を一気にやろうとしていて、何をする関数なのかわかりにくくなっています。

良い例はこうです。

function displayUser(name, age) {
    console.log("名前:" + name);
    console.log("年齢:" + age);
}

function isAdult(age) {
    return age >= 18;
}

役割を分けると、関数の名前を見ただけで「何をする処理か」がわかるようになります。修正も1か所だけ直せば済むので、バグも出にくいです。

これはソフトウェア開発の世界では「単一責任の原則(SRP)」と呼ばれる考え方で、現場でも非常に重要視されます。

関数は「短くシンプルに」が基本です。長くなってきたら「分割できないか?」と考える習慣を持ちましょう。

初心者がはまりやすいエラーと対処法

関数を使い始めると、特定のエラーに引っかかりやすいです。代表的な3つを解説します。

引数の数が合わないエラー

関数の定義と呼び出しで、引数の数が違うと意図しない動作になります。

function add(a, b) {
    return a + b;
}

console.log(add(1));  // → NaN(bがundefinedになるため)

JavaScriptでは引数が足りなくても即エラーにはなりませんが、渡されなかった引数は `undefined` になり、計算結果が `NaN`(Not a Number)になります。

定義した引数の数と、呼び出すときに渡す値の数が合っているか確認しましょう。

returnを書き忘れるミス

戻り値が必要なのに `return` を書き忘れると、`undefined`(何もない)が返ってきます。

function add(a, b) {
    a + b;  // returnを書き忘れている
}

const result = add(3, 5);
console.log(result);   // → undefined(何も返ってこない)

計算はされているのに結果が返ってこない、というパターンです。`return` を忘れていないか確認してみてください。

変数のスコープ(有効範囲)を理解していないエラー

スコープとは、変数が使える範囲のことです。

関数の中で作った変数は、関数の外では使えません。

function add(a, b) {
    const result = a + b;
}

add(3, 5);
console.log(result);   // → エラー:resultは関数の外からは見えない

この場合は `return result` で値を返して、呼び出し側で受け取る必要があります。「関数の中の変数は関数の中だけで生きている」と覚えておくと理解しやすいです。

エラーに焦らなくて大丈夫です。エラーメッセージは「ここが違いますよ」と教えてくれているヒントです。落ち着いて読めば、原因はほぼ書いてあります。

関数を覚えた後に学ぶこと

関数の基礎が身についたら、次のステップに進みましょう。

学ぶ順番の目安はこの通りです。

  • 繰り返し処理(for文・while文):関数と組み合わせて使う頻度が高い
  • クラスとオブジェクト(オブジェクト指向):関数を発展させた概念
  • 例外処理:エラーが出たときの対応をコードで書く方法
  • モジュール・ライブラリの活用:他の人が作った関数を使う方法

特に繰り返し処理との組み合わせは実務でも毎日使います。関数の中にfor文を書く、for文の中で関数を呼び出す、という書き方が自然にできるようになると、できることの幅がぐっと広がります。

プログラミングの繰り返し処理(ループ)の基本については、以下の記事で詳しく説明しています。関数と合わせて理解しておくと、コードの書き方が一気に広がりますよ。

また、プログラミングの学習を進める上での全体的な学習ロードマップが気になる方は以下の記事も参考にしてみてください。何をどの順番で学べばいいかを整理しています。

関数を使いこなせるようになると、コードの書き方が一段階変わります。ここからが本当のプログラミングの楽しさですね。

Zetto

学ぶステップも整理できました。実践あるのみですね。

よくある質問(FAQ)

よくある質問

よくある質問と回答をまとめました。

  • 関数とメソッドは何が違いますか?
  • 引数はいくつまで渡していいですか?
  • 関数はどのタイミングで定義すればいいですか?

関数とメソッドは何が違いますか?

結論から言うと、クラス(オブジェクト)の中に定義された関数のことをメソッドと呼びます。

関数は単独で定義できますが、メソッドはクラスに属していて、そのクラスのデータと一緒に動くのが特徴です。

// 関数(単独で定義)
function greet(name) {
    console.log("こんにちは、" + name);
}

// メソッド(クラスの中に定義)
class User {
    greet() {
        console.log("こんにちは、" + this.name);
    }
}

Javaでは基本的にすべての処理をクラスの中に書くので、「Javaには関数がなくてメソッドしかない」という表現をされることもあります。

言語によって呼び方が変わりますが、「処理をまとめた単位」という考え方は同じです。まずはその共通点を理解しておけば大丈夫です。

引数はいくつまで渡していいですか?

技術的には何個でも渡せますが、実務では3〜4個を超えてきたら「設計を見直すサイン」と考えるのが一般的です。

引数が多すぎると次のような問題が出てきます。

  • 呼び出し側で何を渡しているかわかりにくくなる
  • 引数の順番を間違えやすくなる
  • 関数が多くのことを担当しすぎている可能性がある

引数が5個以上になりそうなときは、まとめてオブジェクト(`{}`)として渡す方法や、関数を分割することを検討しましょう。

関数はどのタイミングで定義すればいいですか?

「同じような処理を2回以上書くことになりそうだ」と感じたタイミングが定義の合図です。

最初から完璧な関数を設計しようとすると手が止まります。まず動くコードを書いて、後から「この処理は関数にまとめられそうだ」と気づいたタイミングでリファクタリング(整理)するのが自然な流れです。

実務でも最初から完璧に設計できる人はほとんどいません。書いて・動かして・整えるのサイクルを繰り返すうちに、自然とコツがつかめてきます。

関数の基礎を固めて、自分でコードを書ける力を身につけよう

関数基礎習得ガイド

この記事では、プログラミングの関数について基礎から解説しました。

重要なポイントを振り返ります。

  • 関数とは「処理をまとめた箱」。一度定義すれば何度でも使い回せる
  • 引数で「材料」を渡し、returnで「結果」を返す
  • 1つの関数は1つの役割だけ。シンプルに保つのが実務の基本

関数は、プログラミングのあらゆる場面で登場します。ここでしっかり基礎を固めておくと、この先の学習がぐっとスムーズになります。

次のステップとして、実際に手を動かして小さな関数をいくつか作ってみることをおすすめします。たとえば「名前と年齢を受け取って自己紹介文を返す関数」のような簡単なものから始めると理解が定着しやすいです。

Mirai

関数って難しそうと思っていたんですが、「処理をまとめた箱」って考えるとわかりやすいですね。引数と戻り値も整理できました。

Zetto

その理解で大丈夫ですよ。あとは手を動かすだけです。小さな関数を自分で作ってみると、ぐっと身につきますよ。

プログラミングの学習を効率よく進めたい方は、学習の始め方をまとめた以下の記事も参考にしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次