Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby 무한대(Infinity) 완벽 가이드: 작동 원리와 실전 활용법

Ruby에서 무한대(infinity)란 무엇일까요?

쉽게 말해 시작점은 존재하지만 끝이 없는 값을 의미합니다.

Ruby에서는 Float::INFINITY 상수를 사용해 이러한 무한대 개념을 표현할 수 있습니다.

"그래서 이게 실제로 어떻게 유용한 거지?"라고 궁금하실 수 있습니다.

지금부터 다양한 예제와 함께 하나씩 살펴보겠습니다!

산술 연산 결과로 나타나는 무한대

Ruby는 특정 수학 연산의 결과로 Infinity 객체를 반환합니다.

예를 들어, 많은 분들이 익숙할 "0으로 나누기" 오류가 있습니다.

1/0
# ZeroDivisionError: divided by 0

하지만 정수 대신 부동 소수점(float)을 사용하면 결과가 달라집니다.

1/0.0
# Infinity

바로 Infinity가 반환됩니다!

여기서 끝이 아닙니다. 00.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에서 무한대가 무엇인지, 어디에서 나타나는지, 그리고 어떻게 활용할 수 있는지 알아보았습니다.

이 글이 도움이 되셨다면 주변에 공유해 더 많은 사람들이 혜택을 받을 수 있기를 바랍니다.

읽어주셔서 감사합니다!