「オブジェクト指向って何?」「クラス?インスタンス?よくわからない…」
プログラミングを学んでいると必ず出てくる「オブジェクト指向」という言葉。
Java、Python、PHP、Ruby…多くの言語がオブジェクト指向を採用していますが、初心者にはとっつきにくい概念ですよね。
この記事では、オブジェクト指向とは何か、なぜ必要なのかを「料理」に例えて、できるだけわかりやすく解説します。
オブジェクト指向とは?
オブジェクト指向(Object-Oriented Programming、OOP)は、プログラムを「モノ(オブジェクト)」の集まりとして捉える考え方です。
「指向」は「〜を目指す」という意味なので、「モノを中心にプログラムを作ろう」というアプローチです。
「料理」で考えてみよう
レストランのキッチンを想像してください。
料理を作るには、様々な「モノ」が関わります。
- シェフ:料理を作る人
- 食材:肉、野菜、調味料など
- 調理器具:フライパン、包丁、オーブンなど
- 料理:完成した一皿
それぞれのモノには「特徴」と「できること」があります。
- シェフ:名前がある、料理ができる、レシピを覚えている
- フライパン:サイズがある、熱することができる
- 食材:名前がある、賞味期限がある、切ることができる
オブジェクト指向では、プログラムをこのような「モノ」の集まりとして考えます。
オブジェクト指向の基本用語
オブジェクト指向を理解するために、基本的な用語を押さえましょう。
| 用語 | 意味 | 料理で例えると |
|---|---|---|
| クラス | モノの「設計図」 | レシピ |
| オブジェクト(インスタンス) | 設計図から作った「実物」 | 実際に作った料理 |
| プロパティ(属性) | モノが持つ「データ」 | 料理名、カロリー、材料 |
| メソッド | モノができる「動作」 | 温める、盛り付ける |
クラスとオブジェクトの関係
「クラス」は設計図、「オブジェクト」は実物です。
例えば、「カレー」というクラス(レシピ)があれば、そこから何皿でもカレー(オブジェクト)を作れます。
# Pythonでの例
class Curry: # クラス(レシピ)
def __init__(self, spicy_level):
self.spicy_level = spicy_level # 辛さレベル
def serve(self): # メソッド(盛り付ける)
print("カレーをお皿に盛りました")
# オブジェクト(実際のカレー)を作る
mild_curry = Curry(1) # 甘口カレー
hot_curry = Curry(5) # 激辛カレー
同じレシピ(クラス)から、辛さの違うカレー(オブジェクト)を複数作れるイメージです。
オブジェクト指向の3つの特徴
オブジェクト指向には、3つの重要な特徴があります。
1. カプセル化
カプセル化は、「中身を隠して、必要な部分だけ見せる」こと。
例えば、炊飯器。
私たちは「お米と水を入れてボタンを押す」だけでご飯が炊けます。中で何が起きているか(加熱の仕組み、温度管理など)を知らなくても使えますよね。
プログラムも同じで、複雑な処理を隠して、使いやすいインターフェースだけを提供します。
2. 継承
継承は、「既存のクラスを元に、新しいクラスを作る」こと。
「料理」という基本クラスがあれば、そこから「和食」「洋食」「中華」といったクラスを派生させられます。
「和食」は「料理」の特徴を受け継ぎつつ、独自の特徴を追加できます。
# 継承の例
class Food: # 親クラス
def eat(self):
print("食べる")
class JapaneseFood(Food): # 子クラス(Foodを継承)
def use_chopsticks(self):
print("箸を使う")
sushi = JapaneseFood()
sushi.eat() # 親クラスのメソッドも使える
sushi.use_chopsticks() # 子クラス独自のメソッド
3. ポリモーフィズム(多態性)
ポリモーフィズムは、「同じ命令でも、対象によって動作が変わる」こと。
「調理する」という命令を出した時、
- ステーキなら「焼く」
- サラダなら「盛り付ける」
- スープなら「煮込む」
同じ「調理する」でも、対象によって処理が変わります。
| 特徴 | 意味 | メリット |
|---|---|---|
| カプセル化 | 中身を隠して使いやすくする | 複雑さを減らせる |
| 継承 | 既存クラスを元に新クラスを作る | コードの再利用ができる |
| ポリモーフィズム | 同じ命令で異なる動作 | 柔軟なプログラムが書ける |
なぜオブジェクト指向を使うの?
「なんでわざわざこんな面倒なことを?」と思うかもしれません。
1. コードが整理される
関連するデータと処理を「クラス」にまとめることで、コードが見やすくなります。
「ユーザーに関するコードはUserクラス」「商品に関するコードはProductクラス」と整理できます。
2. 再利用できる
一度作ったクラスは、他のプロジェクトでも使い回せます。
継承を使えば、既存のクラスを少し変えるだけで新しいクラスを作れます。
3. 修正が楽になる
バグを見つけた時、修正する場所が特定しやすいです。
「ユーザー関連のバグならUserクラスを見ればいい」とすぐわかります。
4. チーム開発に向いている
クラスごとに担当を分けられるので、複数人で同時に開発しやすくなります。
オブジェクト指向を使う言語
主要なプログラミング言語の多くがオブジェクト指向に対応しています。
| 言語 | オブジェクト指向 | 備考 |
|---|---|---|
| Java | ◎(完全対応) | オブジェクト指向が基本 |
| Python | ○(対応) | 使っても使わなくてもOK |
| PHP | ○(対応) | モダンなPHPは積極的に使用 |
| Ruby | ◎(完全対応) | すべてがオブジェクト |
| JavaScript | ○(対応) | ES6以降で本格対応 |
| C | × | 手続き型言語 |
初心者がつまずきやすいポイント
「いつ使うの?」がわからない
最初のうちは、「この場面でクラスを作るべきか?」が判断できないもの。
まずは既存のコードを読んで「こう使うのか」と理解することから始めましょう。
概念が抽象的で難しい
教科書的な説明だけでは、ピンとこないことも多いです。
実際にコードを書いて動かすことで、少しずつ理解が深まります。
小さなプログラムだとメリットを感じにくい
数十行のプログラムでは、オブジェクト指向のありがたみは感じにくいです。
プログラムが大きくなると、「オブジェクト指向で良かった」と実感できるようになります。
まとめ
この記事のポイントを整理します。
| 項目 | 内容 |
|---|---|
| オブジェクト指向とは | プログラムを「モノ」の集まりとして捉える考え方 |
| クラスとオブジェクト | クラス=設計図、オブジェクト=実物 |
| 3つの特徴 | カプセル化、継承、ポリモーフィズム |
| メリット | コード整理、再利用、修正しやすい、チーム開発向き |
オブジェクト指向は、最初は難しく感じて当然です。
でも、エンジニアとして働くなら避けて通れない概念。焦らず、コードを書きながら少しずつ慣れていきましょう!
SKサービスでは、Java、PHP、Pythonなどオブジェクト指向言語を使った開発案件が多数あります。「概念はわかったけど実践が…」という方も大丈夫。現場で実際のコードに触れながら、着実に理解を深めていけます。まずはお気軽にご相談ください!