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

Ruby 부울(Boolean) 값 완벽 이해하기: truthy와 falsy의 모든 것

프로그래밍에서 부울(Boolean)은 논리 판단의 기본이 되는 값입니다. 이 글에서는 Ruby에서 부울 값이 어떻게 동작하는지, 그리고 이를 효과적으로 활용하는 방법까지 차근차근 살펴보겠습니다.

부울(Boolean)이란 무엇인가?

부울은 논리 문장에서 어떤 대상이 true(참)인지 false(거짓)인지를 나타내는 값입니다. 이 값을 통해 프로그램은 조건에 따른 의사결정을 내릴 수 있습니다.

흥미로운 점은 Ruby에는 Boolean이라는 클래스가 존재하지 않지만, 부울 객체는 분명히 존재한다는 사실입니다. 바로 truefalse이며, 이 둘은 각각 TrueClassFalseClass의 싱글턴(singleton) 객체입니다.

다음과 같은 메서드를 호출하면 부울 값을 얻을 수 있습니다:

  • empty?
  • all?
  • match?

등호(==)로 두 값을 비교할 때도 마찬가지입니다:

1 == 1

# true

단, 주의할 점이 있습니다. Ruby에서 == 역시 하나의 메서드이기 때문에, 해당 클래스가 이 메서드를 어떻게 구현했느냐에 따라 동작이 달라질 수 있습니다.

Truthy 값과 Falsy 값

truthy 값이란 무엇일까요? if 문처럼 부울 맥락에서 평가될 때 true로 취급되는 값을 말합니다.

Ruby에서는 단 두 가지를 제외한 모든 값이 truthy입니다:

  • false
  • nil

바로 이 두 값, 그리고 오직 이 두 값만을 우리는 "falsy"라고 부릅니다. 숫자 0이나 빈 문자열 ""도 truthy라는 점은 다른 언어에 익숙한 개발자에게 중요한 포인트입니다.

실전에서의 부울 활용

이러한 특성 때문에 조건문을 작성할 때 코드가 훨씬 간결해집니다.

예를 들어:

if bacon
  puts "we got bacon"
end

Ruby는 문자열을 출력하기 전에 bacon이 truthy한지, 즉 falsenil이 아닌지를 확인합니다.

다시 말해, bacon 객체에 메서드를 호출하는 것이 아니라면 굳이 nil 여부를 일일이 검사할 필요가 없다는 뜻입니다.

안전 탐색 연산자(Safe Navigation Operator)

하지만 객체에 직접 메서드를 호출해야 하는 경우도 있습니다.

예를 들면:

if bacon.stock
  # ...
end

이때 baconnil이라면 에러가 발생합니다. 이를 우아하게 피하는 방법이 있습니다.

예제:

if bacon&.stock
  # ...
end

&.안전 탐색 연산자(safe navigation operator)라고 부르며, Ruby 2.3부터 도입되었습니다. 객체가 nil이면 메서드 호출을 건너뛰고 nil을 반환하기 때문에 NoMethodError를 걱정할 필요가 없습니다.

부울 메서드(Predicate Methods)

물음표(?)로 끝나는 메서드를 본 적이 있으신가요? empty?가 대표적인 예입니다.

이런 메서드를 술어 메서드(predicate method)라고 하며, 관례상 반드시 true 또는 false를 반환해야 합니다.

직접 만들 수도 있습니다:

def published?
  # ...
end

def ready?
  # ...
end

이 패턴은 코드의 의도를 명확하게 드러내며, 전체적으로 더 "Ruby답게" 느껴지도록 만들어 줍니다.

부울 매개변수는 피해야 한다

앞서 살펴본 부울 메서드는 훌륭하지만, 반대로 피해야 할 것이 있습니다. 바로 부울 매개변수입니다.

예제:

def bacon(raw)
end

bacon(false)

bacon(false)라는 코드를 보면 이 false가 무슨 의미인지 전혀 알 수 없습니다. 정확한 의미를 파악하려면 메서드 내부 코드를 직접 열어봐야 합니다.

게다가 부울 매개변수는 메서드가 불필요하게 복잡해진다는 신호이기도 합니다. 하나의 메서드가 두 가지 이상의 역할을 하고 있다는 뜻이니까요.

해결책은? 메서드를 두 개로 분리하거나, 애초에 부울 플래그가 필요 없도록 코드를 설계하는 것입니다.

부울 논리(Boolean Logic)

TrueClassFalseClass는 몇 가지 메서드를 구현하고 있습니다. to_s, inspect 같은 기본 메서드도 있지만, 더 흥미로운 것들은 다음과 같습니다:

  • &
  • |
  • ^

이 낯설어 보이는 메서드들의 정체는 바로 부울 논리입니다.

부울 논리 진리표:

연산 기호 TRUE / TRUE TRUE / FALSE
AND & true false
OR | true true
XOR ^ false true

예제:

true & true

일상적인 Ruby 코드에서 부울 논리 연산자를 직접 쓸 일은 많지 않지만, 이것이 컴퓨터가 동작하는 근간이라는 점에서 알아두면 의미가 큽니다.

마무리

지금까지 Ruby의 부울 값에 대해 살펴보았습니다. 핵심을 정리하면 다음과 같습니다.

  • Ruby에는 Boolean 클래스가 없으며, truefalse는 각각 TrueClassFalseClass의 싱글턴 객체입니다.
  • falsenil을 제외한 모든 값이 truthy입니다.
  • &. 안전 탐색 연산자로 nil 에러를 방지할 수 있습니다.
  • 물음표로 끝나는 술어 메서드는 true/false를 반환해야 합니다.
  • 부울 매개변수는 가독성을 해치므로 피하는 것이 좋습니다.

이 글이 도움이 되었다면 주변에 공유해 주세요 🙂 읽어주셔서 감사합니다!