코드를 작성하다 보면 if / elsif 문을 사용해야 하는 상황이 자주 생깁니다. 하지만 그 전에 루비(Ruby)의 case 문을 대안으로 고려해 볼 가치가 있습니다. 이 글에서는 case 문의 다양한 활용 사례와 함께, 내부에서 실제로 어떻게 동작하는지까지 자세히 살펴보겠습니다.

참고: 다른 프로그래밍 언어에서는 이를 switch 문이라고 부릅니다.
case 문의 구성 요소
루비의 case 문은 다음 세 가지 키워드로 구성됩니다.
| 키워드 | 설명 |
|---|---|
| case | case 문의 시작을 선언합니다. 처리할 변수를 인자로 받습니다. |
| when | 매칭 가능한 각각의 조건을 나타냅니다. |
| else | 어떤 조건에도 해당하지 않을 때 실행됩니다. (선택 사항) |
Ruby case & 범위(Range)
case 문은 겉보기보다 훨씬 유연합니다. 값이 어느 범위에 속하는지에 따라 다른 메시지를 출력하는 예제를 살펴보겠습니다.
case capacity
when 0
"You ran out of gas."
when 1..20
"The tank is almost empty. Quickly, find a gas station!"
when 21..70
"You should be ok for now."
when 71..100
"The tank is almost full."
else
"Error: capacity has an invalid value (#{capacity})"
end
if / elsif 버전과 비교했을 때 이 코드가 얼마나 깔끔하고 우아한지 느껴지시나요?
Ruby case & 정규표현식(Regex)
when 조건으로 정규표현식도 사용할 수 있습니다. 아래 예제에서는 serial_code의 첫 글자를 통해 해당 제품이 소비자에게 얼마나 위험한지 판단합니다.
case serial_code when /\AC/ "Low risk" when /\AL/ "Medium risk" when /\AX/ "High risk" else "Unknown risk" end
case 문을 쓰면 안 되는 경우
값이 단순히 1:1로 매핑되는 경우라면 case 문 대신 해시(Hash)를 사용하는 것이 더 좋습니다.
case country when "europe" "https://eu.example.com" when "america" "https://us.example.com" end
이런 경우에는 아래처럼 해시를 활용하는 것이 바람직합니다.
SITES = {
"europe" => "https://eu.example.com",
"america" => "https://us.example.com"
}
SITES[country]
해시를 사용한 방식이 더 효율적이고 유지보수하기도 쉽습니다. 동의하시나요?
case 문의 작동 원리: === 메서드
case 문이 내부적으로 어떻게 동작하는지 궁금하지 않으신가요? 앞서 살펴본 첫 번째 예제를 기준으로 설명하면, 실제로는 다음과 같은 비교가 일어납니다.
(1..20) === capacity (21..70) === capacity (71..100) === capacity
조건의 순서가 뒤집혀 보이는 이유는, 루비가 왼쪽 객체에 대해 === 메서드를 호출하기 때문입니다. ===는 특별한 연산자가 아니라 어떤 클래스든 자유롭게 구현할 수 있는 일반적인 메서드입니다. 여기서는 Range 클래스가 이 메서드를 구현하여, 값이 범위 안에 포함되어 있을 때만 true를 반환합니다.
Rubinius 구현체에서 Range 클래스의 === 메서드는 다음과 같이 정의되어 있습니다.
def ===(value) include?(value) end
출처: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178
Proc과 case 문 조합하기
===를 구현하고 있는 흥미로운 클래스 중 하나가 바로 Proc입니다.
관련 글: proc과 lambda에 대해 더 자세히 알아보세요.
아래 예제에서는 짝수를 검사하는 proc과 홀수를 검사하는 proc 두 개를 정의했습니다.
odd = proc(&:odd?) even = proc(&:even?) case number when odd puts "Odd number" when even puts "Even number" end
내부적으로 실제 일어나는 일은 다음과 같습니다.
odd.===(number) even.===(number)
proc에 ===를 호출하는 것은 call을 호출하는 것과 같은 효과를 냅니다.
마무리
이번 글에서는 루비 case 문의 작동 방식과 그 유연함에 대해 배웠습니다. 범위, 정규표현식, 심지어 Proc까지 다양하게 조건을 구성할 수 있으니, 이제 여러분의 프로젝트에서 적극적으로 활용해 보세요!
이 글이 도움이 되었기를 바랍니다. 많은 분들이 학습할 수 있도록 공유 부탁드립니다! 🙂