LYnLab

소개블로그

게시물의 썸네일 이미지

Ruby의 and와 &&는 다르다

Ruby로 프로그램을 짜다보면 반드시 밟게되는 지뢰가 있습니다. 바로 or 과 ||, 혹은 and 와 && 연산자의 우선순위가 달라서 발생하는 일입니다.

#프로그래밍#Ruby2022-08-07

Ruby로 프로그램을 짜다보면 반드시 밟게되는 지뢰가 있습니다. 바로 or||, 혹은 and&& 연산자의 우선 순위가 달라서 발생하는 일입니다. 약간 차이가 있어도 비슷한 순서였다면 문제가 되지 않겠지만, 하필 둘 사이에는 = 을 비롯한 할당 연산자가 끼어있기에 실수를 하게 되는 경우가 많습니다.

예제

다음 코드를 실행하면 두 변수에는 어떤 값이 지정될까요?

a = false or true
b = false || true

정답은 다음과 같습니다.

a  # false
b  # true

위 예제에서 사용된 연산자 우선 순위는 높은 것부터 낮은 순서로 ||, =, or 입니다. 따라서 위 코드는 다음의 순서로 실행됩니다.

(a = false) or true
b = (false || true)

왜 이런 차이를 만들었을까?

이는 두 연산자가 애초에 다른 목적을 띄고 있기 때문입니다.

||, && 은 우리가 일반적으로 생각하는 논리 연산을 위한 연산자입니다. 따라서 일반적인 불 대수의 논리 연산을 위해서는 ||, && 연산자를 사용하는 것이 좋습니다.

반면 orand 는 흐름 제어(control flow)를 위해 사용합니다. Bash를 사용해보셨다면 call_first && call_second 같은 식으로 흐름 제어를 해본 경험이 있으실텐데요, 루비의 or, and 는 이러한 목적의 연산자입니다. 때문에 이 연산자들은 다른 연산자들보다 가장 낮은 우선 순위에 있죠.

이를 활용한 간단한 예제는 다음과 같습니다. do_something 메소드가 실패했다는 의미로 false 를 리턴한다고 가정하겠습니다.

# 예제 1
result = do_something or "failed"

# 예제 2
result = do_something || "failed"

# 각 구문의 실행 순서는 다음과 같습니다.
(result = do_something) or "failed"
result = (do_something || "failed")
  • 예제 1resultdo_something 값의 실행 결과를 할당하고, 만약 이 실행 결과가 실패라면 "failed" 라는 문자열을 출력하는 목적의 코드입니다. result 변수에 값을 할당하는 것과, 할당된 값을 보고 결과를 출력하는 두 개의 동작을 하나의 syntax로 묶은 것이죠.
  • 예제 2do_something 을 실행하고, 만약 실패했다면 result 값 자체에 "failed"을 할당하는 것이 목적입니다. 이는 result 변수에 값을 할당하는 하나의 동작밖에 수행하지 않습니다.

이렇게 엄연한 차이가 있지만 얼핏 보기에는 헷갈리는 것이 사실입니다. 따라서 일반적인 경우에서는 예제 1과 같은 코드 보다는 아래와 같이 명시적으로 작성하는 것이 헷갈리지 않을 것입니다.

result = do_something
puts "failed" unless result

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2022 Hoerin Doh, All rights reserved.

LYnLab 로고About MeGitHubTwitterInstagram