オブジェクト指向のクラスとは?初心者でもわかる!

オブジェクト指向のクラスについて今日は紹介するよ!

  • オブジェクト指向のクラスってなに?
  • オブジェクト指向のクラスは何のためにあるの?
  • クラスとインスタンスの違いがわからない
  • 説明だけだとわからないからコードで書きたい

などの疑問をお持ちの方の悩みを解決できる記事になっています!

オブジェクト指向は初心者の人にとって難しいかもしれません。色々なサイトで見たけど、よくわからなかったという人も多いのではないでしょうか。

オブジェクト指向の重要な概念で、次のようなものがあります。

  • クラス
  • カプセル化
  • 継承
  • ポリモーフィズム

オブジェクト指向を習得するためには、これらの理解が必要です。オブジェクト指向が扱う範囲は広いです。そのため、基本をしっかりと抑えておかないと、挫折してしまうかもしれません。

この記事では、オブジェクト指向のクラス、クラスの使い方、クラスとインスタンスの違いなどを完全初心者向けに解説します!

サンプルのコードをあわせて説明しますので、実際にコードを書いて動作確認してみましょう!

記事を読めば、オブジェクト指向のクラスについて理解ができますよ!

こんな人におすすめ
  • オブジェクト指向のクラスの使い方を知りたい人
  • オブジェクト指向のクラスとインスタンスの違いがわからない人
  • オブジェクト指向を一言で説明できない人

オブジェクト指向のクラスを学ぶ前に

オブジェクト指向のクラスを学習する前に注意してほしいことがあります。

オブジェクト指向のクラスやインスタンスを理解するために、実際にコードを書いて動作確認をしてください。

なぜなら、コードを書かずに頭だけで理解することは難しいからです。

サンプルコードを書いて動作確認することを「写経」といいます。

写経することで、クラスの書き方や、なぜ動くのかを確認することができます。初心者の頃は横着してコピペする人が多いですが、これは非常にもったいないです。

手を動かして書くことで、記憶の定着が上がり、コードを書くことに慣れます。

実際に、プロのエンジニアも新しいプログラミング言語を習うときは、写経する人が多いです。

写経することで、頭の整理がしやすいからですね。

それに、体で覚える感覚を養うことができます。

私も写経は必ずやります。

オブジェクト指向をしっかり理解したい人は、サンプルコードを書くようにしてくださいね。

それでは、見てみましょう!

プログラミング言語って何?
そもそも「プログラミング」がよくわからないという人はこちらもあわせてご確認ください。

プログラミングとは?初心者向けにわかりやすく解説!

Rubyの実行環境

この記事では、クラスのサンプルコードは「Ruby」を書きます。

Rubyの実行環境は手元のパソコンでもいいですし、オンライン上でも大丈夫です。

例えば、こちらのサイトならオンライン上でコードを書くことができます。

Execute Ruby Online

オブジェクト指向ってなに?

オブジェクト指向とは、システム開発を効率的に行うための総合的な技術を指します。

オブジェクト指向は当初はプログラミング言語として開発されました。「クラス」「継承」「ポリモーフィズム」などの概念を取り入れ、オブジェクト指向プログラミング言語(OOP)と呼ばれるようになりました。

その後、プログラミング以外にもデザインパターンやUML、モデリングなどにも応用され、オブジェクト指向という概念が形成されました。

オブジェクト指向の基本についてこちらの記事で詳しく解説しています。オブジェクト指向のクラスを理解するためにも目を通しておきましょう。

【保存版】オブジェクト指向とは?プログラミング初心者向けに解説!

オブジェクト指向のクラスとは

クラスとは、英語訳で「種類」「分類」を意味します。つまり、「性質が同じものの集まり」です。

しかし、「性質が同じものの集まり」とは一体どういうものでしょうか。

例えば、以下の単語を見て何の種類かを見つけられるでしょうか。

  • 日本
  • アメリカ
  • イギリス
  • 韓国
  • イタリア

おそらく、「国」と思いつく人が多いと思います。

では、次はどうでしょう。

  • プリウス
  • アルファード
  • レクサス
  • ベンツ
  • アウディ

これは、「車」で分類できますね。(車に詳しくない人はすいません…)

このように具体的な事象から、共通の性質を見つけて分類したものをクラスといいます。

クラス(種類、分類) 具体的なもの
日本、アメリカ、イギリス、韓国、イタリア
プリウス、アルファード、レクサス、ベンツ、アウディ
果物 りんご、オレンジ、メロン、ぶどう

クラスがもつ3つの要素

クラスは、共通する性質をまとめて分類するという意味です。

オブジェクト指向のクラスはそれに加えて、次の3つの要素を持ちます。

  • 名前(クラス自身の)
  • データ
  • ふるまい

「名前」は、クラス自身の名前になります。

「データ」とは、クラスがもつ性質のことをいいます。

「ふるまい」とは、クラスがもつ動作になります。

こんな風に言われてもよくわからないと思うので、先程の例の「車」で考えてみましょう。

車は「排気量」「色」「メーカー」「年式」などのデータをもちます。そして、「走る」「止まる」「曲がる」というふるまいをもっています。

名前(クラス自身の) データ ふるまい
  • 排気量
  • メーカー
  • 年式
  • 走る
  • 止まる
  • 曲がる

どの車にも上記の性質や動作をしますよね。このように、車という分類に対して共通の性質や動作を定義することができます。

オブジェクト指向では、この3つの要素の集合をまとめてクラスをいいます。

そして、この「データ」と「ふるまい」は「プロパティ」と「メソッド」と呼ばれます。

要素 プログラミングでの呼び方
データ プロパティ(property)
ふるまい メソッド(method)

プロパティとメソッドは一般的に使われるプログラミング用語なので覚えておきましょう。

クラスの書き方

オブジェクト指向のクラスは次の3つの要素が必要という話をしました。

  • 名前(クラス自身の)
  • データ
  • ふるまい

では、実際にクラスを書いて、どのようにクラスを表現するのか確認してみましょう。

Rubyでクラスを書くときは、classキーワードを使います。

次の例では、車を表すCarクラスを定義しています。

class Car
    
end



上記のコードを書いたら「Execute」ボタンを押してみてください。

「Result」の結果には特に何も出ません。何もでなくて大丈夫です。これは、問題なく実行されたということです。

では、次にCarクラスのプロパティを定義してみましょう。

プロパティには次の3つを定義します。

  • name (車の種類)
  • color  (車の色)
  • model_year (車の年式)
class Car
    def initialize(name, color, model_year)
        @name = name
        @color = color
        @model_year = model_year
    end
   
   attr_accessor :name, :color, :model_year
end

 

どの車でも、種類や色、年式はありますよね。

それをクラスで定義するとこのように表現することができます。

では、このクラスはどのように活用させればいいのでしょうか。

オブジェクト指向のクラスを使うには、インスタンスという概念を理解する必要があります。

オブジェクト指向のインスタンスとは

オブジェクト指向のクラスとは、「性質が同じものの集まり」でした。

クラスと対になる概念で「インスタンス」というものがあります。

インスタンスは「具体的なもの」を意味します。

例えば、先程の車で説明すると、インスタンスは具体的な車のことを指します。

  • プリウス
  • アルファード
  • レクサス
  • ベンツ
  • アウディ

大きな分類をする車がクラスで、具体的な車体がインスタンスになります。

クラス(種類) インスタンス(具体的なもの)
日本、アメリカ、イギリス、韓国、イタリア
プリウス、アルファード、レクサス、ベンツ、アウディ
果物 りんご、オレンジ、メロン、ぶどう

クラスは3つの要素を持ちます。

  • 名前(クラス自身の)
  • データ
  • ふるまい

これはインスタンスにも当てはまります。

例えば、TOYOTAやベンツの車は特徴や性質、動作の仕方はそれぞれ違いますよね。それと同じように、インスタンスも個々で異なる性質をもつことができます。

インスタンス データ(プロパティ) ふるまい(メソッド)
プリウス
  • メーカー: TOYOTA
  • 排気量: 2000
  • 色: 黒
  • 年式: 2020
  • 走る
  • 止まる
  • 曲がる
ベンツ
  • メーカー: Benz
  • 排気量: 2500
  • 色: 黒
  • 年式: 2010
  • 走る
  • 止まる
  • 曲がる

クラスが一つに対して、インスタンスは複数存在することができます。

このように、クラスの要素から具体的なものをつくることを「インスタンス化」させるといいます。

クラスからインスタンス化させることで、共通のメソッドやプロパティを持ったオブジェクトを生成することができます。

オブジェクト指向では、このように共通の性質を抽出して、大量のデータをつくることができます。

インスタンスの書き方

では、具体的にインスタンスをコードで表現してみましょう。

先程書いた、例をもう一度見てみましょう。

class Car
    def initialize(name, color, model_year)
        @name = name
        @color = color
        @model_year = model_year
    end
   
   attr_accessor :name, :color, :model_year
end

ここにインスタンスを書きます。

Rubyのインスタンスは、Class.new で生成することができます。

class Car
    def initialize(name, color, model_year)
        @name = name
        @color = color
        @model_year = model_year
    end
   
   attr_accessor :name, :color, :model_year
end

# インスタンスをつくる(インスタンス化させる)
toyota = Car.new("TOYOTA", "黒", "20年式")

puts toyota.name
puts toyota.color
puts toyota.model_year

toyata がインスタンス化させた結果です。

実行結果は次の通りです。このインスタンスは、クラスが定義したプロパティに具体的な値を代入してデータを作っています。

次に、ベンツのインスタンスを作ってみましょう。

class Car
    def initialize(name, color, model_year)
        @name = name
        @color = color
        @model_year = model_year
    end
   
   attr_accessor :name, :color, :model_year
end

# インスタンスをつくる(インスタンス化させる)
toyota = Car.new("TOYOTA", "黒", "20年式")

puts toyota.name
puts toyota.color
puts toyota.model_year

# ベンツのインスタンスをつくる
benz = Car.new("Benz", "赤", "19年式")

puts benz.name
puts benz.color
puts benz.model_year

 

実行結果は次の通りです。

クラスからインスタンスを2つ作ることができました。

このように、クラスは共通の性質を抽出して、具体的なデータを作ることができます。

これを応用することで今まで一つ一つ作っていたデータを大量に生産し、効率の良いプログラムを組み立てることができます。

オブジェクト指向の意義は、「プログラミング開発を効率化」させることです。

クラスはオブジェクト指向の基礎概念です。

クラスを使うことで、再利用性の高いデータを扱うことができます。

実際のシステム開発では、もっと複雑なクラス構造になります。

なぜ、クラスをわざわざ作らないといけないのか疑問に感じる人もいると思います。

そんな方は、クラスの必要性が理解できたのではないでしょうか。

クラスとインスタンスの違いは

まとめると、クラスとインスタンスの違いは「分類」か「具体的」なものかです。

クラス(分類) インスタンス(具体的なもの)
日本、アメリカ、イギリス、韓国、イタリア
プリウス、アルファード、レクサス、ベンツ、アウディ
果物 りんご、オレンジ、メロン、ぶどう

まとめ

この記事では、オブジェクト指向のクラスについてまとめました。

最後にもう一度内容を確認しましょう。

  • クラスとは「種類」「分類」を意味し、「性質が同じものの集まり」
  • クラスは「名前」「データ」「ふるまい」をもつ
  • インスタンスは「具体的なもの」を意味する
  • インスタンスは複数生成可能
  • クラスは共通の性質を抽出して具体的なインスタンスを作り、効率的にプログラムを組み立てる

オブジェクト指向は難しい概念ですが、基礎を理解し、実践すれば身に付きます!

オブジェクト指向のクラス以外にも、継承、カプセル化、ポリモーフィズムも重要な概念です。

こちらもあわせてしっかり確認しておきましょう!