루비에서의 반복문: 메시지 패싱 철학 이해하기

Some Smalltalk about Ruby Loops

작성자
HackerNews
발행일
2025년 10월 20일

핵심 요약

  • 1 루비의 반복문은 단순한 '루프'가 아닌 '메시지 패싱' 패러다임에 기반하며, 객체가 메시지에 응답하는 방식입니다.
  • 2 Smalltalk에서 영감을 받은 루비는 '구문보다는 프로토콜'을 중시하며, `for` 루프는 이러한 루비의 본질적인 철학과 상이합니다.
  • 3 `.times`, `.each`와 같은 메서드 호출은 객체에 반복의 의미를 직접 부여하고 객체 자율성을 강조하는 루비다운 방식입니다.

도입

루비에서 반복문을 사용하는 방식은 다른 언어와는 다른 독특한 철학을 담고 있습니다. 파이썬과 같은 언어에서 익숙한 `for` 루프는 루비의 본질적인 방식이 아니며, `.times`, `.each`와 같은 메서드 호출이 루비의 핵심적인 반복 메커니즘입니다. 이는 단순한 문법적 차이를 넘어, 루비가 Smalltalk에서 계승한 '메시지 패싱'이라는 근본적인 객체 지향 패러다임을 이해하는 데 중요한 출발점이 됩니다.

루비에서 10.times { ... }와 같은 코드는 단순히 “10번 반복하라”는 명령이 아니라, 숫자 10이라는 Integer 객체에 :times라는 메시지를 보내는 행위입니다. 이 메시지 패싱 개념은 파이썬의 object.method(argument) 방식과 달리, 객체가 메시지를 수신하고 그에 대한 응답 방식을 스스로 결정하는 객체 자율성을 강조합니다.

메시지 패싱과 메서드 호출의 차이

  • 전통적인 언어: 컴파일 시점에 메서드를 찾아 호출합니다.

  • 루비: 10.send(:times) { ... }와 같이 런타임에 :times라는 심볼 메시지를 객체 10에 보냅니다. 객체는 이 메시지를 받고 어떻게 응답할지 결정합니다.

  • method_missing을 통해 존재하지 않는 메시지에 대한 응답을 정의할 수 있으며, 이는 메시지가 메서드와 독립적으로 존재함을 보여줍니다.

Smalltalk의 영향

루비의 이러한 메시지 패싱 철학은 Smalltalk에서 크게 영감을 받았습니다. Smalltalk에서는 5 timesRepeat: [ ... ]#(1 2 3) do: [ ... ]와 같이 모든 것이 메시지 패싱으로 이루어집니다. 루비의 Integer.times, Array.each, Enumerable 모듈의 다양한 메서드들은 이 Smalltalk의 컬렉션 프로토콜(Collection Protocol)을 구현한 것입니다. Enumerable을 포함하고 each 메서드를 구현하면 map, select, reduce 등 다양한 반복 메서드를 자동으로 사용할 수 있습니다.

for 루프가 이질적인 이유

for 루프는 루비의 메시지 패싱 패러다임과 일치하지 않는 구문적 요소입니다. for 루프는 변수를 외부 스코프에 노출시키는 등 부작용을 일으키며, 객체에 반복의 의미를 직접 부여하는 루비의 방식과 다릅니다. 이는 루비가 ‘구문보다는 프로토콜(Protocol over Syntax)’을 중시하는 철학을 따르기 때문입니다. 루비는 객체가 스스로 반복 방식을 정의하고 메시지에 응답하도록 장려하며, 이는 루비 코드를 작성하는 독특한 스타일을 형성합니다.

결론

루비에서 반복문을 이해하는 것은 단순한 문법 학습을 넘어, Smalltalk에서 유래한 '메시지 패싱'과 '프로토콜 우선'이라는 루비의 핵심 철학을 체득하는 과정입니다. `for` 루프가 아닌 `.times`, `.each`와 같은 메서드를 사용하는 것은 객체에 자율성을 부여하고, 객체가 메시지에 응답하며 동작을 정의하도록 하는 루비다운 방식입니다. 이러한 이해는 루비만의 독특하고 관용적인 코딩 스타일을 개발하는 데 필수적이며, 루비의 설계 의도를 깊이 있게 파악할 수 있도록 돕습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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