학습
Ruby 루비 모듈 시스템 이해하기
Ruby 루비 모듈 시스템 이해하기 — 중급
루비 모듈 시스템 이해하기
1. 도입 (왜 배워야 하는가)
루비의 모듈 시스템은 객체 지향 프로그래밍에서 매우 중요한 개념입니다. 모듈은 코드의 재사용성을 높이고, 네임스페이스를 제공하여 코드 충돌을 방지하는 데 도움을 줍니다. 실무에서 여러 팀원이 함께 작업하는 경우, 모듈을 사용하지 않으면 클래스나 메서드의 이름이 충돌하여 예기치 않은 에러가 발생할 수 있습니다. 또한, 코드의 유지보수성과 가독성을 높이는 데도 큰 역할을 합니다. 만약 모듈을 활용하지 않는다면, 코드가 비대해지고 복잡해져 관리하기 어려운 상태에 이를 수 있습니다.
2. 핵심 개념 설명
모듈은 클래스와 비슷하지만, 인스턴스를 생성할 수 없고, 주로 메서드와 상수로 구성됩니다. 모듈의 주요 목적은 코드의 재사용과 그룹화를 통해 네임스페이스를 제공하는 것입니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 모듈 | 메서드와 상수를 포함할 수 있는 집합체 |
| 믹스인 | 모듈을 클래스에 포함시켜 기능을 추가하는 패턴 |
| 네임스페이스 | 이름 충돌을 피하기 위한 범위 |
3. 기본 코드 예제
아래는 간단한 모듈 정의와 사용법을 보여주는 코드입니다.
module Greeting
def self.hello
"안녕하세요!"
end
end
puts Greeting.hello
실행 결과
안녕하세요!
코드 한 줄씩 동작 설명
module Greeting:Greeting이라는 모듈을 정의합니다.def self.hello: 모듈의 클래스 메서드인hello를 정의합니다."안녕하세요!":hello메서드가 반환하는 문자열입니다.puts Greeting.hello:Greeting모듈의hello메서드를 호출하고 결과를 출력합니다.- 잘못된 코드
- 올바른 코드
- 잘못된 코드
- 올바른 코드
- 모듈은 코드의 재사용성과 네임스페이스 기능을 제공하여 객체 지향 프로그래밍에서 중요한 역할을 합니다.
- 모듈을 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다.
- 믹스인 패턴을 통해 클래스에 다양한 기능을 손쉽게 추가할 수 있습니다.
- 다음에 학습하면 좋은 주제로는 '루비의 클래스 상속', '루비의 블록과 프로시저', '루비에서의 예외 처리'를 추천합니다.
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 # 안녕하세요!