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

루비(Ruby)의 next와 break 키워드 완벽 이해하기

nextbreak 같은 키워드는 루비 프로그래밍 언어의 핵심 요소입니다. 루비를 제대로 이해하려면 이들이 어떻게 작동하는지 반드시 알아야 합니다.

next와 break는 어떤 용도로 사용될까?

루비에는 다양한 종류의 반복문이 존재합니다.

대표적인 예:

  • while
  • until
  • each

반복문을 작성하다 보면 특정 반복(iteration)을 건너뛰거나, 반복문 전체를 조기에 종료해야 하는 상황이 생깁니다.

바로 그럴 때 nextbreak 키워드가 유용하게 사용됩니다!

지금부터 두 키워드의 사용법을 자세히 살펴보겠습니다.

루비 next 키워드 (반복 건너뛰기)

next 키워드를 사용하면 현재 반복 한 번을 건너뛸 수 있습니다.

예제:

문자열들의 글자 수를 세고 있다고 가정해 보겠습니다.

그런데 어떤 이유로 길이가 4인 문자열은 세고 싶지 않습니다.

이렇게 코드를 작성할 수 있습니다:

strings = ["one", "two", "four", "five"]

strings.inject(0) do |sum, str|
  next if str.size == 4

  sum + str.size
end

# nil

하지만 이 코드는 의도대로 동작하지 않습니다. 결과로 nil이 반환됩니다.

왜 그럴까요?

next는 반환값 없이 호출되는 return과 마찬가지로 기본적으로 nil을 반환하기 때문입니다.

그리고 inject는 블록에서 마지막으로 반환된 값을 가져와 다음 반복의 첫 번째 인수로 사용한다는 점을 기억하세요.

즉, sumnil이 되어 버립니다.

해결 방법은?

next 줄을 다음과 같이 수정하면 됩니다:

next sum if str.size == 4

이렇게 하면 nextsum의 값을 반환하게 되어 문제가 해결됩니다.

성능이 최우선 사항이 아니라면(실제로 대부분 그렇습니다), next를 사용하지 않도록 배열을 미리 필터링하는 방법도 고려할 수 있습니다.

더 나은 방법은 다음과 같습니다:

strings = ["one", "two", "four", "five"]

strings.inject(0) { |sum, str| str.size == 4 ? sum : sum + str.size }

# 6

여기서 사용된 것은 삼항 연산자(ternary operator)입니다.

루비는 next를 굳이 쓰지 않아도 될 만큼 다양한 도구를 제공합니다. 상황에 맞게 적극적으로 활용해 보세요!

루비 break 키워드 (반복문 조기 종료)

break 키워드는 next와 비슷하지만, 단 한 번의 반복만 건너뛰는 것이 아니라 반복문 전체를 종료하고 값을 반환합니다.

반복문에서 조기 탈출(early return)이 필요할 때 유용하게 쓰입니다.

return 키워드를 사용하지 않을까요? return은 반복문만 빠져나가는 것이 아니라 현재 메서드 전체를 종료해 버리기 때문입니다.

또한 종료 조건이 없는 무한 루프를 끝낼 때도 활용할 수 있습니다.

예시:

count = 0

loop do
  break if count == 10

  puts count

  count += 1
end

이 코드는 0부터 9까지의 숫자를 차례로 출력합니다.

다만 더 좋은 대안으로는 times 메서드, upto 메서드, 또는 범위(range)와 each 메서드를 조합하는 방법이 있습니다.

예제:

0.upto(9).each(&method(:puts))

여기서 &method(:puts)는 각 숫자마다 puts를 호출하기 위한 간결한 축약 표현입니다.

혼동 주의: 메서드로서의 next

어떤 것이 키워드로 존재한다고 해서 메서드 이름으로 사용할 수 없다는 의미는 아닙니다.

루비의 일부 클래스는 next를 메서드로 구현하고 있습니다. 대표적으로 StringInteger 클래스입니다.

예제:

1.next
# 2

결과는 어렵지 않게 예상할 수 있죠?

그렇다면 이건 어떨까요?

"zz".next
# "aaa"

이번에는 조금 더 흥미로운 결과가 나옵니다!

어떻게 작동하는 걸까요?

각 클래스는 '다음 값'을 계산하는 로직을 담은 자체 버전의 next를 구현하고 있습니다.

정수(Integer)의 경우 단순히 +1을 수행합니다.

문자열(String)의 경우 마지막 문자를 하나 증가시킵니다(알파벳 순서상 다음 문자 / 숫자라면 +1). 그리고 자리올림(carryover)이 발생하면(9 → 0, z → a) 왼쪽의 다음 문자를 증가시킵니다.

마무리

이번 글에서는 루비의 nextbreak 키워드에 대해 살펴보았습니다. 이 두 키워드를 활용하면 특정 반복을 건너뛰거나 반복문을 조기에 종료할 수 있습니다.

이제 직접 실습하며 루비 실력을 한 단계 끌어올려 보세요 🙂

읽어주셔서 감사합니다!