メソッド -関数-

ホームC#プログラミング応用講義 > 関数

目次

関数とは

メソッドに関する説明を入門講座では全くしていません。わかる人、すなわちC/C++ ・ Java プログラマにとっては何気なく使うことができますが、プログラミング初心者にとって、メソッドとは身近であるにもかかわらず理解しがたいものです。

変数はわかりやすいでしょう。データ(ときには参照)を保存しておく箱ですからわかりやすいのですが、メソッドというのは { と } でくくっているだけかと思えば、値を渡したり返したりと、なんだか徐々に複雑になっていき、しまいには「とにかくここにプログラムを書くんだろ」と思っ て、VisualStudio.NET で自動生成されたイベントメソッド以外は使わないということになりまねません。

メソッドを理解するには「関数」という数学的な機能を理解することから始まります。

y = x*x のグラフ

y = x2 のグラフは非常にポピュラーであるため、多くの方が知っていることでしょう。x の値を決めることで、yの値が決まります。

x の値
y の値
1
1
2
4
3
9
4
16
5
25
     :
         :
3.14159
9.8695877291

x = ? として値を代入すると自動的に y の値が決定します。そのとき、y の値は必ずx2 の値をとります
なぜか? それはそうなるように式を決めているからで、別に不思議なことではありません。

y = x2
この式を前提として、ここで何も考えずに y = f(x) とすると、この式を以下のように置き換えることができます。
f(x) = x2

この式は y を使って表した式よりも便利です。なぜなら、
f(1)
と書くだけで、「x に1を代入して計算してね」と伝えることができるのです。
f(2) = 4
よって、この式は正しいことになります。

さらに f(x) を拡張してみましょう。
f(x) = x2 + 2x + 1
式の右辺に x という文字が2つあります。それでも f(x) の機能は一緒です。すなわち、
f(1) = 4
f(2) = 9
f(3) = 16
というように表記することができるのです。f(x) の x の部分に数値を入れると、右辺のすべての x はその数値に入れ替わります。

このような f(x) を「関数」と呼びます。関数はある一定の働きを持って いて、必ずその働きにしたがって値がはじかれます。
上の f(x) の働きは「x2 + 2x + 1 の計算をする」というもので、すべての x の値にこの働きが適用されます。

数値であればマイナスでも計算できます。例えば、
f(-2) = (-2)2 + 2(-2) + 1 = 4 - 4 + 1 = 1
というように例外なく計算できます。

ただし、f(x) は数値しか取りません。これは数学の教科書には載っていませんが、メソッドを理解するためには重要ですからばかばかしく思わず見てください。

f("仲間由紀恵") = ("仲間由紀恵")2 + 2("仲間由紀恵") +1
この f(x) 関数の値を求められる方はいません。なぜなら、x の値が数値ではないため、2乗することも2倍することも1を足すこともできません。よってこの関数はエラーであるとみなされます。

しかし、下の関数は f(x) と同じ働きをします。
仲間由紀恵(x) = x2 + 2x + 1

この関数によれば、
仲間由紀恵(2) = 4 + 4 + 1 = 9
というきちんとした値がはじかれます。この関数が f(x) と違うのは「関数名」です。f というのは、ただの関数の名前に過ぎず、
松嶋菜々子(x) = x2 + 2x + 1
仲間由紀恵(x) = x2 + 2x + 1
石原さとみ(x) = x2 + 2x + 1
は、すべて f(x) と同じ機能を実装しています。
------
(豆チシキ)
「石原さとみ」:
NHK 朝の連続テレビ小説「てるてる家族」で「冬ちゃん」を演じた、朝の連続テレビ小説史上最年少主演女優。
てるてる放映終了後も2時間ドラマで主役を演じたり、CM に多数出演するなど仲間由紀恵の次に期待される女優。(私の意見)
------

だからといって、テストでこのような関数名を使う勇気はありません。通常は日本語名を使わず、半角英数字を使います。よく使うのは、
f / g / P
などです。

関数は非常に簡単です。
f(x) = x2 + 2x + 1
を用意して(定義をするという)、
y = f(2)
として代入しさえすれば、
y = 9
が入る
ことになります。

ちなみに、
f(x) = x2+ 2x + 1
という関数は、
f(x) = (x + 1)2
とすることで計算が簡単になりますが、これはメソッドには関係のない話です。

関数からメソッドへ

私は
f(x) = x2 + 2x + 1
などの関数を見るとついつい頭の中にテキストエディタが登場し、メソッドが定義されている情景が浮かんでしまいます。
こんなことを考えているから数学だけずば抜けて悪いのでしょうか。

それはさておき、関数とメソッドはそっくりです。プログラミングにおいてはメソッドを関数と訳す場合もあります。(method = 方法)
メソッドは C# で採用されているものです。関数と違うのはメンバとして存在することだけ です。

前置きはそれまでとして、上の
f(x) = x2 + 2x + 1
を C# におけるプログラムに変えてみましょう。
using System;

class Sample
{
public static void Main(string[] args)
{
double y;
y = f(3.14159);
Console.WriteLine(y);
}

private static double f(double x)
{
return (x * x) + (2 * x) + 1;
}
}
f(x) の働きは
{    }
の中で定義します。

重要なキーワードを説明します。
return
このキーワードの後に続けられた値を、呼び出しもとに返すことができます

ここで「返す」という言葉を何気に使いましたし、return の説明をこれ以外でやっているものは見たことがありません。
しかし、返すというのは初心者にとってわかりにくいのです。

この例で「返される値」は、return の後にある
(x * x) + (2 * x ) + 1
です。どこに返るかというのは呼び出しもとの
y = f(3.14159);
のステートメントですが、どこに返ってくるのでしょう。

ここで返ってくる値を f(3.14159) の部分と置き換えると簡単に理解できます。す なわち、値が帰ってきた状態というのは、
y = (x * x) + (2 * x ) + 1;
という状態になります。

ただし、x にはメソッドが呼び出された時にすでに
x = 3.14159
と、値が代入されていますので、y にはきちんと double 型の値が 代入されます。

そして返ってくる値の型と、メソッド定義時の型は一致していなければなりません。ここでは return される値の型が double ですから、
private static double f(double x)
ここで double 型としてメソッドを宣言しています。

メソッドの呼び出しといいますが、ただ単に
f(x)
とするだけでいいので、呼び出しという感じはしないかもしれません。が、f(x) は呼び出しで、そのおまけに「値を渡す」ということをしています。

値を渡すというのは、
f(x) = x2 + 2x + 1
の関数において、
f(3.14159)
とすることが、値を渡すということです。だから上のサンプルでもただ
f(3.14159)
とするだけで x に値が渡ります。

ここで、
private static double f(double x)
値を受け取る部分
double x
のことを引数は引数でも「仮引数」と呼び、
y = f(3.14159);
値を渡す部分
3.14159
のことを引数は引数でも「実引数」と呼びます。

メソッドの基本は
・実引数
・仮引数
・返ってくる値の型
・return
です。

これさえ覚えておけば、このページに長々と書いてきたことを忘れても全く問題ありません。

((追記))
渡す値と返す値は全く関係ありません。型一致の原則が適用されるのは、返す値の型とメソッド自体の型のことです。

[ ステップアップC# ] [ C#プログラミング応用講義 ]