Menu
Coddy logo textTech

클래스 메서드

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

클래스 메서드는 하나의 인스턴스가 아니라 클래스에 속합니다. 클래스 본문에서 self는 클래스이므로 def self.name은 클래스에 메서드를 정의합니다. 클래스 자체에서 호출합니다:

class Temperature
  def self.to_fahrenheit(celsius)
    celsius * 9 / 5.0 + 32
  end
end

puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)

출력:

212.0
-40.0

클래스 메서드와 인스턴스 메서드는 서로 다른 곳에 존재합니다. 인스턴스는 클래스 메서드를 직접 호출할 수 없으며, self.class 또는 클래스 이름을 통해 접근합니다:

class Circle
  def self.area_for(r)
    (3.14159 * r * r).round(2)
  end

  def initialize(r)
    @r = r
  end

  def area
    self.class.area_for(@r)
  end
end

puts Circle.area_for(1)
puts Circle.new(2).area
begin
  Circle.new(2).area_for(2)
rescue NoMethodError => e
  puts e.message
end

출력:

3.14
12.57
undefined method `area_for' for an instance of Circle

class << self는 클래스 본문의 한 섹션을 열며, 그 안의 모든 def는 클래스 메서드가 됩니다. 클래스에 이러한 메서드가 여러 개 있을 때 self.를 작성하는 수고를 덜 수 있습니다:

class Units
  class << self
    def km_to_miles(km)
      (km * 0.621371).round(1)
    end

    def miles_to_km(miles)
      (miles / 0.621371).round(1)
    end
  end
end

puts Units.km_to_miles(10)
puts Units.miles_to_km(26.2)

출력:

6.2
42.2

단위 변환, 텍스트를 객체로 구문 분석하거나 모든 인스턴스의 개수를 세는 것처럼 특정 객체 하나가 아니라 해당 종류의 것에 속하는 작업에는 클래스 메서드를 사용하세요. 한 객체의 데이터가 필요한 작업은 인스턴스 메서드로 유지하세요:

class Invoice
  def self.tax_rate      # 모든 인보이스에 동일함
    0.2
  end

  def tax                # 이 인보이스의 금액이 필요함
    @amount * Invoice.tax_rate
  end
end
challenge icon

챌린지

쉬움

Temperature 클래스의 메서드를 완성하세요. to_fahrenheit(c)와 to_celsius(f)는 값을 변환합니다. feel(celsius)은 0 미만이면 freezing, 15 미만이면 cold, 25 미만이면 mild, 그 외에는 hot을 반환합니다. convert(text)는 20 C 또는 68 F와 같은 텍스트를 받아 20.0 C = 68.0 F (mild) 또는 68.0 F = 20.0 C (mild)를 반환합니다. 결과에는 소수점 이하 한 자리가 표시되며 섭씨 값의 상태가 포함됩니다. 이 메서드는 다른 클래스 메서드를 사용합니다.

제공된 코드는 모든 입력 줄에 대해 Temperature.convert(line)을 호출하고 결과를 출력합니다. Temperature의 인스턴스는 생성되지 않습니다.

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

직접 해보기

require_relative 'temperature'

# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
  input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
quiz icon실력 점검

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

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

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