배열

배열 에서 Elixir

47개의 연습 문제

배열 소개

리스트는 값의 모음을 담는 Elixir의 기본 데이터 타입이에요. 리스트는 _불변_이라서 수정할 수 없어요. 리스트를 바꾸는 모든 연산은 새로운 리스트를 반환해요. 리스트는 Enumerable 프로토콜을 구현하고 있어서 Enum과 Stream 모듈 함수를 사용할 수 있어요.

Elixir의 리스트는 연속된 메모리 위치를 가진 배열이 아니라 연결 리스트로 구현돼 있어요. 따라서 리스트의 원소에 접근하는 데는 리스트 길이에 따라 선형 시간이 걸려요.

리스트는 리터럴 표기법, 헤드-테일 표기법(cons 연산자 |를 사용해요), 또는 이 둘을 섞은 형태로 쓸 수 있어요.

# Literal Form
[]
[1]
[1, 2, 3]

# Head-tail Notation
[]
# same as [1]
[1 | []]
# same as [1, 2, 3]
[1 | [2 | [3 | []]]]

# Mixed
# same as [1, 2, 3]
[1 | [2, 3]]

cons (|) 연산자 앞에 원소가 둘 이상 올 수도 있어요.

# Multiple prepends
[1, 2, 3 | [4, 5]]

헤드-테일 표기법으로 리스트에 항목을 덧붙일 수도 있어요.

list = [2, 1]

[3, 2, 1] == [3 | list]
# => true

반복 중에 리스트에 원소를 덧붙이는 것은 안티 패턴으로 여겨져요. 원소를 덧붙이려면 리스트 전체를 순회하면서 끝에 원소를 추가해야 하므로, 반복할 때마다 새 원소를 덧붙이면 매 반복마다 리스트 전체를 순회해야 해요.

뒤집은 리스트 앞에 원소를 추가한 다음, 그 결과를 다시 뒤집으면 같은 결과를 얻을 수 있어요. 앞에 추가하는 것은 빠른 연산이라 상수 시간이 걸려요.

# Appending to the end of a list (potentially slow)
[1, 2, 3] ++ [4] ++ [5] ++ [6]

# Prepend to the start of a list (faster, due to the nature of linked lists)
[6 | [5 | [4 | [3, 2, 1]]]]
# then reverse!

리스트를 다루는 데 자주 쓰이는 Kernel 함수가 몇 가지 있어요.

  • hd/1은 리스트의 헤드, 즉 리스트의 첫 번째 항목을 반환해요.
  • tl/1은 리스트의 테일, 즉 첫 번째 항목을 뺀 리스트를 반환해요.
  • length/1은 리스트에 있는 항목의 개수를 반환해요.
  • in/2는 항목이 리스트의 원소인지 나타내는 불리언 값을 반환해요.

List 모듈도 있어요.

리스트에는 어떤 데이터 타입이든 담을 수 있고, 서로 다른 데이터 타입을 섞어 담을 수도 있어요.

list = [1, :a, 2.0, "string"]
GitHub에서 편집 링크가 새 창이나 탭에서 열려요

배열 배우기

연습이 잠겨 있어요

배열 개념을 연습하려면 연습 문제 6개를 더 잠금 해제해요