next와 break 같은 키워드는 루비 프로그래밍 언어의 핵심 요소입니다. 루비를 제대로 이해하려면 이들이 어떻게 작동하는지 반드시 알아야 합니다.
next와 break는 어떤 용도로 사용될까?
루비에는 다양한 종류의 반복문이 존재합니다.
대표적인 예:
- while
- until
- each
반복문을 작성하다 보면 특정 반복(iteration)을 건너뛰거나, 반복문 전체를 조기에 종료해야 하는 상황이 생깁니다.
바로 그럴 때 next와 break 키워드가 유용하게 사용됩니다!
지금부터 두 키워드의 사용법을 자세히 살펴보겠습니다.
루비 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는 블록에서 마지막으로 반환된 값을 가져와 다음 반복의 첫 번째 인수로 사용한다는 점을 기억하세요.
즉, sum이 nil이 되어 버립니다.
해결 방법은?
next 줄을 다음과 같이 수정하면 됩니다:
next sum if str.size == 4
이렇게 하면 next가 sum의 값을 반환하게 되어 문제가 해결됩니다.
성능이 최우선 사항이 아니라면(실제로 대부분 그렇습니다), 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를 메서드로 구현하고 있습니다. 대표적으로 String과 Integer 클래스입니다.
예제:
1.next # 2
결과는 어렵지 않게 예상할 수 있죠?
그렇다면 이건 어떨까요?
"zz".next # "aaa"
이번에는 조금 더 흥미로운 결과가 나옵니다!
어떻게 작동하는 걸까요?
각 클래스는 '다음 값'을 계산하는 로직을 담은 자체 버전의 next를 구현하고 있습니다.
정수(Integer)의 경우 단순히 +1을 수행합니다.
문자열(String)의 경우 마지막 문자를 하나 증가시킵니다(알파벳 순서상 다음 문자 / 숫자라면 +1). 그리고 자리올림(carryover)이 발생하면(9 → 0, z → a) 왼쪽의 다음 문자를 증가시킵니다.
마무리
이번 글에서는 루비의 next와 break 키워드에 대해 살펴보았습니다. 이 두 키워드를 활용하면 특정 반복을 건너뛰거나 반복문을 조기에 종료할 수 있습니다.
이제 직접 실습하며 루비 실력을 한 단계 끌어올려 보세요 🙂
읽어주셔서 감사합니다!