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

Ruby 삼항 연산자(?:) 완벽 가이드 – 기본 문법부터 주의사항까지

Ruby에서 삼항 연산자란 무엇일까요?

삼항 연산자는 말 그대로 세 개의 부분으로 구성되어 있어 '삼항(ternary)'이라는 이름이 붙었습니다. 이 세 부분은 조건식두 가지 결과값입니다.

즉, 삼항 연산자를 활용하면 if/else 문을 단 한 줄의 코드로 압축해서 표현할 수 있습니다.

예를 들어, 아래 코드는:

if apple_stock > 1
  :eat_apple
else
  :buy_apple
end

다음과 같이 줄일 수 있습니다:

apple_stock > 1 ? :eat_apple : :buy_apple

이것이 가능한 이유는 바로 삼항 연산자 덕분입니다.

그렇다면 이 연산자는 정확히 어떻게 동작하고, 올바른 문법은 무엇일까요? 지금부터 하나씩 살펴보겠습니다.

삼항 연산자 작성 템플릿

삼항 연산자의 문법을 일반화하면 "빈칸 채우기" 형태의 템플릿이 됩니다.

기본 구조는 다음과 같습니다:

condition ? true : false

첫 번째 부분은 조건(condition)입니다. 참인지 거짓인지 판별하고 싶은 조건식이 여기에 들어갑니다.

그다음에는 물음표(?)가 옵니다. 이것은 문법의 일부로, Ruby가 해당 표현식을 삼항 연산자로 인식하는 기준이 됩니다.

그다음에는 조건이 true일 때 실행될 코드, 즉 첫 번째 결과값이 위치합니다.

이후 콜론(:)이 오는데, 역시 필수 문법 요소입니다.

마지막으로 조건이 false일 때 실행될 코드, 즉 두 번째 결과값이 옵니다.

예제:

"chocolate".size > 4 ? "More than four characters" : "Less than four characters"
  • 조건 => "chocolate".size > 4
  • 참일 때 => "More than four characters"
  • 거짓일 때 => "Less than four characters"

이 세 가지 요소가 모든 삼항 연산식의 기본 구성 요소입니다.

주의할 점은, 메서드 이름이 물음표로 끝나더라도 조건과 결과값 사이의 ?를 빠뜨리면 안 된다는 것입니다.

예제:

"".empty? ? "Yes" : "No"

이 부분은 놓치기 쉬우므로 이런 코드를 작성할 때 특히 신경 써야 합니다.

복잡한 삼항 연산자는 피하는 것이 좋습니다

삼항 연산자는 잘못 사용하기 쉽습니다. 복잡한 로직에 적용하기 시작하면 오히려 독이 됩니다.

예를 들어, 삼항 연산식의 결과를 변수에 할당하는 것은 전혀 문제가 없습니다.

a = 10 > 5 ? "yes" : "no"

하지만 결과값에 공백이 포함되면 상황이 달라집니다.

다음 예제를 보세요:

10 > 5 ? (puts "yes") : (puts "no")

여기서는 반드시 괄호를 사용해야 합니다.

왜일까요?

괄호를 생략하면 SyntaxError가 발생하기 때문입니다.

문제는 이러한 괄호가 코드를 읽기 어렵게 만들어, 삼항 연산자가 제공하는 가독성과 간결함이라는 장점을 무색하게 한다는 점입니다.

따라서 삼항 연산자를 사용할지 말지 결정할 때 이 점을 항상 염두에 두어야 합니다.

삼항 연산자와 연산자 우선순위

삼항 연산식에서 자주 마주치는 또 다른 문제는 연산자 우선순위입니다.

예제:

[].tap { |a| a << "ccccc".size == 0 ? "empty" : "not empty" }

# [5]

삼항 연산의 두 결과값 중 하나인 "empty" 또는 "not empty"가 나올 것이라고 예상했지만, 실제로는 5가 반환되었습니다.

무슨 일이 일어난 걸까요?

Ruby를 비롯한 대부분의 프로그래밍 언어는 표현식을 서로 다른 우선순위 수준에 따라 처리합니다.

간단한 산술 연산에서도 마찬가지입니다!

곱셈이 덧셈·뺄셈보다 먼저 계산된다는 것은 이미 잘 알고 계실 겁니다.

마찬가지로 Ruby에서는 메서드 호출(<<, size)이 삼항 연산자보다 높은 우선순위를 가지며, 이것이 위 예제의 결과를 설명해 줍니다.

이 문제는 괄호로 해결할 수 있습니다:

[].tap { |a| a << ("bbbbb".size == 0 ? "empty"  : "not empty") }

# ["not empty"]

삼항 연산자를 작성할 때 기억해야 할 또 하나의 포인트입니다.

정리

이번 글에서는 Ruby의 삼항 조건 연산자에 대해 배웠습니다. 삼항 연산자를 사용하면 조건문을 간결하게 작성할 수 있지만, 상황에 따라 코드의 가독성을 높일 수도, 오히려 떨어뜨릴 수도 있습니다.

이제 직접 연습해 볼 차례입니다! 배운 내용을 반복해서 실습하며 지식을 확실히 몸에 새겨 보세요.

읽어주셔서 감사합니다 🙂