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

루비(Ruby) case 문 완벽 가이드 – 다양한 활용법과 내부 동작 원리

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

루비(Ruby) case 문 완벽 가이드 – 다양한 활용법과 내부 동작 원리

참고: 다른 프로그래밍 언어에서는 이를 switch 문이라고 부릅니다.

case 문의 구성 요소

루비의 case 문은 다음 세 가지 키워드로 구성됩니다.

키워드설명
casecase 문의 시작을 선언합니다. 처리할 변수를 인자로 받습니다.
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까지 다양하게 조건을 구성할 수 있으니, 이제 여러분의 프로젝트에서 적극적으로 활용해 보세요!

이 글이 도움이 되었기를 바랍니다. 많은 분들이 학습할 수 있도록 공유 부탁드립니다! 🙂