Range는 값의 구간을 나타냅니다 — 숫자에는 (1..10), 문자에는 ('a'..'z') 등. range는 유용한 메서드를 가진 객체로, 반복, 슬라이싱, 멤버십 테스트, case 매칭에 사용됩니다. 간결하고 표현력 있는 Ruby 기능입니다.
range 생성 (.. 대 ...)
(..)
(...)
(..)
핵심 구분: ..는 끝을 포함, ...는 끝을 제외합니다(세 번째 점이 "끝을 밀어냄"). 기억해야 할 흔한 지점입니다.
(1..5).each { |n| puts n } # 반복 — 1에서 5
(1..5).to_a # [1, 2, 3, 4, 5] — 배열로 변환
(1..10).map { |n| n * 2 } # range는 Enumerable 메서드 지원
(1..100).sum # 5050
(1..10).select(&:even?) # [2, 4, 6, 8, 10]
range는 Enumerable을 포함하므로 each, map, select 등을 지원하며 — to_a가 이를 배열로 구체화합니다.
(1..100).include?(50) # true
(1..100).cover?(50) # true — 더 빠름 (반복하지 않고 끝점만 확인)
age = 25
(18..65).include?(age) # 값이 범위에 속하는지 확인
include?/cover?는 멤버십을 효율적으로 테스트합니다(특히 cover?는 반복 없이 끝점만 확인).
# range를 쓰는 case/when — 깔끔한 범위 기반 분기
grade = case score
when 90..100 then "A"
when 80..89 then "B"
when 0..79 then "F"
end
# range로 배열/문자열 슬라이싱
[10, 20, 30, 40, 50][1..3] # [20, 30, 40] — range로 슬라이스
"hello world"[0..4] # "hello" — range로 부분 문자열
# 끝없는/시작없는 range (Ruby 2.6+)
arr[2..] # 인덱스 2부터 끝까지
(1..) # 1부터 무한대까지 (지연 평가와 함께)
range는 많은 흔한 시나리오에서 사용되는 유용하고 표현력 있는 Ruby 기능이므로, 이를 이해하는 것은 귀중한 일상 지식입니다.
이들은 구간(숫자, 알파벳)을 간결하게 나타내며 몇 가지 빈번한 맥락에 등장합니다: 반복((1..5).each — 시퀀스를 순회하는 깔끔한 방법), 배열과 문자열 슬라이싱(arr[1..3], str[0..4] — 하위 시퀀스를 우아하게 추출), 멤버십 테스트(include?/cover? — 값이 구간에 속하는지 확인, cover?는 끝점만 확인하여 효율적), 그리고 특히 case/when 매칭(점수 범위로 등급 매기기 같은 깔끔한 범위 기반 분기 — 흔하고 읽기 쉬운 패턴).
중요한 ..(포함) 대 ...(제외) 구분을 이해하는 것은 range를 올바르게 사용하는 데 필요합니다(그리고 흔한 혼란 지점).
range가 Enumerable을 포함한다는 것(따라서 map/select/등 지원), 반복·슬라이싱·멤버십·case 매칭에 사용하는 법, 그리고 현대 기능(끝없는/시작없는 range)을 아는 것은 실용적 용도를 다룹니다.
range는 관용적인 Ruby에 빈번히 등장하고(반복, 슬라이싱, 범위 기반 조건문, 값 범위 검증), 구간을 다루는 간결하고 표현력 있는 방법이므로, range를 이해하는 것 — 그 문법(포함 대 제외), 메서드, 흔한 용도(반복, 슬라이싱, 멤버십, case 매칭) — 은 시퀀스와 구간을 우아하게 다루는 깔끔하고 관용적인 Ruby를 작성하는 데 유용하고 실용적으로 관련되는 지식입니다.