학습
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 # "야옹"
실행 결과:
멍멍
야옹
코드 한 줄씩 동작 설명:
class Animal- 'Animal'이라는 클래스를 정의합니다.def speak- 'speak'라는 메서드를 정의합니다. 기본적으로 "동물 소리"를 반환합니다.class Dog < Animal- 'Dog' 클래스가 'Animal' 클래스를 상속합니다.def speak- 'Dog' 클래스에서 'speak' 메서드를 재정의하여 "멍멍"을 반환합니다.class Cat < Animal- 'Cat' 클래스가 'Animal' 클래스를 상속합니다.def speak- 'Cat' 클래스에서 'speak' 메서드를 재정의하여 "야옹"을 반환합니다.dog = Dog.new- 'Dog' 클래스의 인스턴스를 생성합니다.cat = Cat.new- 'Cat' 클래스의 인스턴스를 생성합니다.puts dog.speak- 'Dog' 객체의 'speak' 메서드를 호출하여 "멍멍"을 출력합니다.puts cat.speak- 'Cat' 객체의 'speak' 메서드를 호출하여 "야옹"을 출력합니다.- 상속을 통해 코드의 재사용성을 높일 수 있다.
- 다형성을 활용하면 같은 메서드가 다양한 객체에서 다르게 동작할 수 있다.
- 상속과 다형성을 통해 유지 보수가 용이한 코드를 작성할 수 있다.
- 다음에 학습하면 좋은 주제는 '인터페이스와 추상 클래스'입니다. 이러한 개념은 상속과 다형성을 더욱 깊이 이해하는 데 도움을 줄 것입니다.
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