プログラミング言語のリファレンスやマニュアルで関数の使い方を調べると次のように構文が書かれていることがあります。
console.log(msg [, subst1, ..., substN]);
msgっていう引数を使えるってことはわかる!でもその後の [, subst1, …, substN]ってなに?この関数、結局何を引数として渡せばいいの?
角括弧[]がついているときにこんなふうな疑問を持ちませんか?今回は、この角括弧が何を意味するのかを説明します。
角括弧の意味→その中の引数は必須じゃない
角括弧がついているとき、その中にある引数は必ずしも渡さなさなくてもいいことを意味します。
たとえば先程のJavaScriptの例
console.log(msg [, subst1, ..., substN]);
これは、「console.log()というメソッドを呼ぶときに第1引数msgは必要だけど第2引数以降はあってもなくてもいいよ」という意味です。
console.log(“コンスキ”) ・・・なくてもOK
console.log(“私の名前は%s。年齢は%d歳です。”, “コンスキ”, 20) ・・・あってもOK
必須じゃない引数「オプション引数」
必須じゃない引数のことをオプション引数といいます。様々な言語の関数このオプション引数の概念はあります。
- JavaScript
- Python
- C++
- Java
擬似的なものになりますが、C言語でもオプション引数がある関数を作れます。
オプション引数が必須でない理由
でも、なぜオプション引数は必ずしも関数にわたす必要がないのでしょうか。
その理由は、デフォルトの値が決められているからです。「もしこの引数が与えられなかったらこれを初期値として使っておこう」。基本的には、そういふうに決められてるのがオプション引数です。
デフォルト値(初期値)が決められている引数ということから「デフォルト引数」と呼ばれることもあります。
オプション引数のある関数の作り方
ここまで聞くと「自分でもオプション引数のある関数やメソッドを作りたい!」そう思いますよね。いくつかの言語で作ってみましょう。意外に簡単です。
JavaScriptでオプション引数
function greet(name, age, greeting="こんにちは") {
console.log(greeting+"、私の名前は"+name+"です。"+age+"歳です。")
}
greet("コンスキ", 20) //出力:こんにちは、私の名前はコンスキです。20歳です。
greet("コンスキ", 21, "こんばんは") //出力:こんばんは、私の名前はコンスキです。20歳です。
関数を定義するときに、オプション引数にしたい引数を「引数名=デフォルト値」という風に書きます。上の例だとgreeting=”こんにちは”の部分がそれにあたります。
Pythonでオプション引数
def greet(name, age, greeting='こんにちは'):
print(greeting+'、私の名前は'+name+'です。年齢は'+str(age)+'歳です。')
greet('コンスキ', 20) #出力:こんにちは、私の名前はコンスキです。年齢は20歳です。
greet('ユウキ', 21, 'こんばんは') #出力:こんばんは、私の名前はユウキです。年齢は21歳です。
JavaScriptと似た感じです。
C++でオプション引数
#include <stdio.h>
void greet(const char* name, int age, const char* greeting="こんにちは") {
printf("%s、私の名前は%sです。年齢は%d歳です。", greeting, name, age);
}
int main(void) {
greet("コンスキ", 20); //出力:こんにちは、私の名前はコンスキです。20歳です。
greet("ユウキ", 21, "こんばんは"); //出力:こんばんは、私の名前はユウキです。21歳です。
return 0;
}
Javaでオプション引数
static void greet(String name, int age, String greeting) {
System.out.println(greeting + "、私の名前は" + name + "です。年齢は" + age + "歳です。");
}
static void greet(String name, int age) {
greet(name, age, "こんにちは"); //引数が2つしかないとき、greetingの部分に"こんにちは"を入れる使う
}
public static void main(String[] args) throws Exception {
greet("ユウキ", 20); //出力:こんにちは、私の名前はユウキです。年齢は20歳です。
greet("コンスキ", 21, "こんばんは"); //出力:こんばんは、私の名前はコンスキです。年齢は21歳です。
}
書き方が他の3つと少し変わってきます。「オーバーロード」という機能を使います。
オーバーロード:渡した引数の数や型が違うときに、違う関数として呼び出せるようにする
コメント