[Java] Polymorphism
π‘ μ΄ κ²μκΈμ κΉμν κ°μ¬λμ μλ° κ°μλ₯Ό μκ°νλ©° νμ΅ν λ΄μ©μ μ€μν ν€μλ μ€μ¬μΌλ‘ μ 리ν κ°μΈ νμ΅ κΈ°λ‘μ λλ€. μ€μ§ κΈ°μ΅ λ³΅κΈ°λ₯Ό μν λͺ©μ μΌλ‘ μμ±λμμΌλ©°, λͺ¨λ λ΄μ©μ ν¬ν¨νμ§ μμΌλ―λ‘ μ²΄κ³μ μΈ νμ΅ μλ£λ‘λ μ ν©νμ§ μμ΅λλ€.
μμ μ μ₯λ³Έμ΄ λ μκ°λ κ²½μ°κ° μμ΄ demoλ‘ μ λ‘λ
Section12 (λ€νμ±2)
μΆμν΄λμ€
λλ¬Ό(Animal )κ³Ό κ°μ΄ λΆλͺ¨ ν΄λμ€λ μ 곡νμ§λ§, μ€μ μμ±λλ©΄ μλλ ν΄λμ€λ₯Ό μΆμ ν΄λμ€λΌ νλ€.
μΆμν΄λμ€λ μΆμμ μΈ κ°λ
μ μ 곡νλ ν΄λμ€.
λ°λΌμ μΈμ€ν΄μ€κ° μ‘΄μ¬νμ§ μμΌλ©° μμμ λͺ©μ μΌλ‘ μμ©λκ³ , λΆλͺ¨ ν΄λμ€ μν μ λ΄λΉνλ€.
μΆμ ν΄λμ€λ ν΄λμ€λ₯Ό μ μΈν λ μμ μΆμμ΄λΌλ μλ―Έμ abstract ν€μλλ₯Ό λΆμ¬μ£Όλ©΄ λλ€.
1
abstract class AbstractAnimal {...}
μΆμλ©μλ
λΆλͺ¨ ν΄λμ€λ₯Ό μμ λ°λ μμ ν΄λμ€κ° λ°λμ μ€λ²λΌμ΄λ© ν΄μΌ νλ λ©μλλ₯Ό λΆλͺ¨ ν΄λμ€μ μ μν μ μλ€.
μΆμ λ©μλλ μ΄λ¦ κ·Έλλ‘ μΆμμ μΈ κ°λ
μ μ 곡νλ λ©μλμ΄λ€. λ°λΌμ μ€μ²΄κ° μ‘΄μ¬νμ§ μκ³ ,
λ©μλ λ°λκ° μλ€.
1
public abstract void sound();
π± μΆμ λ©μλκ° νλλΌλ μλ ν΄λμ€λ μΆμ ν΄λμ€λ‘ μ μΈν΄μΌ νλ€.
π± μΆμ λ©μλλ μμ λ°λ μμ ν΄λμ€κ° λ°λμ μ€λ²λΌμ΄λ© ν΄μ μ¬μ©ν΄μΌ νλ€.
(μμ μΆμ ν΄λμ€)
1
2
3
4
public abstract class AbstractAnimal {
public abstract void sound();
public abstract void move();
}
μμνλ ν΄λμ€λ λͺ¨λ λ©μλλ₯Ό ꡬνν΄μΌ νλ€.
μλ°λ μμ μΆμ ν΄λμ€λ₯Ό λ νΈλ¦¬νκ² μ¬μ©ν
μ μλλ‘ μΈν°νμ΄μ€λΌλ κ°λ
μ μ 곡νλ€.
μΈν°νμ΄μ€
μΈν°νμ΄μ€λ λ€μ€ ꡬν(λ€μ€ μμ)μ μ§μνλ€.
λ©μλμ public abstract λ₯Ό μλ΅ν μ μλ€. μ°Έκ³ λ‘ μλ΅μ΄ κΆμ₯λλ€.
μΈν°νμ΄μ€μμ λ©€λ² λ³μλ public , static , final μ΄ λͺ¨λ ν¬ν¨λμλ€κ³ κ°μ£Όλλ€. final μ λ³μμ κ°μ ν
λ² μ€μ νλ©΄ μμ ν μ μλ€λ λ»μ΄λ€
1
2
3
4
public interface InterfaceAnimal {
public abstract void sound();
public abstract void move();
}
μ μ½ μΈν°νμ΄μ€λ₯Ό λ§λλ μ΄μ λ μΈν°νμ΄μ€λ₯Ό ꡬννλ κ³³μμ μΈν°νμ΄μ€μ λ©μλλ₯Ό λ°λμ ꡬνν΄λΌλ κ·μ½(μ μ½)μ μ£Όλ κ².
λ€μ€κ΅¬ν μΈν°νμ΄μ€λ λΆλͺ¨λ₯Ό μ¬λ¬λͺ
λλ λ€μ€
ꡬν(λ€μ€ μμ)μ΄ κ°λ₯νλ€.
μΈν°νμ΄μ€ λ€μ€κ΅¬ν
1
2
3
4
5
6
7
8
9
10
11
12
package diamond;
public class Child implements InterfaceA, InterfaceB {
@Override
public void methodA() {}
@Override
public void methodB() {}
@Override
public void methodCommon() {}
}
1
public class Bird extends AbstractAnimal implements Fly, Swim {
extends λ₯Ό ν΅ν μμμ νλλ§ ν μ μκ³ implements λ₯Ό ν΅ν μΈν°νμ΄μ€λ λ€μ€ ꡬν ν μ μκΈ° λλ¬Έμ λμ΄ ν¨
κ» λμ¨ κ²½μ° extends κ° λ¨Όμ λμμΌ νλ€.
OCP (Open-Closed Principle)
Open for extension μλ‘μ΄ κΈ°λ₯μ μΆκ°λ λ³κ²½ μ¬νμ΄ μκ²Όμ λ, κΈ°μ‘΄ μ½λλ νμ₯ν μ μμ΄μΌ νλ€.
Closed for modification κΈ°μ‘΄μ μ½λλ μμ λμ§ μμμΌ νλ€.
κΈ°μ‘΄μ μ½λ μμ μμ΄ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν μ μμ΄μΌ νλ€.
νμ₯μλ μ΄λ €μκ³ , λ³κ²½μλ λ«ν μλ€λ μλ―Έ.
μ¦, ν΅μ¬ ν΄λΌμ΄μΈνΈμ μ½λλ₯Ό λ³κ²½νμ§ μλλ‘ νλ κ².
main() μ μ 체 νλ‘κ·Έλ¨μ μ€μ νκ³ μ‘°μ¨νλ μν μ νλ€. μ΄λ° λΆλΆμ OCPλ₯Ό μ§μΌλ λ³κ²½μ΄ νμνλ€.