라자냐

라자냐

학습 연습 문제

소개

이 연습 문제에서는 Ruby의 기본 구성 요소를 배워요. 다룰 내용이 많지만, 너무 벅차게 느껴져도 걱정하지 마세요. 트랙을 진행하면서 모든 내용을 훨씬 더 깊이 있게 다뤄요.

Ruby를 이해하는 데 핵심적인 점 중 하나는 Ruby가 객체 지향 언어라는 것, 그리고 **Ruby에서는 모든 것이 객체**라는 것이에요. 숫자, 문자열, 배열, 이 모두가 객체예요.

변수와 상수

보통 변수나 상수를 사용해 객체에 이름을 붙여 활용해요.

변수는 항상 스네이크 케이스로 작성해요. 변수는 생명 주기 동안 서로 다른 객체를 참조할 수 있어요. 예를 들어 my_first_variable은 = 연산자를 사용해 여러 번 정의하고 다시 정의할 수 있어요:

my_first_variable = 1
my_first_variable = "Some string"
my_first_variable = SomeComplexObject.new

반면 상수는 한 번만 할당하도록 되어 있어요. 상수는 대문자로 시작해야 하고, 보통 단어를 밑줄로 구분해 모두 대문자로 작성해요. 예를 들면 이렇죠:

MY_FIRST_CONSTANT = 10

# Redefining not allowed
# MY_FIRST_CONSTANT = "Some String"

클래스

Ruby는 클래스로 구성되어 있어요. 클래스는 class 키워드 뒤에 클래스 이름을 붙여 정의해요. 객체는 보통 .new 메서드로 클래스를 인스턴스화해서 만들어요. 예를 들면 이렇죠:

# Define the class
class Calculator
  #...
end

# Create an instance of it and assign it to a variable
my_first_calc = Calculator.new

메서드

기능 단위는 메서드로 캡슐화되어 있어요. 다른 언어의 _함수_와 비슷하죠.

메서드는 위치 인자나 키워드 인자(: 문법으로 정의하고 호출해요)로 정의할 수도 있고, 인자가 전혀 없게 정의할 수도 있어요.

메서드는 마지막으로 평가된 문의 결과를 암묵적으로 반환하거나, return 키워드로 객체를 명시적으로 반환할 수 있어요.

class Calculator

  # Positional arguments
  def add(num1, num2)
    return num1 + num2 # Explicit return
  end

  # Keyword arguments
  def multiply(num1:, num2:)
    num1 * num2 # Implicit return
  end
end

메서드는 . 문법으로 호출해요:

calc = Calculator.new
calc.add(1, 3)
calc.multiply(num1: 2, num2: 5)

지침

이 연습 문제에서는 좋아하는 요리책에 나오는 근사한 라자냐를 만들 수 있도록 도와주는 코드를 작성해 볼 거예요.

라자냐를 조리하는 데 걸리는 시간과 관련된 네 가지 과제가 있어요.

1. 오븐 예상 시간을 분 단위로 정의하기

라자냐가 오븐에 있어야 할 시간(분)을 반환하는 Lasagna::EXPECTED_MINUTES_IN_OVEN 상수를 정의해요. 요리책에 따르면 오븐 예상 시간은 40분이에요:

Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40

2. 남은 오븐 시간을 분 단위로 계산하기

라자냐가 지금까지 오븐에 있었던 실제 시간(분)을 매개변수로 받아서, 앞 과제에서 구한 오븐 예상 시간을 기준으로 라자냐가 오븐에 더 있어야 할 시간(분)을 반환하는 Lasagna#remaining_minutes_in_oven 메서드를 정의해요.

lasagna = Lasagna.new
lasagna.remaining_minutes_in_oven(30)
# => 10

3. 준비 시간을 분 단위로 계산하기

라자냐에 넣은 층의 개수를 매개변수로 받아서, 각 층을 준비하는 데 2분이 걸린다고 가정했을 때 라자냐를 준비하는 데 걸린 시간(분)을 반환하는 Lasagna#preparation_time_in_minutes 메서드를 정의해요.

lasagna = Lasagna.new
lasagna.preparation_time_in_minutes(2)
# => 4

4. 총 작업 시간을 분 단위로 계산하기

이름이 있는 매개변수 두 개를 받는 Lasagna#total_time_in_minutes 메서드를 정의해요. number_of_layers 매개변수는 라자냐에 넣은 층의 개수이고, actual_minutes_in_oven 매개변수는 라자냐가 오븐에 있었던 시간(분)이에요. 이 함수는 라자냐를 조리하는 데 총 몇 분을 들였는지를 반환해야 하는데, 이는 준비 시간(분)과 현재까지 라자냐가 오븐에서 보낸 시간(분)을 더한 값이에요.

lasagna = Lasagna.new
lasagna.total_time_in_minutes(number_of_layers: 3, actual_minutes_in_oven: 20)
# => 26
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Ruby Exercism

라자냐 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.