Ruby의 개선 과제 및 철학
발표자는 Ruby를 ‘완벽에 가까운 언어’로 만들기 위한 목표를 제시하며, 이는 모든 요구사항을 충족하는 ‘완벽한 언어’는 존재하지 않는다는 전제에서 출발합니다. 개선이 필요한 ‘사소한’ 부분들로 다음을 언급했습니다:
-
로컬 변수 스코프: 블록 외부에서 변수를 참조할 때 초기화 없이는 에러가 발생하는 문제. 해결 방안으로 ‘로컬 변수 전파’를 고려했으나, 하위 호환성 및 사용자 관심도 부족으로 보류.
-
믹스인(Mix-in) 문제:
include된 모듈이 나중에 변경되어도 클래스에 반영되지 않는 문제, 메서드 이름 충돌 시 해결의 어려움. -
진정한 프라이빗 메서드 부재: Ruby의
private은 C++의protected에 해당하며, 서브클래스에서 오버라이드될 걱정 없는 메서드 부재. -
몽키 패칭의 전역 영향: Rails의 Active Support처럼 기존 클래스에 메서드를 추가하는 방식이 넓은 영향 범위를 가짐.
-
정수 나눗셈: 5/2가 2가 되는 문제. ###
mix메서드(Traits)를 통한 믹스인 개선 제안 발표는 특히 믹스인 문제 해결에 집중하며, Smalltalk의 Traits 개념을 도입한 새로운mix메서드를 제안합니다. 기존include의 한계: -
다중 상속을 제공하지 않는 Ruby에서
include는 구현 재사용의 대안이지만, 상속 체인에 추가되는 방식이라 이름 충돌 감지가 어렵고,alias_method_chain같은 복잡한 패턴으로 해결해야 했습니다. -
include된 모듈의 동적 변경이 반영되지 않아 일관성이 부족했습니다.mix메서드의 특징: -
모듈의 메서드를 클래스로 직접 ‘복사’하는 방식으로 동작하여 상속 체인에 영향을 주지 않습니다.
-
자동 충돌 감지: 이름이 중복되는 메서드가 있을 경우 기본적으로 오류를 발생시켜 개발자가 문제를 인지하도록 합니다.
-
명시적 충돌 해결:
mix호출 시 해시나 배열 문법을 사용하여 메서드 이름을 변경(rename)하거나 특정 메서드를 제외(remove)할 수 있습니다. -
상수 처리: 상수는 기본적으로 복사되지 않으며, 명시적으로 지정해야만 가져올 수 있습니다.
-
어라운드 메서드(Around Method): 기존 메서드를 래핑하는 기능을
mix문법 내에서 지원하여alias_method_chain의 필요성을 줄입니다. -
일관성 보장:
mix시점의 모듈 상태를 복사하므로, 이후 모듈 변경에 영향을 받지 않아 예측 가능한 동작을 보장합니다. ### Ruby 2.0의 전망 -
Ruby 2.0은 1.8에서 1.9로의 큰 변화만큼은 아니지만,
mix메서드, Class Box, 키워드 인자(Keyword Arguments) 등의 기능이 도입될 예정입니다. -
Class Box는 진정한 프라이빗 메서드 및 중첩 메서드 정의를 가능하게 하여 몽키 패칭의 영향을 줄이는 데 기여할 것으로 기대됩니다.
-
이러한 기능들은 1.9.x 버전에 점진적으로 도입된 후 2.0으로 통합될 가능성도 언급되었습니다.