super 호출
Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 24번째.
재정의된 메서드 내부에서 super는 같은 메서드의 슈퍼클래스 버전을 호출합니다. 서브클래스는 결과를 반복해서 작성하는 대신 그 결과를 기반으로 확장할 수 있습니다:
class Greeter
def greet(name)
"Hello, #{name}"
end
end
class LoudGreeter < Greeter
def greet(name)
super.upcase + "!"
end
end
puts LoudGreeter.new.greet("Ada")출력:
HELLO, ADA!가장 일반적인 사용법은 initialize입니다. 서브클래스가 추가 값을 받고, 공통 값은 super(...)를 사용해 슈퍼클래스에 전달한 다음 자신의 값을 저장합니다:
class Person
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
class Student < Person
attr_reader :school
def initialize(name, age, school)
super(name, age)
@school = school
end
end
s = Student.new("Ada", 20, "MIT")
puts "#{s.name}, #{s.age}, #{s.school}"출력:
Ada, 20, MIT세 가지 형식은 전달하는 내용이 서로 다릅니다. 단독으로 사용하는 super는 현재 메서드가 받은 것과 동일한 인수를 전달하고, super()는 아무것도 전달하지 않으며, super(a, b)는 정확히 해당 인수들을 전달합니다:
class Base
def show(*args)
"Base got #{args.inspect}"
end
end
class Child < Base
def show(a, b)
[super, super(), super(b)].join(" | ")
end
end
puts Child.new.show(1, 2)출력:
Base got [1, 2] | Base got [] | Base got [2]super는 메서드의 어디에서든 실행할 수 있으며, 조건에 따라서만 실행할 수도 있습니다. 서브클래스의 initialize가 부모 클래스의 initialize와 다른 인자를 받는 경우, 인자 없이 사용하는 super는 잘못된 인자를 전달하며, 이는 흔히 발생하는 ArgumentError입니다:
class Logger
def log(message)
puts "LOG #{message}"
end
end
class QuietLogger < Logger
def log(message)
super unless message.start_with?("debug")
end
end
logger = QuietLogger.new
logger.log("started")
logger.log("debug x=1")
logger.log("done")출력:
LOG started
LOG done챌린지
쉬움클래스를 완성하세요. Person은 name과 age를 저장하며, to_s는 Ada (36)을 반환합니다. Student는 학교를 추가합니다. initialize는 이름과 나이를 super에 전달하고, to_s는 super를 바탕으로 Ada (20), studies at MIT을 반환합니다. Teacher는 같은 방식으로 과목을 추가하고 Bo (45), teaches maths를 반환합니다.
제공된 코드는 person Ada 36, student Ada 20 MIT 또는 teacher Bo 45 maths 형식의 줄을 읽고 각 객체를 출력합니다.
코드는 person.rb, student.rb 및 teacher.rb에 작성합니다. main.rb에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
require_relative 'person'
require_relative 'student'
require_relative 'teacher'
# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
kind, name, age, extra = line.split
person = case kind
when "student" then Student.new(name, age.to_i, extra)
when "teacher" then Teacher.new(name, age.to_i, extra)
else Person.new(name, age.to_i)
end
puts person
end
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Ruby 컴파일러