Ruby에서 배열은 모든 종류의 객체를 담을 수 있는, 순서가 있고 정수 인덱스로 접근하는 컬렉션이에요.
배열의 인덱스는 0부터 시작해요.
음수 인덱스는 배열의 끝을 기준으로 세요. 예를 들어 인덱스 -1은 배열의 마지막 원소를, -2는 끝에서 두 번째 원소를 가리키고, 이런 식으로 이어져요.
배열은 보통 [] 표기법으로 만들어요.
서로 다른 타입의 객체를 얼마든지 담을 수 있어요.
array = [1, "two", 3.0]
배열의 원소는 #[] 메서드를 사용해 인덱스로 가져올 수 있어요.
이 메서드는 해당 인덱스의 원소를 반환하거나, 시작 인덱스에서부터 지정한 길이만큼 이어지는 부분 배열을 반환해요.
음수 인덱스는 배열의 끝에서부터 거꾸로 세요.
a = [ "a", "b", "c", "d", "e" ]
a[2] #=> "c"
a[6] #=> nil
a[1, 3] #=> [ "b", "c", "d" ]
a[-1] #=> "e"
a[-2] #=> "d"
a[-3, 2] #=> ["c", "d"]
배열에는 유용한 헬퍼 메서드가 많이 있어요. 그중 자주 쓰이는 몇 가지를 소개할게요.
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.size #=> 8
fibonacci.sum #=> 33
fibonacci.reverse #=> [13, 8, 5, 3, 2, 1, 1, 0]
컬렉션을 순회할 때 루프를 쓰는 대신, Ruby에서는 열거를 사용해요.
열거는 컬렉션(여기서는 배열)을 하나씩 훑으면서 각 객체에 어떤 작업을 하는 거예요. 열거는 Ruby의 핵심 개념이고, 정렬, 그룹화, 매핑, 축소 등 여러 곳에서 쓰여요.
배열의 각 단어를 출력하는 열거는 다음과 같아요.
words = ["the", "cat", "sat"]
words.each do |word|
puts word
end
# Output:
# the
# cat
# sat
이 예제에서는 배열에 .each 메서드를 호출하고, 매개변수 하나(word)를 받아 출력하는 _블록_을 넘겼어요.
_블록_은 이후 트랙에서 훨씬 자세히 다뤄요. 지금은 인자를 0개 이상 받을 수 있는 익명 함수 정도로 생각해 둬요.
블록은 (위에서 본) do...end 문법으로 정의할 수도 있고, (아래에서 볼) {} 문법으로 정의할 수도 있어요.
블록을 사용하는 배열 메서드의 다른 예시도 있어요.
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.count { |number| number == 1 } #=> 2
fibonacci.any? { |number| number == 6 } #=> false
fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13]
fibonacci.all? { |number| number < 20 } #=> true
fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26]
지난 7일 동안 정원을 찾은 새의 수를 기록하는 열렬한 조류 관찰자예요.
정원을 찾은 새의 수를 다루는 다섯 개의 과제가 있어요.
비교를 위해 지난주 집계 사본을 항상 가까이에 보관하는데, 그 값은 0, 2, 5, 3, 7, 8, 4였어요. 지난주 집계를 반환하는 BirdCount.last_week 메서드를 구현해요:
BirdCount.last_week
# => [0, 2, 5, 3, 7, 8, 4]
어제 정원을 찾은 새의 수를 반환하는 BirdCount#yesterday 메서드를 구현해요. 새 집계는 날짜순으로 정렬되어 있고, 첫 번째 원소는 가장 오래된 날의 집계이고, 마지막 원소는 오늘의 집계예요.
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.yesterday
# => 4
정원을 찾은 새의 총 마릿수를 반환하는 BirdCount#total 메서드를 구현해요:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.total
# => 19
어떤 날은 다른 날보다 더 바빠요. 바쁜 날은 새가 다섯 마리 이상 정원을 찾은 날이에요.
바쁜 날의 수를 반환하는 BirdCount#busy_days 메서드를 구현해요:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.busy_days
# => 2
정원을 찾은 새가 한 마리도 없는 날이 있었다면 true를 반환하고, 그렇지 않으면 false를 반환하는 BirdCount#day_without_birds? 메서드를 구현해요:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true
Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.