Ruby에서 무한대(infinity)란 무엇일까요?
쉽게 말해 시작점은 존재하지만 끝이 없는 값을 의미합니다.
Ruby에서는 Float::INFINITY 상수를 사용해 이러한 무한대 개념을 표현할 수 있습니다.
"그래서 이게 실제로 어떻게 유용한 거지?"라고 궁금하실 수 있습니다.
지금부터 다양한 예제와 함께 하나씩 살펴보겠습니다!
산술 연산 결과로 나타나는 무한대
Ruby는 특정 수학 연산의 결과로 Infinity 객체를 반환합니다.
예를 들어, 많은 분들이 익숙할 "0으로 나누기" 오류가 있습니다.
1/0 # ZeroDivisionError: divided by 0
하지만 정수 대신 부동 소수점(float)을 사용하면 결과가 달라집니다.
1/0.0 # Infinity
바로 Infinity가 반환됩니다!
여기서 끝이 아닙니다. 0을 0.0으로 나누면 또 다른 특별한 값이 등장합니다.
0/0.0 # NaN
이 NaN은 무엇일까요?
NaN은 "Not a Number(숫자가 아님)"의 약자로, 제가 아는 한 Ruby에서 이 값을 만날 수 있는 거의 유일한 경우입니다.
왜 이런 값이 존재할까요?
부동 소수점 연산의 동작 방식을 규정하는 IEEE 754 표준의 일부이기 때문입니다.
참고로 관련된 유용한 메서드들도 있습니다:
nan?finite?infinite?
이 메서드들을 사용하면 특수 값을 손쉽게 확인할 수 있으며, Float 객체에서 사용할 수 있습니다.
또한 Ruby 2.4부터는 Integer에서도 finite?와 infinite? 메서드를 사용할 수 있습니다.
무한 범위(Infinite Range) 만드는 방법
이번에는 Range와 함께 활용하는 방법을 알아보겠습니다.
다음은 무한 범위의 예시입니다:
(1..Float::INFINITY).take(10) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
범위의 끝을 미리 알 수 없을 때 매우 유용합니다.
다만 한 가지 문제가 있습니다. 시작 값이 반드시 숫자여야 한다는 점입니다.
예시:
("a"..Float::INFINITY)
# ArgumentError: bad value for range
그렇다면 해결책은 무엇일까요?
Ruby 2.6부터는 다음과 같이 작성할 수 있습니다:
("a"..).take(5)
# ["a", "b", "c", "d", "e"]
네, 오타가 아닙니다! 이 범위에는 끝 값이 없으며, 시작 값 "a" 뒤에 점 두 개(..)만 붙어 끝없이 이어지는 범위를 만듭니다.
이것은 비교적 새로운 문법이므로, 사용하려면 Ruby 2.6 이상 버전이 필요합니다.
최댓값과 최솟값으로 활용하기
Infinity의 또 다른 실용적인 용도는 무엇일까요?
Infinity는 Ruby에서 가장 큰 숫자이고, -Infinity는 가장 작은 숫자입니다.
따라서 초기값(starting value)으로 활용할 수 있습니다.
실제 예시를 보겠습니다:
def smallest_percent_size(style, ary_size)
@smallest_percent ||= Float::INFINITY
if style == :percent && ary_size < @smallest_percent
@smallest_percent = ary_size
end
@smallest_percent
end
이 코드는 오픈소스 프로젝트인 Rubocop에서 가져온 것입니다.
작동 방식은 다음과 같습니다:
가장 작은 배열 크기를 찾으려면 초기값이 필요한데, nil을 사용하면 비교 시 오류가 발생합니다.
충분히 클 것이라고 기대하며 임의의 큰 숫자를 입력할 수도 있습니다.
하지만 Float::INFINITY를 사용하면 어떤 값과 비교하더라도 확실히 큰 수라는 것이 보장되므로 훨씬 안전하고 명확합니다.
마무리
지금까지 Ruby에서 무한대가 무엇인지, 어디에서 나타나는지, 그리고 어떻게 활용할 수 있는지 알아보았습니다.
이 글이 도움이 되셨다면 주변에 공유해 더 많은 사람들이 혜택을 받을 수 있기를 바랍니다.
읽어주셔서 감사합니다!