エラノート エラノート

関数とメソッドの違いとは?初心者向けにやさしく解説

関数 メソッド Python JavaScript 概念解説
広告スペース (article-top)

プログラミングを学んでいると「関数」と「メソッド」という2つの言葉が出てきます。どちらも「処理をまとめたもの」ですが、何が違うのでしょうか。この記事では関数とメソッドの違いをわかりやすく解説します。

関数とは

関数(function)は、特定の処理をまとめて名前をつけたものです。入力(引数)を受け取り、処理を行い、結果(戻り値)を返します。

Pythonの関数

# 関数の定義
def add(a, b):
    return a + b

# 関数の呼び出し
result = add(3, 5)
print(result)  # 8

# 組み込み関数の例
print(len("hello"))   # 5
print(max(1, 5, 3))   # 5
print(type(42))        # <class 'int'>

JavaScriptの関数

// 関数宣言
function add(a, b) {
  return a + b;
}

// アロー関数
const multiply = (a, b) => a * b;

// 関数の呼び出し
console.log(add(3, 5));       // 8
console.log(multiply(4, 6));  // 24

// 組み込み関数の例
console.log(parseInt("42"));       // 42
console.log(Math.max(1, 5, 3));    // 5
console.log(isNaN("hello"));      // true

関数は「単独で存在」し、名前を指定して呼び出します。特定のオブジェクトに属さず、独立した処理単位です。

メソッドとは

メソッド(method)は、オブジェクト(データ)に紐づいた関数です。「そのデータに対して行う操作」を表します。

Pythonのメソッド

# 文字列のメソッド
text = "hello world"
print(text.upper())       # "HELLO WORLD"
print(text.split(" "))    # ["hello", "world"]
print(text.replace("world", "python"))  # "hello python"

# リストのメソッド
fruits = ["りんご", "みかん"]
fruits.append("ぶどう")     # リストに追加
print(fruits)               # ["りんご", "みかん", "ぶどう"]
fruits.sort()               # ソート
print(fruits.count("りんご"))  # 1

JavaScriptのメソッド

// 文字列のメソッド
const text = "hello world";
console.log(text.toUpperCase());    // "HELLO WORLD"
console.log(text.split(" "));       // ["hello", "world"]
console.log(text.includes("world")); // true

// 配列のメソッド
const numbers = [3, 1, 4, 1, 5];
numbers.push(9);                     // 配列に追加
console.log(numbers.sort());         // [1, 1, 3, 4, 5, 9]
console.log(numbers.indexOf(4));     // 3

メソッドは「オブジェクト.メソッド名()」の形で呼び出します。ドット(.)の前にあるオブジェクトに対して操作を行います。

関数とメソッドの違いを整理

具体的な違いを表にまとめます。

関数:
  呼び出し方:    関数名(引数)
  所属先:        なし(独立している)
  例(Python):  len("hello"), print(42), max(1, 2, 3)
  例(JS):      parseInt("42"), alert("hello")

メソッド:
  呼び出し方:    オブジェクト.メソッド名(引数)
  所属先:        オブジェクトに紐づいている
  例(Python):  "hello".upper(), [1,2].append(3)
  例(JS):      "hello".toUpperCase(), [1,2].push(3)

同じ操作の関数版とメソッド版

Pythonでは同じ操作が関数とメソッドの両方で提供されていることがあります。

# 文字列の長さを取得
text = "hello"

# 関数: len()
print(len(text))      # 5

# 注意: text.len() は存在しない
# print(text.len())   # AttributeError
# リストのソート
numbers = [3, 1, 4, 1, 5]

# 関数: sorted() → 新しいリストを返す(元のリストは変わらない)
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # [1, 1, 3, 4, 5]
print(numbers)         # [3, 1, 4, 1, 5](元のまま)

# メソッド: .sort() → 元のリストを直接変更する
numbers.sort()
print(numbers)         # [1, 1, 3, 4, 5](変更された)

sorted()関数は新しいリストを返し元のリストは変わりませんが、.sort()メソッドは元のリスト自体を変更します。この違いは実務で重要です。

自分でメソッドを定義する

クラスを使うと、自分でメソッドを定義できます。

Pythonでメソッドを定義

class Calculator:
    def __init__(self):
        self.history = []

    def add(self, a, b):
        result = a + b
        self.history.append(f"{a} + {b} = {result}")
        return result

    def show_history(self):
        for record in self.history:
            print(record)

# 使い方
calc = Calculator()
calc.add(3, 5)    # 8(メソッド呼び出し)
calc.add(10, 20)  # 30
calc.show_history()
# 3 + 5 = 8
# 10 + 20 = 30

JavaScriptでメソッドを定義

class Calculator {
  constructor() {
    this.history = [];
  }

  add(a, b) {
    const result = a + b;
    this.history.push(`${a} + ${b} = ${result}`);
    return result;
  }

  showHistory() {
    this.history.forEach((record) => {
      console.log(record);
    });
  }
}

// 使い方
const calc = new Calculator();
calc.add(3, 5);    // 8
calc.add(10, 20);  // 30
calc.showHistory();
// 3 + 5 = 8
// 10 + 20 = 30

メソッドの中ではself(Python)やthis(JavaScript)を使って、オブジェクト自身のデータにアクセスします。

よくある間違いと対策

間違い1: メソッドを関数のように呼び出す

# NG: メソッドを関数のように呼ぶ
text = "hello"
# upper(text)  # NameError: 'upper' is not defined

# OK: オブジェクト.メソッド() で呼ぶ
text.upper()  # "HELLO"

間違い2: 関数をメソッドのように呼び出す

# NG: 関数をメソッドのように呼ぶ
numbers = [3, 1, 4]
# numbers.len()  # AttributeError

# OK: 関数として呼ぶ
len(numbers)  # 3

間違い3: メソッドの戻り値を無視する

# NG: sort()の戻り値を変数に入れる(Noneが入る)
numbers = [3, 1, 4]
result = numbers.sort()
print(result)   # None(sort()は戻り値がない)

# OK: sort()はリスト自体を変更する
numbers = [3, 1, 4]
numbers.sort()
print(numbers)  # [1, 3, 4]

# OK: 新しいリストが欲しいならsorted()関数を使う
numbers = [3, 1, 4]
result = sorted(numbers)
print(result)   # [1, 3, 4]

使い分けのポイント

  • 独立した汎用的な処理 → 関数として定義する
  • 特定のデータに紐づく操作 → メソッドとして定義する
  • 迷ったら関数から始めて、必要に応じてクラスのメソッドにリファクタリングする

関数とメソッドの違いは、最初は細かいことのように感じるかもしれませんが、オブジェクト指向プログラミングを理解するための基礎になります。まずは「ドットの前にオブジェクトがあるかどうか」で見分ける練習をしてみてください。

広告スペース (article-bottom)

あわせて読みたい