Menu
Coddy logo textTech

메서드 오버라이딩

Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 23번째.

서브클래스는 같은 이름으로 메서드를 정의하여 메서드를 재정의할 수 있습니다. Ruby는 먼저 객체 자체의 클래스에서 메서드를 찾고, 그다음에야 슈퍼클래스에서 찾으므로 서브클래스의 버전이 우선합니다:

class Animal
  def speak
    "..."
  end
end

class Dog < Animal
  def speak
    "Woof"
  end
end

class Fish < Animal
end

puts Dog.new.speak
puts Fish.new.speak

출력:

Woof
...

다른 메서드를 호출하는 슈퍼클래스 메서드는 서브클래스 객체에 대해 재정의된 버전을 사용합니다. 공유 메서드는 한 번만 작성하고, 각 서브클래스는 다른 부분만 변경합니다:

class Animal
  def initialize(name)
    @name = name
  end

  def introduce
    "#{@name} says #{speak}"
  end

  def speak
    "..."
  end
end

class Cat < Animal
  def speak
    "Meow"
  end
end

puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduce

출력:

Tom says Meow
Thing says ...

하위 클래스에서 to_s를 재정의하면 해당 하위 클래스의 출력 방식만 변경됩니다. 재정의하지 않은 메서드는 여전히 상위 클래스에서 가져옵니다:

class Item
  def initialize(name, price)
    @name = name
    @price = price
  end

  def to_s
    format("%s %.2f", @name, @price)
  end
end

class SaleItem < Item
  def to_s
    format("%s %.2f (sale)", @name, @price * 0.8)
  end
end

puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)

출력:

Lamp 20.00
Lamp 16.00 (sale)

Ruby가 검색하는 순서는 클래스의 조상입니다. 즉, 클래스 자체에서 시작하여 슈퍼클래스로 이동하고, Object까지 계속됩니다. 해당 목록에서 메서드를 정의한 첫 번째 클래스가 그 메서드를 제공합니다.

class Animal
  def speak
    "..."
  end
end

class Dog < Animal
  def speak
    "Woof"
  end
end

class Puppy < Dog
end

puts Puppy.new.speak
p Puppy.ancestors.take(3)

출력:

Woof
[Puppy, Dog, Animal]
challenge icon

챌린지

쉬움

급여 클래스를 완성하세요. Employee는 name을 저장하며, hours * 20을 반환하는 pay(hours)와 pay를 사용하여 Ada: 800을 반환하는 payslip(hours)을 가집니다. Manager는 시간과 관계없이 고정된 1500을 반환하도록 pay를 재정의합니다. Intern은 pay를 hours * 12로 재정의하지만, 최대 300까지만 반환합니다. payslip은 Employee에만 정의됩니다.

제공된 코드는 employee Ada 40, manager Bo 50 또는 intern Cy 20 형식의 줄을 읽고, 일치하는 객체를 생성하여 해당 객체의 급여 명세서를 출력한 다음 총 급여를 출력합니다.

코드는 employee.rb, manager.rb 및 intern.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 포함되어 있으며 편집할 수 없습니다.

직접 해보기

require_relative 'employee'
require_relative 'manager'
require_relative 'intern'

# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
  input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
  kind, name, hours = line.split
  worker = kinds[kind].new(name)
  puts worker.payslip(hours.to_i)
  total += worker.pay(hours.to_i)
end
puts "total: #{total}"
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Ruby 컴파일러