IMCAT.DEV
로그인 가입
Ruby 중급 도구

Ruby 루비 모듈 시스템 이해하기

Ruby 루비 모듈 시스템 이해하기 — 중급

루비 모듈 시스템 이해하기

1. 도입 (왜 배워야 하는가)

루비의 모듈 시스템은 객체 지향 프로그래밍에서 매우 중요한 개념입니다. 모듈은 코드의 재사용성을 높이고, 네임스페이스를 제공하여 코드 충돌을 방지하는 데 도움을 줍니다. 실무에서 여러 팀원이 함께 작업하는 경우, 모듈을 사용하지 않으면 클래스나 메서드의 이름이 충돌하여 예기치 않은 에러가 발생할 수 있습니다. 또한, 코드의 유지보수성과 가독성을 높이는 데도 큰 역할을 합니다. 만약 모듈을 활용하지 않는다면, 코드가 비대해지고 복잡해져 관리하기 어려운 상태에 이를 수 있습니다.

2. 핵심 개념 설명

모듈은 클래스와 비슷하지만, 인스턴스를 생성할 수 없고, 주로 메서드와 상수로 구성됩니다. 모듈의 주요 목적은 코드의 재사용과 그룹화를 통해 네임스페이스를 제공하는 것입니다.

관련 용어 정리

용어설명
모듈메서드와 상수를 포함할 수 있는 집합체
믹스인모듈을 클래스에 포함시켜 기능을 추가하는 패턴
네임스페이스이름 충돌을 피하기 위한 범위

3. 기본 코드 예제

아래는 간단한 모듈 정의와 사용법을 보여주는 코드입니다.

module Greeting
  def self.hello
    "안녕하세요!"
  end
end

puts Greeting.hello

실행 결과

안녕하세요!

코드 한 줄씩 동작 설명

  1. module Greeting : Greeting이라는 모듈을 정의합니다.
  2. def self.hello : 모듈의 클래스 메서드인 hello를 정의합니다.
  3. "안녕하세요!" : hello 메서드가 반환하는 문자열입니다.
  4. puts Greeting.hello : Greeting 모듈의 hello 메서드를 호출하고 결과를 출력합니다.
  5. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 구현

    쇼핑몰에서 장바구니 기능을 구현할 때 모듈을 사용하여 할인 계산 기능을 추가할 수 있습니다.

    module Discountable
      def apply_discount(price, discount)
        price - (price * discount / 100)
      end
    end
    
    class ShoppingCart
      include Discountable
      
      def initialize
        @items = []
      end
      
      def add_item(price)
        @items << price
      end
      
      def total_price
        @items.sum
      end
    
      def total_price_after_discount(discount)
        apply_discount(total_price, discount)
      end
    end
    
    cart = ShoppingCart.new
    cart.add_item(10000)
    cart.add_item(20000)
    
    puts cart.total_price_after_discount(10) # 27000

    실행 결과

    27000

    예제 2: 사용자 인증 모듈

    사용자의 인증을 관리하는 모듈을 만들어 재사용할 수 있습니다.

    module Auth
      def authenticate(user)
        # 여기서 사용자 인증 로직을 구현
        user[:authenticated] = true
      end
    end
    
    class User
      include Auth
      
      attr_accessor :name, :authenticated
      
      def initialize(name)
        @name = name
        @authenticated = false
      end
    end
    
    user = User.new("홍길동")
    user.authenticate(user)
    
    puts user.authenticated # true

    실행 결과

    true

    5. 흔한 실수와 주의사항

    실수 1: 모듈 메서드 호출 시 self를 빼먹기

    • 잘못된 코드
    • module MathHelper
        def square(x)
          x * x
        end
      end
      
      puts MathHelper.square(5) # 에러 발생
    • 올바른 코드
    • module MathHelper
        def self.square(x)
          x * x
        end
      end
      
      puts MathHelper.square(5) # 25

      실수 2: 모듈을 포함하지 않고 메서드 호출

    • 잘못된 코드
    • class User
        def greet
          hello
        end
      end
      
      User.new.greet # 에러 발생
    • 올바른 코드
    • module Greeting
        def hello
          "안녕하세요!"
        end
      end
      
      class User
        include Greeting
        
        def greet
          hello
        end
      end
      
      puts User.new.greet # 안녕하세요!

      6. 정리

    • 모듈은 코드의 재사용성과 네임스페이스 기능을 제공하여 객체 지향 프로그래밍에서 중요한 역할을 합니다.
    • 모듈을 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다.
    • 믹스인 패턴을 통해 클래스에 다양한 기능을 손쉽게 추가할 수 있습니다.
    • 다음에 학습하면 좋은 주제로는 '루비의 클래스 상속', '루비의 블록과 프로시저', '루비에서의 예외 처리'를 추천합니다.