루비에서 배열과 해시는 색인된 컬렉션이다. 둘 다 키를 이용해 접근할 수 있지만 해시는 키 값으로 어떠한 객체를 사용해도 상관없지만, 배열은 정수만 사용할 수 있다. 배열과 해시 모두 새로운 요소를 담기 위해서 공간이 더 필요해지면 필요한 만큼 스스로 확장한다. 또한 어떤 타입의 객체라도 함께 저장할 수 있다.

1. 배열생성 방법 - 리터럴 & 객체생성

배열을 만들 때는 리터럴을 사용하거나, 명시적으로 Array 객체를 생성하는 방법이 있다.
리터럴로 만들기
a = [3.14, "pie", 99]

puts a.class
puts a.length
puts a[0]
puts a[1]
puts a[2]
puts a[3]
- 실행결과 -
Array
3
3.14
pie
99
nil

리터럴 생성 단축 문법
# c는 b와 같은 배열을 더욱 간단히 만들어 준다.
b = ["개미", "거미", "강아지", "고양이", "벌"]
c = %w{개미 거미 강아지 고양이 벌}
대괄호[] 대신 중괄호{}를 써주고 앞에 %w를 써주면 된다. 그리고 모든 단어를 콤마로 구분해 주지 않아도 된다.

배열객체 생성하기
d = Array.new
d[0] = "second"
d[1] = "array"

puts d.class
puts d[0]
puts d[1]
puts d[2]
- 실행결과 -
Array
second
array
nil

배열의 인덱스는 0에서 시작한다. 배열의 위치에 아무것도 없다면 nil을 반환한다. nil은 '아무것도 아님'을 표현하는 하나의 객체이다.

2. 배열의 인덱스 사용방법


array_image.jpg
그림 출처 : 프로그래밍 루비 57page.

e = %w{1 2 3 4 5}

e[0]      # 1
e[-1]     # 5
e[-2]     # 4
e[-99]    # nil

e[1, 3]   # [2, 3, 4]
e[3, 1]   # [4]
e[-3, 2]  # [3, 4]

e[1..3]   # [2, 3, 4]
e[1...3]  # [2, 3]
e[3..3]   # [4]
e[-3..-1] # [3, 4, 5]

  • 배열의 인덱스는 0부터 시작한다.
  • 배열의 위치를 음이 아닌 정수로 지정하면 해당 위치의 객체를 반환하고, 그 위치에 아무것도 없다면 nil을 반환한다.
  • 만약 음수로 위치를 지정하면 뒤에서부터 세어 찾는다.
  • 배열변수명[몇번째인덱스부터, 몇개] e[1, 3] 이면 1번째 인덱스부터 3개를 가져오라는 것이다.
  • 배열변수명[몇번째인덱스..몇번째인덱스포함]
  • 배열변수명[몇번째인덱스..몇번째인덱스포함하지않음]
배열에 값 대입하기
e = %w{1 2 3 4 5}
e[1] = 'bat'
e[-3] = 'cat'
e[3] = ['a', 'b']
e[6] = [7]
puts e
- 실행결과 -
[1, 'bat', 'cat', [a, b], 5, nil, 7]
특정 인덱스에 배열을 넣을 수도 있고, 인텍스 사이에 간격이 생기면 nil로 채워진다.

e = %w{1 2 3 4 5}

e[2, 2] = 'cat'     #[1, 2, 'cat', 5]
e[2, 0] = 'dog'     #[1, 2, 'dog', 'cat', 5]
e[1, 1] = [6, 7, 8] #[1, 6, 7, 8, 'dog', 'cat', 5]
e[0..3] = []        #['dog', 'cat', 5]
e[5..6] = 'a', 'b'  #['dog', 'cat', 5, nil, nil, a, b]
3. 해시
배열의 인덱스는 정수만 사용가능한 반면 해시의 인덱스는 문자열, 정규표현식을 포함한 어떠한 종류의 객체도 사용할 수 있다. 하지만 해시의 각 원소는 순서가 없다.
리터럴을 사용해 해시 만들기
h = {'dog' => '진도개', 'bird' => '까지', 'fish' => '붕어'}

puts h.length
puts h['dog']
puts h['bird']
- 실행결과 -
3
진도개
참새

해시에 값대입
h[12] = '십이'
h['fish'] = '잉어'

puts h[12]
puts h['fish']
- 실행결과 -
십이
잉어


※ 위 내용은 데이브토머스 차드파울러 앤디헌트 지음, 강문식, 박지인, 양석호 옮김 『Programming Ruby』 책의 내용을 바탕으로 정리한 것입니다.