Menu
Coddy logo textTech

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
challenge icon

챌린지

쉬움

클래스를 완성하세요. 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
quiz icon실력 점검

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

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

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