Ruby의 상속에 대하여

프로그래밍 공부 일기



2020년 7월 11일 Progate Lv.175
루비 V

상속



클래스를 1부터 만들 수도 있지만, 이미 있는 클래스를 이용해 그 클래스를 바탕으로 새로운 클래스를 만들 수 있다. 그렇게 함으로써 공통 부분을 정리할 수 있어 효율적으로 코드를 쓸 수 있다.
한 클래스를 바탕으로 새로운 클래스를 만드는 것을 계승이라고 한다. class 新しいクラス名 < 元となるクラス名 에서 다른 클래스를 상속하여 새 클래스를 정의할 수 있습니다. 새로운 클래스는 「아이 클래스」, 원래가 되는 클래스는 「부모 클래스」라고 한다.
부모 클래스의 인스턴스 메소드가 계승된다.

food.rb
require "./menu"
class Food < Menu
end

자식 클래스의 인스턴스가 상속되면 자식 클래스는 부모 클래스의 인스턴스 메서드를 상속받습니다.

index.rb
food1=Food.new
puts food1.name
puts food2.info

menu.rb
class Menu
  attr_accessor :name 
  #処理
  def info
    return "#{self.name} #{self.price}円"
  end
end

인스턴스 변수 추가



자식 클래스에 인스턴스 변수를 추가하려면 지금까지와 같이 attr_accessor 를 사용한다.

menu.rb
class Menu
  attr_accessor :name 
  attr_accessor :price
end

Food 클래스는 Menu 클래스를 상속하고 있기 때문에. "name, price, calorie"의 세 가지 인스턴스 변수가 있습니다.

food.rb
class Food < Menu
  #Foodクラスにcalorieを追加する
  attr_accessor :calorie
end

마찬가지로 인스턴스 메소드도 추가할 수 있다.

오버라이드



부모에 있는 메소드와 같은 이름의 메소드를 아이 클래스로 정의하면, 메소드를 덧쓰기할 수 있다. 이것을 오버라이드라고 한다.

index.rb (메소드 호출)
food1~Food.new(...)
food1.calorie=700
puts food1.info

menu.rb (부모 클래스)
class Menu
  #処理
  def info
    #処理
  end
end

food.rb (자식 클래스)
class Food < Menu
  #処理
  #メソッドの上書き(上書きしたメソッドが呼び出される)
  def info
    #処理
  end
end

자식 클래스의 인스턴스는 자식 클래스에서 정의한 메서드를 우선적으로 호출한다. 따라서 자식 클래스와 부모 클래스에 같은 이름의 메서드가 있으면 자식 클래스의 메서드 내용을 덮어 씁니다. initialize 메소드에서도 재정의가 가능하다.

슈퍼



오버라이드(override) 한 메소드 중에서 super 로 하는 것으로, 부모 클래스의 같은 이름의 메소드를 호출할 수 있다. super에서는 메소드를 호출하고 있으므로, 부모 클래스의 메소드에 맞추어 super에 대해서 인수를 건네줄 필요가 있다.

menu.rb
class Menu
  attr_accessor :name 
  attr_accessor :price
  def initialize(name:, price:)
    self.name=name
    self.price=price
  end
end

food.js
class Food < Menu
  attr_accessor :calorie
  def initialize(name:, price:, calorie:)
    super(name: name, price: price)
    self.calorie=calorie
  end
end



Date 클래스



날짜를 다루는 클래스. Date 클래스는 Ruby가 이미 준비하고 있는 클래스로, require 로 date를 읽어들여 클래스를 정의하지 않아도 사용할 수 있다. 이미 준비되어 있는 클래스는 다른 것과는 require 의 작성 방법이 다르다

index.rb
# "/date"ではない!
reruire "date"

Date 클래스의 인스턴스


Date.new 로 인스턴스를 생성할 수 있다. Date.today 에서 오늘 날짜의 인스턴스를 만들 수 있습니다.

index.rb
require "date"
#引数に「年・月・日」を渡してDateメソッドを作成
date1=Date.new(2020,7,8)
puts date

콘솔
2020-07-08

Date 클래스의 인스턴스 메서드



많은 인스턴스 메소드가 있다. 일요일인지 아닌지를 진위치로 건네주는 것은 sunday? 메소드.

index.rb
require "date"
date1=date1.new(2020,7,11)
puts date1.sunday?

콘솔
false

클래스 메소드



클래스에 대해 호출하는 메소드. Date.todaytoday 사촌. 클래스 메소드는 def クラス名.メソッド名 로 하는 것으로 정의할 수 있다. 인스턴스 메서드와 달리 메서드 이름 앞에 클래스 이름을 씁니다.
클래스 메소드의 호출은, クラス名.メソッド名 로 한다.

menu.rb
class Menu
  #処理
  #今日の日付が日曜日かどうかを真偽値で返す
  def Menu.is_discount_day?  
    #今日の日付の情報を持つDateインスタンス
    today=Date.today
    return today.sunday
  end
end
puts Menu.is_discount_day?

인스턴스 메소드에서 클래스 메소드 호출

menu.rb
class Menu
  #処理
  def get_total_price  #インスタンスメソッド
    if Menu.discount_day?  #クラスメソッドの呼び出し
      #処理
    end
  end
end

좋은 웹페이지 즐겨찾기