왜 Ruby에는 Boolean 클래스가 없을까 - 최종 버전

Why doesn't Ruby have Boolean class - final version - Speaker Deck

작성자
Ruby on Rails 소식지
발행일
2025년 09월 11일

핵심 요약

  • 1 Ruby는 `TrueClass`와 `FalseClass`라는 별개의 클래스에 속하는 `true`와 `false` 싱글톤 객체를 통해 불리언 값을 표현합니다.
  • 2 단일 `Boolean` 클래스가 없는 것은 Ruby의 객체 지향적 유연성과 `nil` 및 `false`만을 거짓으로 간주하는 조건문 처리 방식에 기인합니다.
  • 3 이러한 설계는 불필요한 상속 계층을 피하고, 모든 것이 객체라는 Ruby의 철학을 유지하면서도 명확한 논리 연산을 가능하게 합니다.

도입

Ruby를 처음 접하는 개발자들은 다른 객체 지향 언어와 달리 `Boolean`이라는 단일 클래스가 존재하지 않는다는 사실에 의문을 가질 수 있습니다. 대부분의 언어에서 `true`와 `false`는 `Boolean` 타입의 인스턴스로 취급되지만, Ruby는 이와는 다른 독특한 접근 방식을 채택하고 있습니다. 본 글에서는 Ruby가 불리언 값을 어떻게 표현하고 처리하는지, 그리고 왜 `Boolean` 클래스를 따로 두지 않았는지에 대한 배경과 그 철학적 의미를 심층적으로 탐구하고자 합니다.

Ruby는 불리언 값을 표현하기 위해 truefalse라는 두 개의 특별한 객체를 사용합니다. 이들은 각각 TrueClassFalseClass라는 별개의 클래스에 속하는 싱글톤 객체입니다. 즉, Ruby 프로그램 내에서 true는 항상 동일한 TrueClass의 인스턴스이고, false는 항상 동일한 FalseClass의 인스턴스입니다.

Ruby의 불리언 값 처리 방식

  • TrueClass와 FalseClass:
    • true.classTrueClass를 반환합니다.
    • false.classFalseClass를 반환합니다.
    • 이 두 클래스는 Object 클래스를 상속받지만, 서로 직접적인 상속 관계를 가지지 않습니다.
  • 싱글톤 객체:
    • truefalse는 각각의 클래스에서 유일한 인스턴스입니다. 이는 메모리 효율성을 높이고, 객체의 동일성을 보장합니다.
    • true.object_idfalse.object_id는 프로그램 실행 내내 고유한 값을 유지하며, 다른 true 또는 false 객체가 생성되지 않습니다.

조건문에서의 Truthy/Falsy

Ruby의 조건문(예: if, while)에서는 nilfalse만이 ‘거짓(falsy)’으로 평가됩니다. 이들을 제외한 모든 다른 객체(숫자, 문자열, 배열, 해시, 심지어 빈 문자열이나 0도 포함)는 ‘참(truthy)’으로 간주됩니다.

```ruby if 0 puts “0은 참입니다.” # 이 코드가 실행됨 end

if “” puts “빈 문자열도 참입니다.” # 이 코드가 실행됨 end

if nil puts “nil은 거짓입니다.” # 이 코드는 실행되지 않음 end ```

왜 Boolean 클래스가 없을까?

Ruby에 단일 Boolean 클래스가 없는 주된 이유는 다음과 같습니다. * 객체 지향적 유연성: Ruby는 “모든 것이 객체”라는 강력한 철학을 가지고 있습니다. TrueClassFalseClass는 이 철학을 따르면서도, 불리언 로직을 독립적으로 처리할 수 있는 유연성을 제공합니다. * 불필요한 계층: TrueClassFalseClass 위에 추상적인 Boolean 클래스를 두는 것은 Ruby의 단순성과 직접적인 객체 지향 접근 방식에 비추어 볼 때 불필요한 복잡성을 추가할 수 있습니다. 각 불리언 값 자체가 이미 충분히 의미 있는 객체로 기능합니다. * 메시지 전달: Ruby에서 객체는 메시지를 통해 상호작용합니다. truefalse는 각각 &, |, ^, !와 같은 논리 연산자 메서드를 가지고 있으며, 이는 Boolean 클래스 없이도 충분히 강력한 기능을 제공합니다.

결론

Ruby가 `Boolean`이라는 단일 클래스 대신 `TrueClass`와 `FalseClass`를 사용하는 방식은 언어의 근본적인 객체 지향 철학과 실용성을 반영한 결과입니다. 이 설계는 `true`와 `false`를 독립적인 객체로 취급하면서도, `nil`과 `false`만을 거짓으로 간주하는 명확한 조건문 규칙을 통해 개발자에게 혼란을 주지 않습니다. 결과적으로 Ruby는 불필요한 상속 계층을 피하고, 모든 것이 객체라는 일관된 모델을 유지하면서도 효율적이고 유연한 논리 연산을 가능하게 합니다. 이러한 설계는 Ruby의 독특한 매력 중 하나로, 언어의 간결성과 표현력을 높이는 데 기여합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!