Menu
Coddy logo textTech

메서드와 self

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

메서드는 수신자를 작성하지 않고도 같은 객체의 다른 메서드를 호출할 수 있습니다. Ruby는 호출을 현재 객체에 전달하므로 메서드들이 서로를 기반으로 구성됩니다:

class Order
  def initialize(price, quantity)
    @price = price
    @quantity = quantity
  end

  def subtotal
    @price * @quantity
  end

  def shipping
    subtotal >= 50 ? 0 : 5
  end

  def total
    subtotal + shipping
  end
end

puts Order.new(10, 3).total
puts Order.new(20, 3).total

출력:

35
60

메서드 안에서 self는 메서드가 호출된 객체입니다. self를 반환하는 메서드를 사용하면 호출자는 동일한 객체에서 여러 호출을 연결할 수 있습니다:

class Counter
  def initialize
    @count = 0
  end

  def add(n)
    @count += n
    self
  end

  def count
    @count
  end
end

puts Counter.new.add(2).add(5).count

출력:

7

객체는 self를 사용하여 다른 코드에 자기 자신을 전달할 수도 있습니다. 예를 들어 같은 클래스의 다른 객체와 비교한 결과에서 승자를 반환할 수 있습니다:

class Player
  def initialize(name, score)
    @name = name
    @score = score
  end

  def name
    @name
  end

  def score
    @score
  end

  def winner_against(other)
    score >= other.score ? self : other
  end
end

ada = Player.new("Ada", 9)
bo = Player.new("Bo", 7)
puts ada.winner_against(bo).name
puts bo.winner_against(ada).name

출력:

Ada
Ada

예 또는 아니요로 답하는 메서드 이름은 ?으로 끝나며, empty?와 같습니다. 매개변수에는 기본값을 지정할 수 있으며, 호출자가 인수를 생략하면 이 값이 사용됩니다:

class Kettle
  def initialize
    @temp = 20
  end

  def hot?
    @temp >= 90
  end

  def heat(degrees = 10)
    @temp = [@temp + degrees, 100].min
  end
end

k = Kettle.new
k.heat
puts k.hot?
k.heat(75)
puts k.hot?

출력:

false
true
challenge icon

챌린지

쉬움

ShoppingCart 클래스를 완성하세요. add(name, price)는 항목을 저장하고 카트 자체를 반환하므로 호출을 연결할 수 있습니다. total은 가격의 합계를 반환하고, free_shipping?은 합계가 20 이상일 때 true를 반환하며, summary는 소수점 이하 두 자리로 3 items, total 12.50(또는 1 item, total 4.00)를 반환합니다.

제공된 코드는 호출을 연결하여 입력 줄마다 항목 하나(name price)를 추가한 다음 summary와 free shipping: true 또는 free shipping: false를 출력합니다.

코드는 shopping_cart.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.

직접 해보기

require_relative 'shopping_cart'

# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
  input << line.chomp
end
cart = input.reduce(ShoppingCart.new) do |c, line|
  name, price = line.split
  c.add(name, price.to_f)
end
puts cart.summary
puts "free shipping: #{cart.free_shipping?}"
quiz icon실력 점검

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

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

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