π μμ κ΄κ³μμ νμ λ³νμ΄ μ€μν μ΄μ (μ μΊμ€ν κ³Ό λ€μ΄μΊμ€ν )
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP)μ 곡λΆνλ€ λ³΄λ©΄, "μ κ΅³μ΄ μμ κ°μ²΄λ₯Ό λΆλͺ¨ νμ μΌλ‘ μ°Έμ‘°νμ§?"λΌλ μ§λ¬Έμ΄ λ€ μ μλ€.
μ΄λ² κΈμμλ μμ κ΄κ³μμ μμ£Ό μ¬μ©λλ μ μΊμ€ν (upcasting) κ³Ό λ€μ΄μΊμ€ν (downcasting) μ κ°λ κ³Ό μ€μ μ¬μ© μ¬λ‘λ₯Ό μ 리νλ€.
1. μ μΊμ€ν μ΄λ?
μ μΊμ€ν μ μμ ν΄λμ€μ κ°μ²΄λ₯Ό λΆλͺ¨ ν΄λμ€ νμ μΌλ‘ μ°Έμ‘°νλ κ²μ μλ―Έν©λλ€.
Animal a = new Dog(); // μ
μΊμ€ν
μ΄λ κ² νλ©΄ λΆλͺ¨ ν΄λμ€μ μ μλ λ©€λ²λ§ μ κ·Όν μ μμ§λ§, μ€μ κ°μ²΄λ μμ κ°μ²΄μ΄κΈ° λλ¬Έμ μ€λ²λΌμ΄λ©λ λ©μλλ μμ ν΄λμ€μ κ²μ΄ μ€νλ©λλ€.
μ μ μΊμ€ν μ μΈκΉ?
- λ€νμ±(polymorphism) ꡬνμ ν΅μ¬μ
λλ€.
- λ€μν μμ κ°μ²΄λ₯Ό 곡ν΅λ λΆλͺ¨ νμ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
- μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ΄ λ°μ΄λ©λλ€.
- μλ‘μ΄ μμ ν΄λμ€κ° μΆκ°λλλΌλ, λΆλͺ¨ νμ λ§ μκ³ μμΌλ©΄ μ½κ² λ€λ£° μ μμ΅λλ€.
μ€μ νμ© μ
List<Animal> animals = List.of(new Dog(), new Cat());
for (Animal a : animals) {
a.sound(); // κ° μμ ν΄λμ€μ sound()κ° νΈμΆλ¨
}
μ΄μ²λΌ μ μΊμ€ν μ νλ μμν¬, λΌμ΄λΈλ¬λ¦¬, 컬λ μ λ±μμλ κΈ°λ³Έμ μΌλ‘ μ¬μ©λ©λλ€.
2. λ€μ΄μΊμ€ν μ΄λ?
λ€μ΄μΊμ€ν μ λΆλͺ¨ νμ μΌλ‘ μ°Έμ‘°λ κ°μ²΄λ₯Ό λ€μ μμ νμ μΌλ‘ λ³ννλ κ²μ λλ€.
Animal a = new Dog();
Dog d = (Dog) a; // λ€μ΄μΊμ€ν
μ λ€μ΄μΊμ€ν μ μΈκΉ?
λΆλͺ¨ νμ μλ μλ, μμ ν΄λμ€ κ³ μ μ κΈ°λ₯μ μ¬μ©ν΄μΌ ν λ νμν©λλ€.
πΉ νμμ μΈ λ€μ΄μΊμ€ν μμ
void interact(Animal a) {
if (a instanceof Dog) {
Dog d = (Dog) a;
d.fetch(); // Dogμλ§ μλ λ©μλ
} else if (a instanceof Cat) {
Cat c = (Cat) a;
c.scratch(); // Catμλ§ μλ λ©μλ
}
}
μ΄ κ²½μ°, λΆλͺ¨ νμ μΈ Animalλ‘ λ°μμ 곡ν΅λ λ‘μ§μ μ²λ¦¬νλ, νμν λ μμ κ°μ²΄μ κ³ μ λμμ μ¬μ©νκΈ° μν΄ λ€μ΄μΊμ€ν μ΄ νμν©λλ€.
β οΈ μ£Όμμ¬ν
- λ€μ΄μΊμ€ν μ μ instanceofλ‘ νμ 체ν¬λ₯Ό νμ§ μμΌλ©΄ `ClassCastException`μ΄ λ°μν μ μλ€.
λ체 λ°©λ²: μΆμ λ©μλ νμ©
λ€μ΄μΊμ€ν μ μ΅μννκ³ μΆλ€λ©΄, λΆλͺ¨ ν΄λμ€μ `μΆμ λ©μλ`λ₯Ό μ μΈνκ³ μμμμ μ€λ²λΌμ΄λ©νλ λ°©μμ΄ μ’μ.
abstract class Animal {
abstract void interact();
}
class Dog extends Animal {
void interact() { fetch(); }
void fetch() { ... }
}
μ΄λ κ² νλ©΄ λ€μ΄μΊμ€ν μμ΄λ μμμ κ³ μ λμμ μ€νν μ μλ€.
3. μ 리
μ μΊμ€ν | μμ -> λΆλͺ¨, λ€νμ± κ΅¬ν, μμ£Ό μ¬μ©λ¨ |
λ€μ΄μΊμ€ν | λΆλͺ¨ -> μμ, κ³ μ κΈ°λ₯ μ¬μ© μ νμ, μ‘°μ¬ν΄μ μ¬μ© |
`μ μΊμ€ν `μ κ°μ²΄μ§ν₯μ κΈ°λ³Έ λꡬμ΄λ©°, `λ€μ΄μΊμ€ν `μ νΉμ μν©μμλ§ μ μ€νκ² μ¬μ©νλ κ² μ’μ΅λλ€.