「関数とメソッドの違いって何?」というと、プログラミング経験者なら一度は悩んだことがあるのではないでしょうか。
関数は単独で動作するコードのブロック、メソッドはオブジェクトに紐づく関数――というのが一般的な説明ですが、実は言語によってその扱いはさまざまです。
たとえばJava はすべての関数がクラス内にあるため「関数」という概念がなく、メソッドしか存在しません。またRuby ではすべてがオブジェクトであるため、関数という概念そのものがありません。
一方で、Python や Kotlin では関数とメソッドの区別が明確にされています。
本記事では、Python, Java, Kotlin, Ruby, PHP の 5 つの言語における関数とメソッドの違いを比較しながら、それぞれの設計思想や背景についても紹介していきます。
難しい理論は抜きにして、「なるほど、こんな違いがあるのか!」と楽しみながら読んでいただける内容を目指しました。
それでは、さっそく各言語における「関数」と「メソッド」の違いを見ていきましょう!
2. 言語ごとの設計思想と「関数」と「メソッド」の違い
Pythonの場合
設計思想
Python は「シンプルで読みやすいコード」を最優先する言語です。そのため、関数とメソッドの区別が明確になっています。
自由に関数を定義できる一方で、クラスの中で動作するメソッドには self を明示する必要があり、オブジェクト指向との関係性も明確にされています。
関数とメソッドの違い
- クラス外で定義されるのが 関数(def my_function():)、クラス内で定義されるのが メソッド。
- メソッドには インスタンスメソッド・クラスメソッド・スタティックメソッド の3種類がある。
- self があるかないかで挙動が変わる。
Javaの場合
設計思想
Java は厳格なオブジェクト指向を採用しており、すべてをクラスの中に閉じ込める設計です。
そのため、トップレベル関数という概念はなく、すべてメソッドとして定義されます。
静的型付けの言語であり、厳格な型チェックと強力なツールサポートが特徴です。
関数とメソッドの違い
- Java は基本的に「関数」という概念がなく、すべて メソッド。
- メソッドは必ずクラスの中に属し、トップレベル関数のようなものは存在しない。
- インスタンスメソッドと静的メソッド(static)がある。
Kotlinの場合
設計思想
Kotlin は Java の制約を緩和しつつ、関数型言語の要素を取り入れたモダンな設計を持つ言語です。
トップレベル関数をサポートし、拡張関数(extension function)によってオブジェクトにメソッドのような振る舞いを付加できます。
関数とメソッドの違い
- Kotlin は Java と異なり トップレベル関数 を持てる。
- クラス内に定義されるものはメソッド、トップレベルで定義されるものは関数。
- extension function という仕組みで、まるでクラスメソッドのように関数を扱うことも可能。
Rubyの場合
設計思想
Ruby は「すべてがオブジェクト」という哲学を持つ言語です。そのため、関数という概念はなく、すべてがメソッドとして扱われます。
また特異メソッド(Singleton Method)により、オブジェクトごとに異なるメソッドを持つことができ、柔軟性が高いのが特徴です。
関数とメソッドの違い
- Ruby はすべてがオブジェクトなので、基本的にはすべて「メソッド」という扱い。
- ただし特異メソッド(Singleton Method) により、特定のオブジェクトにだけ紐づくメソッドを持てる。
- self.method_name でクラスメソッドとして動作させることも可能。
PHPの場合
設計思想
PHP はもともとスクリプト言語としてスタートし、その後オブジェクト指向を取り入れた経緯があります。
そのため関数もメソッドも共存しており、柔軟なプログラミングが可能です。
関数とメソッドの違い
- クラス外で定義されるのが関数、クラス内で定義されるのがメソッド。
- public/private/protected などの可視性制御が可能。
- メソッドも static 指定ができる。
3. 言語ごとの比較表
以下の表に、各言語の関数とメソッドの違いを簡潔にまとめました。
言語 | 設計思想 | トップレベル関数 | メソッドの種類 | 特徴的な点 |
---|---|---|---|---|
Python | シンプルで直感的 | 〇 | インスタンスメソッド、クラスメソッド、スタティックメソッド |
self の有無で動作が変わる |
Java | 厳格なオブジェクト指向 | × | インスタンスメソッド、静的メソッド | すべてクラス内で定義される |
Kotlin | 柔軟な関数型アプローチ | 〇 | インスタンスメソッド、拡張関数 | トップレベル関数と拡張関数をサポート |
Ruby | すべてがオブジェクト | × | インスタンスメソッド、特異メソッド | 関数の概念がなく、すべてメソッド |
PHP | スクリプト言語からの進化 | 〇 | インスタンスメソッド、静的メソッド | 関数とメソッドが共存 |
4. まとめ
本記事では、Python、Java、Kotlin、Ruby、PHP の 5 つの言語における関数とメソッドの違いを比較し、それぞれの設計思想についても紹介しました。
このように、各言語の関数やメソッドの違いを理解することで、言語の背景や設計思想を深く知ることができます。
それぞれの言語がどのような考え方で成り立っているのかを意識すると、より楽しくプログラミングを学ぶことができるでしょう。
各言語ごとの詳しい解説や他のプログラミング関連の記事は、初心者のためのプログラミングテキスト&問題集 と言うサイト紹介しています。
市販のテキストに書いてある程度の知識は全てこのサイトで無料で学習できますので、ぜひチェックしてみてください!