Elixir는 동적 타입 언어예요. 변수의 타입은 런타임에만 검사해요. 매치 = 연산자를 사용하면 어떤 타입의 값이든 변수 이름에 바인딩할 수 있어요.
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir는 함수형 프로그래밍 언어이고, 모든 이름 있는 함수를 모듈 안에 정의해야 해요. 모듈은 defmodule 키워드로 정의해요. 모든 모듈은 런타임에 다른 모든 모듈에서 사용할 수 있고, 프로그램의 다른 부분에서 보이게 하려고 _접근 제어자_를 붙일 필요가 없어요. _모듈_은 다른 프로그래밍 언어의 _클래스_와 비슷해요.
defmodule Calculator do
# ...
end
_이름 있는 함수_는 모듈 안에 정의해야 해요. 공개 이름 있는 함수는 def 키워드로 정의해요.
각 함수는 인자가 하나도 없을 수도 있고, 여러 개일 수도 있어요. 함수의 마지막 표현식 값은 항상 _암묵적으로 반환_돼요.
defmodule Calculator do
def add(x, y) do
x + y
end
end
함수를 호출할 때는 모듈과 함수 이름을 쓰고, 각 인자에 넘길 값을 전달해요.
sum = Calculator.add(1, 2)
# => 3
def 대신 defp 키워드를 써서 비공개 함수를 정의할 수 있어요. 비공개 함수는 정의한 같은 모듈 안에서만 사용할 수 있어요.
정의된 모듈 안에서 함수를 호출할 때는 모듈 이름을 생략할 수 있어요.
짧은 함수는 한 줄 문법으로 쓸 수도 있어요 (do 키워드 앞뒤의 쉼표 ,와 콜론 :에 주목해 봐요).
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
함수를 말할 때 _인자 개수_로 부르는 경우가 많아요. 함수의 _인자 개수_는 그 함수가 받는 인자의 수예요.
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
모듈 이름은 PascalCase를 사용해요. 모듈 이름은 대문자 A-Z로 시작해야 하고, 문자 a-zA-Z, 숫자 0-9, 밑줄 _을 포함할 수 있어요.
변수와 함수 이름은 snake_case를 사용해요. 변수나 함수 이름은 소문자 a-z나 밑줄 _로 시작해야 하고, 문자 a-zA-Z, 숫자 0-9, 밑줄 _을 포함할 수 있으며, 물음표 ?나 느낌표 !로 끝날 수도 있어요.
Elixir에는 아주 풍부하고 문서화가 잘 된 표준 라이브러리가 있어요. 문서는 hexdocs.pm/elixir에서 온라인으로 볼 수 있어요. 이 링크는 어딘가에 저장해 두면 좋아요. 정말 자주 쓰게 될 거예요!
대부분의 내장 데이터 타입에는 그 타입을 다루는 함수를 제공하는 대응 모듈이 있어요. 예를 들어 정수에는 Integer 모듈, 문자열에는 String 모듈, 배열에는 List 모듈 등이 있어요.
눈여겨볼 만한 모듈로 Kernel 모듈이 있어요. 산술 연산자, 제어 흐름 매크로 등 표준 라이브러리의 나머지가 그 위에 세워지는 기본 기능을 제공해요. Kernel 모듈의 함수는 자동으로 임포트되므로, Kernel. 접두사 없이 사용할 수 있어요.
주석은 소스 코드를 읽는 다른 개발자에게 메모를 남기는 데 쓸 수 있어요. Elixir에서 한 줄 주석은 #으로 시작해요.
이 연습 문제에서는 좋아하는 요리책을 보며 근사한 라자냐를 만드는 데 도움이 될 코드를 작성해 볼 거예요.
라자냐를 요리하는 데 걸리는 시간과 관련된 다섯 가지 과제가 있어요.
인자를 받지 않고 라자냐를 오븐에 몇 분 동안 넣어 둬야 하는지 반환하는 Lasagna.expected_minutes_in_oven/0 함수를 정의해요. 요리책에 따르면 오븐에 넣어 둬야 할 시간은 40분이에요:
Lasagna.expected_minutes_in_oven()
# => 40
라자냐가 실제로 오븐에 있었던 시간(분)을 인자로 받아서, 이전 과제에서 구한 오븐에 넣어 둬야 할 시간(분)을 기준으로 라자냐가 오븐에 얼마나 더 있어야 하는지 반환하는 Lasagna.remaining_minutes_in_oven/1 함수를 정의해요.
Lasagna.remaining_minutes_in_oven(30)
# => 10
라자냐에 추가한 층의 개수를 인자로 받아서, 각 층을 준비하는 데 2분이 걸린다고 가정했을 때 라자냐를 준비하는 데 몇 분을 썼는지 반환하는 Lasagna.preparation_time_in_minutes/1 함수를 정의해요.
Lasagna.preparation_time_in_minutes(2)
# => 4
인자 두 개를 받는 Lasagna.total_time_in_minutes/2 함수를 정의해요. 첫 번째 인자는 라자냐에 추가한 층의 개수이고, 두 번째 인자는 라자냐가 오븐에 있었던 시간(분)이에요. 이 함수는 라자냐를 요리하는 데 총 몇 분을 일했는지 반환해야 하는데, 이는 준비 시간(분)과 현재 라자냐가 오븐에서 보낸 시간(분)을 더한 값이에요.
Lasagna.total_time_in_minutes(3, 20)
# => 26
인자를 받지 않고 라자냐가 다 익어서 먹을 준비가 되었다는 메시지를 반환하는 Lasagna.alarm/0 함수를 정의해요.
Lasagna.alarm()
# => "Ding!"
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.