Ruby는 불리언 값을 표현하기 위해 true와 false라는 두 개의 특별한 객체를 사용합니다. 이들은 각각 TrueClass와 FalseClass라는 별개의 클래스에 속하는 싱글톤 객체입니다. 즉, Ruby 프로그램 내에서 true는 항상 동일한 TrueClass의 인스턴스이고, false는 항상 동일한 FalseClass의 인스턴스입니다.
Ruby의 불리언 값 처리 방식
- TrueClass와 FalseClass:
true.class는TrueClass를 반환합니다.false.class는FalseClass를 반환합니다.- 이 두 클래스는
Object클래스를 상속받지만, 서로 직접적인 상속 관계를 가지지 않습니다.
- 싱글톤 객체:
true와false는 각각의 클래스에서 유일한 인스턴스입니다. 이는 메모리 효율성을 높이고, 객체의 동일성을 보장합니다.true.object_id와false.object_id는 프로그램 실행 내내 고유한 값을 유지하며, 다른true또는false객체가 생성되지 않습니다.
조건문에서의 Truthy/Falsy
Ruby의 조건문(예: if, while)에서는 nil과 false만이 ‘거짓(falsy)’으로 평가됩니다. 이들을 제외한 모든 다른 객체(숫자, 문자열, 배열, 해시, 심지어 빈 문자열이나 0도 포함)는 ‘참(truthy)’으로 간주됩니다.
```ruby if 0 puts “0은 참입니다.” # 이 코드가 실행됨 end
if “” puts “빈 문자열도 참입니다.” # 이 코드가 실행됨 end
if nil puts “nil은 거짓입니다.” # 이 코드는 실행되지 않음 end ```
왜 Boolean 클래스가 없을까?
Ruby에 단일 Boolean 클래스가 없는 주된 이유는 다음과 같습니다.
* 객체 지향적 유연성: Ruby는 “모든 것이 객체”라는 강력한 철학을 가지고 있습니다. TrueClass와 FalseClass는 이 철학을 따르면서도, 불리언 로직을 독립적으로 처리할 수 있는 유연성을 제공합니다.
* 불필요한 계층: TrueClass와 FalseClass 위에 추상적인 Boolean 클래스를 두는 것은 Ruby의 단순성과 직접적인 객체 지향 접근 방식에 비추어 볼 때 불필요한 복잡성을 추가할 수 있습니다. 각 불리언 값 자체가 이미 충분히 의미 있는 객체로 기능합니다.
* 메시지 전달: Ruby에서 객체는 메시지를 통해 상호작용합니다. true와 false는 각각 &, |, ^, !와 같은 논리 연산자 메서드를 가지고 있으며, 이는 Boolean 클래스 없이도 충분히 강력한 기능을 제공합니다.