트랙
/
Crystal
Crystal
/
연습 문제
/
아리의 놀라운 라자냐
아리의 놀라운 라자냐

아리의 놀라운 라자냐

학습 연습 문제

소개

시작하기

변수

변수를 선언하려면 = 대입 연산자를 사용해요. Crystal에서 변수 이름은 snake_case 형식으로 작성해요.

number = 1
puts number # => 1

number = 2
puts number # => 2

상수

상수도 같은 = 대입 연산자로 선언하지만, SCREAMING_SNAKE_CASE라고 하는 모두 대문자인 이름을 사용해요.

NUMBER = 1
puts NUMBER # => 1

이미 정의된 상수에 값을 대입하면 컴파일 시점에 오류가 발생해요.

NUMBER = 1

NUMBER = 2
# Error: already initialized constant NUMBER

타입

Crystal은 컴파일 언어예요. 즉 모든 변수와 메서드 인자는 컴파일 시점에 타입이 정해져요. 컴파일러는 변수나 메서드 인자의 타입을 추론할 수 있어요. 하지만 경우에 따라 타입을 직접 지정해야 할 때도 있어요. 타입을 지정해야 하는 경우는 이후 개념에서 설명해요.

메서드

메서드는 재사용할 수 있도록 명령들을 묶는 방법이에요. Crystal에서 메서드는 보통 클래스, 모듈, 구조체 안에 정의해요. 하지만 클래스, 모듈, 구조체 밖에 정의할 수도 있어요. 메서드는 def 키워드 뒤에 메서드 이름을 써서 선언해요. Crystal에서 메서드 이름은 snake_case로 작성해요. 메서드에 인자가 없으면 괄호는 생략할 수 있어요. 메서드의 끝은 end 키워드로 표시해요.

def hello
  puts "Hello World!"
end

변수나 메서드 인자의 타입에 존재하지 않는 메서드를 사용하면 컴파일 시점에 오류가 발생해요.

number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String

인자

메서드는 인자를 가질 수 있어요. 인자는 메서드에 전달되는 데이터예요. 메서드에 인자를 전달하려면 인자의 이름을 지정해야 해요. Crystal에서 인자 이름은 snake_case로 작성해요. 메서드는 여러 인자를 가질 수 있고, 인자들은 쉼표로 구분해요.

def hello(name)
  puts "Hello #{name}!"
end

메서드는 여러 인자를 가질 수도 있어요. 이때 인자들은 쉼표로 구분해야 해요.

def hello(name, language)
  puts "Hello #{name}! You are learning #{language}."
end

메서드 호출하기

클래스, 모듈, 구조체에 속한 메서드를 호출할 때는 점 연산자(.)를 사용해요. 형식은 <ClassName>.<method_name>이에요. 메서드가 클래스, 모듈, 구조체에 속하지 않으면 이름만 써서 호출할 수 있어요. 메서드는 항상 마지막 표현식의 값을 암묵적으로 반환해요.

메서드에 인자가 있으면, 메서드 호출과 정의에서 인자를 지정할 때 다음과 같이 괄호를 사용할 수 있어요: <method_name>(<argument_1>, <argument_2>, ...). 메서드에 인자가 없으면 괄호는 생략해요.

def hello(name)
  "Hello #{name}!"
end

hello("Crystal")
# => Hello Crystal!

여러 인자를 가진 메서드를 호출할 때는 인자들을 쉼표로 구분해요. 인자는 메서드에 정의된 순서와 같은 순서로 전달해야 해요.

def hello_language(name, language)
  "Hello #{name}! You are learning #{language}."
end

hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.

인자 개수를 잘못 지정해 메서드를 호출하면 컴파일 시점에 오류가 발생해요.

hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)

덧셈, 뺄셈, 곱셈

Crystal에서는 + 연산자로 두 수를 더할 수 있어요. - 연산자로 두 수를 뺄 수 있어요. 그리고 * 연산자로 두 수를 곱할 수 있어요.

1 + 1
# => 2

2 - 1
# => 1

2 * 2
# => 4

주석

Crystal에서 주석은 # 문자 뒤에 공백을 하나 쓰고 내용을 적어요. 주석은 코드를 설명하는 데 사용해요. 컴파일러는 주석을 실행하지 않아요.

# This is a comment

지침

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

라자냐를 만드는 데 걸리는 시간과 관련된 네 가지 작업이 있어요.

1. 오븐에서의 예상 시간(분)을 정의해요

Lasagna 클래스에 EXPECTED_MINUTES_IN_OVEN 상수를 정의해요. 이 상수는 라자냐를 오븐에 몇 분 동안 넣어 둬야 하는지를 저장해요. 요리책에 따르면 오븐에서의 예상 시간은 40분이에요.

Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40

2. 남은 오븐 시간(분)을 계산해요

Lasagna#remaining_minutes_in_oven 메서드를 정의해요. 이 메서드는 라자냐가 오븐에 있던 실제 시간(분)을 매개변수로 받고, 이전 작업에서 구한 오븐에서의 예상 시간(분)을 기준으로 라자냐가 오븐에 얼마나 더 있어야 하는지를 반환해요.

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

3. 준비 시간(분)을 계산해요

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

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

4. 총 작업 시간(분)을 계산해요

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

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

아리의 놀라운 라자냐 문제를 시작해 볼 준비가 됐나요?

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