choco-ballの日記

勉強のアウトプットのためのブログ

Ruby(10) クラスとインスタンスとは?

今回はクラスとインスタンスについてです。
ただ、学習にあたってオブジェクト指向とは何か
という部分を知らなければいけないので
まずはオブジェクト指向について学習しましょう。

オブジェクト指向というのは
データの集合体(属性)とそのデータに対する動作(メソッド)を一つの設計図(クラス)として作成し、
設計図から作成したモノ(インスタンス)とモノを組み合わせることによってプログラムを作っていく手法です。
人間で説明するとわかりやすいので人間に例えて説明します。
まずモノを作るためには設計図が必要になります。
人間の設計図を作るために何が必要でしょうか?
人間の特徴の部分と、人間が行う動作を設計図に記述する必要があります。
まずは人間の設計図を作ってみましょう。

# Humanクラスを作成
class Human


# initializeはインスタンス作成時に自動実行される処理
# 今回は人物の名前と年齢の情報を格納
# 変数の頭に@をつけることでインスタンス変数というものになり、クラス内の他のメソッドでも使用できるようになる。

  def initialize(human_name, human_age)
    @human_state = {} # 情報を格納するためのハッシュを作成
    @human_state[:name] = human_name # nameというキーを作りバリューとして引数を指定
    @human_state[:age] = human_age # ageというキーを作りバリューとして引数を指定
    # この一つ目のインスタンスの段階でのハッシュの中身  {:name=>"taro", :age=>18}
  end

  # 食べるものの情報
  def eat(food)
    puts "#{@human_state[:name]}#{food}を食べる"
  end
  
  #歩く場所の情報
  def walk(place)
    puts "#{@human_state[:name]}#{place}を歩く"
  end
end


ちゃんと記述すると情報量が多すぎるので年齢と名前しか入れてないです!
イメージは掴めたでしょうか?
人物の情報を定義した上でその人物に特定の動作をさせます。
次はクラスのインスタンス化(設計図をモノとして実体化させる)と動きをつけるための記述です。

taro = Human.new("太郎", 18) # taroという変数にHumanクラスを.newによりインスタンス化して格納 ここで指定した引数がinitializeに送られる。
taro.eat("家系ラーメン") # taroにeatメソッドを実行するように指示
taro.walk("東白楽") # taroにwalkメソッドを実行するように指示

hanako = Human.new("花子", 15)
hanako.eat("カレー")
hanako.walk("横須賀")


少しずつイメージが固まってきたでしょうか?
一度プログラム全体を見てみましょう。

class Human

  def initialize(human_name, human_age)
    @human_state = {}
    
    @human_state[:name] = human_name
    @human_state[:age] = human_age
  end

  def eat(food)
    puts "#{@human_state[:name]}#{food}を食べる"
  end

  def walk(place)
    puts "#{@human_state[:name]}#{place}を歩く"
  end
end

taro = Human.new("太郎", 18)
taro.eat("家系ラーメン")
taro.walk("東白楽")

hanako = Human.new("花子", 15)
hanako.eat("カレー")
hanako.walk("横須賀")


難しいことをやっているように見えますが、
考え方一つで簡単に捉えることができます。
まず主役となるモノを設計図に基づいて作り上げます。
その後そのモノに対して「〜を食べて」「〜を歩いて」と言ったような指令を出します。
オブジェクト指向のプログラミングはプログラムとプログラマの対話です。
難しく考えすぎる必要はありません。

今回の例(太郎君)では
まず変数taroに設計図に基づいて太郎君をインスタンス化して代入します。
その際に太郎君の人物情報をinitializeメソッドに送りハッシュに格納しています。
その後taroに対してeatメソッドを実行してという指令を出したりwalkメソッドを実行してという指令を出しています。
難しく考えすぎるとドツボにハマるので
シンプルに自分がわかりやすいように考えていくようにしましょう。
では今回はこの辺りで!