상속과 다형성 (Inheritance & Polymorphism)
상속(Inheritance)은 부모 클래스가 가진 변수와 메서드를 자식 클래스가 그대로 물려받아 재사용하는 문법입니다. extends 키워드를 사용하며, 코드 중복을 획기적으로 줄여줍니다.
부모에게 물려받은 행동을 자식의 입맛에 맞게 재정의하는 것을 오버라이딩(Overriding)이라고 합니다. 이를 바탕으로, 부모 타입의 변수에 다양한 자식 객체들을 번갈아 끼워 넣으며 유연하게 동작시키는 객체지향의 꽃, 다형성(Polymorphism)을 구현할 수 있습니다.
// 부모 클래스
class Animal {
public void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스 (Dog는 Animal을 상속받음)
class Dog extends Animal {
// 부모의 메서드를 자식의 입맛에 맞게 재정의(Overriding)
@Override
public void makeSound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("야옹~");
}
}
public class Main {
public static void main(String[] args) {
// 다형성 (Polymorphism): 부모 타입의 변수에 자식 객체를 담을 수 있습니다. (업캐스팅)
Animal myDog = new Dog();
Animal myCat = new Cat();
// 동일한 메서드를 호출하지만, 실제 담겨있는 객체에 따라 다르게 작동합니다.
myDog.makeSound(); // 출력: 멍멍!
myCat.makeSound(); // 출력: 야옹~
// 배열을 사용하면 다양한 자식 객체들을 하나의 부모 그룹으로 관리할 수 있어 강력합니다.
Animal[] pets = { new Dog(), new Cat() };
for (Animal pet : pets) {
pet.makeSound();
}
}
}