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

Ruby 상속과 다형성

Ruby 상속과 다형성 — 중급

상속과 다형성

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

상속과 다형성은 객체 지향 프로그래밍의 핵심 개념입니다. 이 두 가지를 이해하고 활용하는 것은 코드의 재사용성과 유지 보수성을 높여줍니다. 예를 들어, 쇼핑몰 시스템에서 다양한 상품(예: 의류, 전자기기)을 관리할 때, 각각의 상품이 공통된 속성과 메서드를 가질 수 있도록 상속을 사용하면 코드가 간결해지고 이해하기 쉬워집니다. 만약 이 개념을 모른다면, 코드 중복이 심해지고, 수정 시 많은 부분을 일일이 수정해야 하는 비효율적인 상황이 발생할 수 있습니다.

2. 핵심 개념 설명

상속

상속은 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 것입니다. 예를 들어, '동물' 클래스가 있고, 그 클래스를 상속받아 '개'와 '고양이' 클래스를 만들 수 있습니다. 이때 '개'와 '고양이'는 '동물'의 속성과 행동을 공유하지만, 각자의 특성을 추가할 수 있습니다.

다형성

다형성은 같은 메서드 호출이 다양한 클래스의 객체에 따라 다르게 동작하는 것을 의미합니다. 이는 주로 상속과 함께 사용되며, 예를 들어 '동물' 클래스의 '소리내기' 메서드가 '개' 클래스에서는 '멍멍', '고양이' 클래스에서는 '야옹'으로 다르게 구현될 수 있습니다.

용어정의
상속클래스간 속성과 메서드를 물려받는 것
다형성하나의 메서드가 다양한 형태로 동작하는 것

3. 기본 코드 예제

다음은 상속과 다형성을 사용한 간단한 예제입니다.

class Animal
  def speak
    "동물 소리"
  end
end

class Dog < Animal
  def speak
    "멍멍"
  end
end

class Cat < Animal
  def speak
    "야옹"
  end
end

# 객체 생성 및 메서드 호출
dog = Dog.new
cat = Cat.new

puts dog.speak  # "멍멍"
puts cat.speak  # "야옹"

실행 결과:

멍멍
야옹

코드 한 줄씩 동작 설명:

  1. class Animal - 'Animal'이라는 클래스를 정의합니다.
  2. def speak - 'speak'라는 메서드를 정의합니다. 기본적으로 "동물 소리"를 반환합니다.
  3. class Dog < Animal - 'Dog' 클래스가 'Animal' 클래스를 상속합니다.
  4. def speak - 'Dog' 클래스에서 'speak' 메서드를 재정의하여 "멍멍"을 반환합니다.
  5. class Cat < Animal - 'Cat' 클래스가 'Animal' 클래스를 상속합니다.
  6. def speak - 'Cat' 클래스에서 'speak' 메서드를 재정의하여 "야옹"을 반환합니다.
  7. dog = Dog.new - 'Dog' 클래스의 인스턴스를 생성합니다.
  8. cat = Cat.new - 'Cat' 클래스의 인스턴스를 생성합니다.
  9. puts dog.speak - 'Dog' 객체의 'speak' 메서드를 호출하여 "멍멍"을 출력합니다.
  10. puts cat.speak - 'Cat' 객체의 'speak' 메서드를 호출하여 "야옹"을 출력합니다.
  11. 4. 실전 활용 예제

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

    쇼핑몰에서 장바구니에 다양한 상품을 추가할 때, 각 상품의 공통 속성과 메서드를 상속받아 관리할 수 있습니다.

    class Product
      attr_accessor :name, :price
    
      def initialize(name, price)
        @name = name
        @price = price
      end
    
      def info
        "#{@name} - #{@price}원"
      end
    end
    
    class Clothing < Product
      attr_accessor :size
    
      def initialize(name, price, size)
        super(name, price)
        @size = size
      end
    
      def info
        "#{super} (사이즈: #{@size})"
      end
    end
    
    class Electronics < Product
      attr_accessor :warranty
    
      def initialize(name, price, warranty)
        super(name, price)
        @warranty = warranty
      end
    
      def info
        "#{super} (보증기간: #{@warranty}년)"
      end
    end
    
    shirt = Clothing.new("티셔츠", 20000, "M")
    laptop = Electronics.new("노트북", 1500000, 2)
    
    puts shirt.info   # "티셔츠 - 20000원 (사이즈: M)"
    puts laptop.info  # "노트북 - 1500000원 (보증기간: 2년)"

    예제 2: 게임 캐릭터

    게임에서 다양한 캐릭터(전사, 마법사) 클래스를 구현할 때, 공통적인 행동을 상속받아 각 캐릭터의 특성에 맞게 다형성을 활용할 수 있습니다.

    class Character
      def attack
        "공격!"
      end
    end
    
    class Warrior < Character
      def attack
        "검으로 공격!"
      end
    end
    
    class Mage < Character
      def attack
        "마법으로 공격!"
      end
    end
    
    warrior = Warrior.new
    mage = Mage.new
    
    puts warrior.attack  # "검으로 공격!"
    puts mage.attack     # "마법으로 공격!"

    5. 흔한 실수와 주의사항

    실수 1: 잘못된 상속 구문

    class Dog Animal  # 잘못된 구문
    end

    올바른 코드:

    class Dog < Animal  # 올바른 상속 구문
    end

    실수 2: 메서드 재정의 시 super 키워드 사용 안함

    class Dog < Animal
      def speak
        "멍멍"
      end
    end
    
    dog = Dog.new
    puts dog.speak  # "멍멍" (Animal의 speak 메서드 호출 안 함)

    올바른 코드:

    class Dog < Animal
      def speak
        super + " (강아지의 소리)"  # Animal의 speak 메서드 호출
      end
    end

    6. 정리

    • 상속을 통해 코드의 재사용성을 높일 수 있다.
    • 다형성을 활용하면 같은 메서드가 다양한 객체에서 다르게 동작할 수 있다.
    • 상속과 다형성을 통해 유지 보수가 용이한 코드를 작성할 수 있다.
    • 다음에 학습하면 좋은 주제는 '인터페이스와 추상 클래스'입니다. 이러한 개념은 상속과 다형성을 더욱 깊이 이해하는 데 도움을 줄 것입니다.