Menu
Coddy logo textTech

상수

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

상수는 대문자로 시작하며 관례상 대문자로 작성됩니다. 클래스 본문에서 정의하면 클래스의 모든 메서드에서 이름으로 사용할 수 있습니다. 클래스 외부에서는 ClassName::NAME과 같이 작성합니다.

class Account
  MIN_BALANCE = -100

  def self.allowed?(balance)
    balance >= MIN_BALANCE
  end
end

puts Account::MIN_BALANCE
puts Account.allowed?(-50)
puts Account.allowed?(-150)

출력:

-100
true
false

상수는 제한이나 조회 테이블처럼 클래스 전체에서 사용하는 고정된 데이터에 적합합니다. 해시 상수에서 fetch를 사용하면 알 수 없는 키에 대해 조용히 nil을 반환하는 대신 KeyError를 발생시킵니다:

class Shipping
  RATES = { "standard" => 5, "express" => 12 }.freeze

  def self.cost(method)
    RATES.fetch(method)
  end
end

puts Shipping.cost("express")
begin
  Shipping.cost("drone")
rescue KeyError => e
  puts e.message
end

출력:

12
key not found: "drone"

상수 이름이 새 객체를 가리키도록 할당되면 Ruby가 경고를 출력하지만, 상수가 참조하는 객체 자체는 여전히 변경할 수 있습니다. freeze는 객체 자체를 읽기 전용으로 만들어 변경을 시도하면 FrozenError가 발생합니다:

class Palette
  COLORS = ["red", "green"].freeze
end

begin
  Palette::COLORS << "blue"
rescue FrozenError => e
  puts e.message
end
p Palette::COLORS
p Palette::COLORS.frozen?

출력:

can't modify frozen Array: ["red", "green"]
["red", "green"]
true

값이 어떻게 동작하는지에 따라 선택하세요. 절대 변경되지 않는 값은 동결된 상수에 속하고, 카운터처럼 프로그램이 실행되는 동안 변경되는 상태는 클래스 인스턴스 변수에 속합니다:

class Ticket
  PREFIX = "TK"                  # 고정: 상수
  @issued = 0                    # 변경: 클래스 인스턴스 변수

  def self.next_code
    @issued += 1
    "#{PREFIX}-#{@issued}"
  end
end
challenge icon

챌린지

쉬움

Order 클래스를 완성하세요. 이 클래스에는 RATES(동결된 해시: standard는 5, express는 12, pickup은 0)와 FREE_FROM(50) 상수가 있습니다. initialize(total, method)는 method가 RATES의 키가 아닐 때 unknown shipping: drone이라는 메시지와 함께 ArgumentError를 발생시킵니다. shipping은 합계가 FREE_FROM 이상이면 0을 반환하고, 그렇지 않으면 해당 요금을 반환하며, to_s는 40.00 + 5 express = 45.00을 반환합니다.

제공된 코드는 상수를 사용하여 free from 50을 출력한 다음, total method 형식의 줄로 주문을 읽고 각 주문 또는 오류 메시지를 출력합니다.

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

직접 해보기

require_relative 'order'

# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
  input << line.chomp
end
puts "free from #{Order::FREE_FROM}"
input.each do |line|
  total, method = line.split
  begin
    puts Order.new(total.to_f, method)
  rescue ArgumentError => e
    puts e.message
  end
end
quiz icon실력 점검

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

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

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