#この記事で書いていること
・オブジェクトってなに?
・クラスとインスタンスの関係
オブジェクトについて、クラスとインスタンスの関係について勉強したので自分でまとめてみました。いざ説明しようとすると、なかなかうまい言葉が思い浮かばず苦労しました…。分かりにくい説明ですが、理解の手助けになれれば幸いです。
#オブジェクトってなに?
Rubyで扱える値は全てオブジェクトです。
全てのオブジェクトは、なんらかのクラス(設計図)のインスタンス(実体化)です。
そしてクラスは、他のクラスを継承することができます。継承される既存クラスのことを親クラスといいます。
全てのクラスの親クラスはObjectクラスになります。
クラスの親クラスはClassクラスです。Classクラスの親クラスはModuleクラス、Moduleクラスの親クラスがObjectクラスといった形になっています。
詳しくは以下のページへ!
・Rubyリファレンス:標準クラス・モジュール
#クラスとインスタンスの関係
・インスタンス=クラスをもとに生成されるオブジェクト。インスタンスは実体という意味で、クラスを実体化したもの、ということになります。
・クラスではインスタンスを作る際の属性や操作を定義します。インスタンスの設計図とよく聞きますね。
インスタンスを生成するには必ずクラスを指定する必要があり、指定したクラスから生成されたインスタンスは、クラスで定義した属性を持ち、クラスで定義した操作を行うことができます。
属性は、インスタンスによって値を変えることができます。
##スマホをクラスとインスタンスで作ってみる
では、クラスとインスタンスの関係を使ってスマホを2つ作ってみましょう!
スマホクラスを作り、そこからインスタンスを2つ作ります。
スマホクラスは、全てのスマホに共通する属性、操作が定義されます。
属性
・メーカー
・色
・容量
属性は1つ1つのスマホによってそれぞれです。
操作
・電話をする
・メールをする
・写真を撮る
スマホができる操作です。
実際のスマホはもっと定義できる属性と操作がありますが、今回はこの3つに絞って考えます。
スマホクラスから作られたインスタンスは、メーカー、色、容量の属性を持ち、電話をする、メールをする、写真を撮るという操作を行うことができます。
スマホクラスを作ってしまえば、スマホ(実体)をいくつでも簡単に作れますね!
##Rubyでスマホをクラスとインスタンスで作ってみる
実際にRubyでスマホクラスを作り、インスタンスを生成してみましょう!
はじめに、スマホクラスを作ります。
属性と操作を定義してみましょう。
属性はインスタンス変数(@)、操作はdef~endで定義をします。
class Smartphone
# 属性の定義
#インスタンス変数を読み書きするためのアクセサメソッド。
attr_accessor :manufacture, :color, :storage
# inithalizeメソッド…インスタンスが生成される時に自動的で呼び出されるメソッド
# 必ず実行したい処理(初期化など)を、メソッドを呼び出すことなく実行することができる
def initialize(manufacture, color, storage)
# インスタンス生成時に与えられた値(属性の内容)をインスタンス変数に保存
@manufacture = manufacture
@color = color
@storage = storage
end
# 操作(メソッド)の定義
def tel(name)
puts "#{name}に電話をかける"
end
def email(name)
puts "#{name}にメールを送る"
end
def picture
puts "写真を撮る"
end
end
これでスマホクラスができました。
では。ここからインスタンスを2つ生成しましょう。
インスタンスはクラス名.newで作ることができます。
class Smartphone
# 属性の定義
attr_accessor :manufacture, :color, :storage
def initialize(manufacture, color, storage)
@manufacture = manufacture
@color = color
@storage = storage
end
# 操作の定義
def tel(name)
puts "#{name}に電話をかける"
end
def email(name)
puts "#{name}にメールを送る"
end
def picture
puts "写真を撮る"
end
end
# 追加ーーーーーーーーーーーーーーーーー
# クラスからインスタンスを生成
smaho_1 = Smartphone.new("Apple", "black", 128)
smaho_2 = Smartphone.new("Google", "white", 64)
これで2つのスマホを作ることができました。それぞれスマホ1とスマホ2の属性を見てみましょう。
class Smartphone
# 属性の定義
attr_accessor :manufacture, :color, :storage
def initialize(manufacture, color, storage)
@manufacture = manufacture
@color = color
@storage = storage
end
# 操作の定義
def tel(name)
puts "#{name}に電話をかける"
end
def email(name)
puts "#{name}にメールを送る"
end
def picture
puts "写真を撮る"
end
end
# クラスからインスタンスを生成
smaho_1 = Smartphone.new("Apple", "black", 128)
smaho_2 = Smartphone.new("Google", "white", 64)
# 追加ーーーーーーーーーーーーーーーーー
# スマホ1の属性
puts "-スマホ1-"
puts smaho_1.manufacture
puts smaho_1.color
puts smaho_1.storage
# スマホ2の属性
puts "-スマホ2-"
puts smaho_2.manufacture
puts smaho_2.color
puts smaho_2.storage
ターミナルでrubyファイルを実行し、属性を見てみます
$ruby object.rb
-スマホ1-
Apple
black
128
-スマホ2-
Google
white
64
スマホ1、スマホ2で別々の属性が設定できているのが分かります。
インスタンスは所属するクラスで定義した操作を行うことができます。
では、スマホ1で電話、スマホ2でメールを送る処理をしてもらいましょう。
class Smartphone
# 属性の定義
attr_accessor :manufacture, :color, :storage
def initialize(manufacture, color, storage)
@manufacture = manufacture
@color = color
@storage = storage
end
# 操作の定義
def tel(name)
puts "#{name}に電話をかける"
end
def email(name)
puts "#{name}にメールを送る"
end
def picture
puts "写真を撮る"
end
end
# クラスからインスタンスを生成
smaho_1 = Smartphone.new("Apple", "black", 128)
smaho_2 = Smartphone.new("Google", "white", 64)
# スマホ1の属性
puts "-スマホ1-"
puts smaho_1.manufacture
puts smaho_1.color
puts smaho_1.storage
# スマホ2の属性
puts "-スマホ2-"
puts smaho_2.manufacture
puts smaho_2.color
puts smaho_2.storage
# 追加ーーーーーーーーーーーーーーーーー
# クラスで定義した操作をする
puts "-操作-"
smaho_1.tel("お母さん")
smaho_2.email("お父さん")
ターミナルで実行します
$ruby object.rb
-スマホ1-
Apple
black
128
-スマホ2-
Google
white
64
-操作-
お母さんに電話をかける
お父さんにメールを送る
ちゃんと電話とメールをしてくれました!
スマホ1とスマホ2はスマホクラスから生成されたインスタンスなので、どちらも電話をする、メールをする、写真を撮るという操作を行うことができるのです。
#学んだことまとめ
・オブジェクトはRubyで扱える全ての値を指す。オブジェクト自体はなんらかのクラスのインスタンスであり、大元のクラスはObjectクラスである。
・クラスはインスタンスの設計図で、そのクラスが持つ属性と操作を定義する。
・属性はインスタンス変数(@)、操作は**def~end(メソッド)**で定義する。
・インスタンスはクラスから生成される。
・属性の値はインスタンスごとで設定できる。
・インスタンスは**親クラスのメソッド(操作)**を使用できる。
#参考
・Rubyを始めたけど今ひとつRubyのオブジェクト指向というものが掴めないという人、ここに来て見て触って!
・rubyにおけるオブジェクト指向とはなにか(๑•̀ㅂ•́)و✧【基礎】
・オブジェクトの概念 Ruby
・Ruby 2.6.0 リファレンスマニュアル > オブジェクト
・オブジェクト指向超入門
・Rubyリファレンス:標準クラス・モジュール