본문은 Ruby 모듈의 핵심을 ‘정체성(Identity) 대 행동(Behavior)’ 관점에서 설명합니다. ### 클래스 vs. 모듈: 정체성 vs. 행동
-
클래스:
class Dog < Animal처럼 객체의 “정체성(is-a)”을 정의하며 상속을 통해 나타냅니다. -
모듈:
include Swimmable처럼 객체가 “할 수 있는 행동(can-do)”을 추가합니다. 이는 객체가 무엇인지(클래스)와 무엇을 할 수 있는지(모듈)를 명확히 분리합니다.
Ruby에 모듈이 존재하는 이유
Ruby 모듈은 다음과 같은 핵심 기능을 제공하여 유연한 객체 지향 설계를 가능하게 합니다:
-
단일 상속 한계 극복: 다중 상속 없이 여러 행동을 자유롭게 조합합니다.
-
코드 재사용: 공통 메서드를 다양한 클래스에 공유합니다.
-
네임스페이스: 이름 충돌을 방지하고 코드 구조를 명확히 합니다.
-
믹스인 철학: 유연한 행동 조합을 위한 핵심 메커니즘입니다. Rails는
User < ApplicationRecord(정체성)와include ActiveModel::Validations(행동)의 조합으로 모듈의 효과적인 활용을 보여줍니다.
다른 OOP 언어와의 비교
Ruby 모듈은 다른 언어의 유사 개념과 차이를 보입니다:
- **Java/C
**: 인터페이스가 기본 메서드 도입 후 Ruby 모듈과 유사해졌으나, Ruby는 이 기능을 선도적으로 제공했습니다.
- Go: 인터페이스는 순수한 계약만을 정의하며, 행동 구현은 전적으로 구현체에 맡깁니다.
Ruby 모듈은 “인터페이스 + 믹스인”의 하이브리드 형태로, 간결하고 표현력 있는 행동 조합 방식을 제공합니다.
Swimmable예시를 통해 이러한 차이를 명확히 이해할 수 있습니다.