IMCAT.DEV
로그인 가입
Ruby 중급 객체지향

Ruby 클래스와 모듈

Ruby 클래스와 모듈 — 중급

클래스와 모듈

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

클래스와 모듈은 루비(Ruby) 프로그래밍에서 객체 지향 프로그래밍의 핵심 요소입니다. 객체 지향 프로그래밍은 실제 세계의 사물이나 개념을 프로그램으로 모델링하는 데 도움을 줍니다. 이를 통해 코드의 재사용성, 유지보수성, 확장성을 높일 수 있습니다.

실무에서 객체 지향 프로그래밍을 사용하지 않으면 코드가 비효율적이고 복잡해져 유지보수가 어려워질 수 있습니다. 예를 들어, 쇼핑몰 시스템을 개발할 때 장바구니, 상품, 사용자 정보를 각각의 클래스로 나누지 않으면 코드가 중복되고, 변경 사항을 관리하기 어려워질 수 있습니다. 클래스와 모듈을 사용하여 잘 구조화된 코드를 작성하는 것은 필수적입니다.

2. 핵심 개념 설명

클래스

클래스는 객체를 생성하기 위한 청print입니다. 클래스는 속성(변수)과 행동(메소드)을 정의합니다. 예를 들어, 자동차라는 클래스를 정의하면 색상, 모델 등의 속성과 주행, 정지 등의 행동을 가질 수 있습니다.

모듈

모듈은 관련된 메소드와 상수의 집합으로, 여러 클래스에서 공유할 수 있는 기능을 제공합니다. 클래스와 달리 인스턴스화할 수는 없지만, 여러 클래스에서 공통적으로 사용해야 하는 기능을 정의할 때 유용합니다. 예를 들어, 여러 종류의 차량 클래스가 있을 때, '운전 가능'이라는 기능을 모듈로 정의해 공유할 수 있습니다.

용어정의
클래스객체를 만들기 위한 템플릿
모듈여러 클래스에서 공유할 기능 집합

3. 기본 코드 예제

# 자동차 클래스를 정의합니다.
class Car
  attr_accessor :color, :model

  def initialize(color, model)
    @color = color  # 색상 속성
    @model = model  # 모델 속성
  end

  def drive
    "운전 중입니다."  # 주행 행동
  end
end

# 자동차 객체를 생성합니다.
my_car = Car.new("빨강", "소나타")
puts my_car.color  # 자동차의 색상 출력
puts my_car.drive   # 자동차의 주행 행동 출력

실행 결과:

빨강
운전 중입니다.
  • class Car : 자동차 클래스를 정의합니다.
  • attr_accessor :color, :model : 색상과 모델 속성을 생성합니다.
  • initialize : 객체가 생성될 때 색상과 모델을 초기화합니다.
  • def drive : 자동차가 운전 중이라는 메시지를 반환하는 메소드를 정의합니다.
  • my_car = Car.new("빨강", "소나타") : 새로운 자동차 객체를 생성합니다.
  • puts my_car.color : 자동차의 색상을 출력합니다.
  • puts my_car.drive : 자동차의 주행 행동을 출력합니다.
  • 4. 실전 활용 예제

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

    쇼핑몰에서 장바구니를 구현할 때 클래스를 사용하여 개별 상품을 객체로 만들고, 장바구니 클래스를 통해 여러 상품을 관리합니다.

    class Product
      attr_accessor :name, :price
    
      def initialize(name, price)
        @name = name
        @price = price
      end
    end
    
    class Cart
      def initialize
        @items = []  # 장바구니 아이템 목록
      end
    
      def add_item(product)
        @items << product  # 상품을 장바구니에 추가
      end
    
      def total_price
        @items.map(&:price).sum  # 총 가격 계산
      end
    end
    
    apple = Product.new("사과", 1000)
    banana = Product.new("바나나", 1500)
    cart = Cart.new
    cart.add_item(apple)
    cart.add_item(banana)
    puts cart.total_price  # 총 가격 출력

    실행 결과:

    2500
  • Product 클래스는 상품의 이름과 가격을 정의합니다.
  • Cart 클래스는 장바구니에 상품을 추가하고 총 가격을 계산하는 메소드를 포함합니다.
  • cart.add_item(apple) : 사과를 장바구니에 추가합니다.
  • cart.total_price : 장바구니의 총 가격을 계산하여 출력합니다.
  • 예제 2: 사용자 관리 시스템

    사용자 정보를 관리하는 시스템을 만들 때 클래스를 사용하여 각 사용자의 정보를 객체로 만들고, 모듈을 사용하여 공통 기능을 정의할 수 있습니다.

    module Authenticatable
      def authenticate(password)
        @password == password  # 비밀번호 인증 메소드
      end
    end
    
    class User
      include Authenticatable  # 모듈 포함
    
      attr_accessor :name, :password
    
      def initialize(name, password)
        @name = name
        @password = password
      end
    end
    
    user = User.new("홍길동", "mypassword")
    puts user.authenticate("mypassword")  # 인증 성공

    실행 결과:

    true
  • Authenticatable 모듈은 비밀번호를 인증하는 메소드를 포함합니다.
  • User 클래스는 사용자의 이름과 비밀번호를 속성으로 가집니다.
  • include Authenticatable : 사용자 클래스에 인증 기능을 추가합니다.
  • user.authenticate("mypassword") : 비밀번호가 일치하는지 확인합니다.
  • 5. 흔한 실수와 주의사항

    실수 1: 클래스와 모듈의 혼동

    class MyModule
      def hello
        "안녕하세요"
      end
    end
  • 잘못된 코드: MyModule을 클래스로 정의했지만 모듈로 사용하려고 했습니다.
  • 올바른 코드:
  • module MyModule
      def hello
        "안녕하세요"
      end
    end

    실수 2: 인스턴스 변수 접근

    class Dog
      def initialize(name)
        @name = name
      end
    
      def bark
        puts name  # 잘못된 접근
      end
    end
  • 잘못된 코드: 인스턴스 변수에 접근할 때 @를 빼먹었습니다.
  • 올바른 코드:
  • def bark
      puts @name  # 올바른 접근
    end

    6. 정리

  • 클래스는 객체를 생성하기 위한 청print이며, 속성과 메소드를 정의합니다.
  • 모듈은 여러 클래스에서 공유할 수 있는 기능 집합으로, 코드 재사용을 촉진합니다.
  • 객체 지향 프로그래밍의 원칙을 따름으로써 코드의 유지보수성과 확장성을 높일 수 있습니다.
  • 다음에 학습하면 좋은 주제: 상속과 다형성, 의존성 주입, 디자인 패턴.