μΆμ λ©μλλ μμ ν΄λμ€μμ λ°λμ μ€λ²λΌμ΄λ©ν΄μΌλ§ μ¬μ©ν μ μλ λ©μλλ₯Ό μλ―Έν©λλ€.
μΆμ λ©μλκ° ν¬ν¨λ ν΄λμ€λ₯Ό μμλ°λ μμ ν΄λμ€κ° λ°λμ μΆμ λ©μλλ₯Ό ꡬννλλ‘ νκΈ° μν΄ μ¬μ©ν©λλ€.
μλ₯Ό λ€μ΄ μ€λ³΅ λλ 곡ν΅μ μΈ λΆλΆμ 미리 λ§λ€μ΄μ§ κ²μ μ¬μ©νκ³ μμ μκ² νμν λΆλΆλ§μ μ¬μ μνμ¬ μ¬μ©ν¨μΌλ‘μ¨ μμ°μ±μ΄ ν₯μλκ³ λ°°ν¬ λ±μ΄ μ¬μμ§κΈ° λλ¬Έμ
λλ€.
μΆμ λ©μλλ μ μΈλΆλ§ μ‘΄μ¬νλ©΄ ꡬνλΆλ μμ±νμ§ μμ΅λλ€.
μ΄ μμ±λμ΄ μμ§ μμ ꡬνλΆλ₯Ό μμ ν΄λμ€μμ μ€λ²λΌμ΄λ©νμ¬ μ¬μ©νκ² λ©λλ€.
abstract int fun();
μμ κ°μ΄ μ μΈλΆλ§ μκ³ κ΅¬νλΆκ° μλ€λ μλ―Έλ‘ μ μΈλΆ λμ μΈλ―Έμ½λ‘ (;)μ μΆκ°ν©λλ€.
μΆμ ν΄λμ€λ νλ μ΄μμ μΆμ λ©μλλ₯Ό ν¬ν¨νλ ν΄λμ€λ₯Ό κ°λ¦¬μΌ μΆμ ν΄λμ€νκ³ ν©λλ€.
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ μ€μν νΉμ§μΈ λ€νμ±μ κ°μ§λ λ©μλμ μ§ν©μ μ μν μ μλλ‘ ν΄μ€λλ€.
μ¦ λ°λμ μ¬μ©λμ΄μΌ νλ λ©μλλ₯Ό μΆμ ν΄λμ€μ μΆμ λ©μλλ‘ μ μΈν΄ λμΌλ©΄, μ΄ ν΄λμ€λ₯Ό μμλ°λ λͺ¨λ ν΄λμ€μμλ μ΄ μΆμ λ©μλλ₯Ό λ°λμ μ¬μ μν΄μΌ ν©λλ€.
ꡬνμ κ°μ λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ μμ μ±μ ν₯μμν¬ μ μμ΅λλ€.
abstract class A {
...
abstract int fun();
...
}
μ΄λ¬ν μΆμ ν΄λμ€λ λμμ΄ μ μλμ΄ μμ§ μμ μΆμ λ©μλλ₯Ό ν¬ν¨νκ³ μμΌλ―λ‘, μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
μμμ ν΅ν΄ μμ ν΄λμ€λ₯Ό λ§λ ν, μμ ν΄λμ€μμ μΆμ ν΄λμ€μ λͺ¨λ μΆμ λ©μλλ₯Ό μ€λ²λΌμ΄λ©νκ³ λμ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μκ² λ©λλ€.
abstract class Animal { abstract void cry(); }
class Cat extends Animal { void cry() { System.out.println("λμΉλμΉ!"); } }
class Dog extends Animal { void cry() { System.out.println("λ©λ©!"); } }
public class Polymorphism02 {
public static void main(String[] args) {
// Animal a = new Animal(); // μΆμ ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ.
Cat c = new Cat();
Dog d = new Dog();
c.cry();
d.cry();
}
}
μλ°μμλ λ©μλ μΆμ²μ λͺ¨νΈμ± λ±μ λ¬Έμ λ‘ μΈν΄ ν΄λμ€λ₯Ό ν΅ν λ€μ€ μμμ΄ μ§μλμ§ μμ΅λλ€.
μ΄λ₯Ό 보μνκΈ° μν΄ μΈν°νμ΄μ€λΌλ κ²μ ν΅ν΄ λ€μ€ μμμ μ§μν©λλ€.
μΈν°νμ΄μ€λ λ€λ₯Έ ν΄λμ€λ₯Ό μμ±ν λ κΈ°λ³Έμ΄ λλ νμ μ 곡νλ©΄μ,
λ€λ₯Έ ν΄λμ€ μ¬μ΄μ μ€κ° λ§€κ° μν κΉμ§ λ΄λΉνλ μΌμ’
μ μΆμ ν΄λμ€λ₯Ό μλ―Έν©λλ€.
β
Abstract Class vs Interface
μΆμ ν΄λμ€λ μΆμ λ©μλλΏλ§ μλλΌ μμ±μ, νλ, μΌλ° λ©μλλ ν¬ν¨ν μ μμ§λ§,
μΈν°νμ΄μ€λ μ΅κ³ μμ€μ μΆμν λ¨κ³λ‘, μ€λ‘μ§ μΆμ λ©μλμ μμλ§μ ν¬ν¨ν μ μμ΅λλ€.
JDK 8λΆν° μΈν°νμ΄μ€μμ default methodμ static methodλ₯Ό ν΅ν΄ ꡬνλΆλ μμ±ν μ μκ² λμμ΅λλ€.
μ λ€λ¦μ΄λ λ°μ΄ν°μ νμ
μ μΌλ°ννλ€λ κ²μ μλ―Έν©λλ€.
ν΄λμ€λ λ©μλμμ μ¬μ©ν λ΄λΆ λ°μ΄ν° νμ
μ μ»΄νμΌ μμ 미리 μ§μ νλ λ°©λ²μΌλ‘, μ»΄νμΌ μ 미리 νμ
κ²μ¬λ₯Ό μννκ² λ©λλ€.
μ΄λ‘μ¨ ν΄λμ€λ λ©μλ λ΄λΆμμ μ¬μ©λλ κ°μ²΄μ νμ
μμ μ±μ λμΌ μ μκ³ , λ°νκ°μ λν νμ
λ³ν λ° νμ
κ²μ¬μ λ€μ΄κ°λ λ
Έλ ₯μ μ€μΌ μ μμ΅λλ€.
JDK 1.5μ΄μ μμλ μ¬λ¬ νμ
μ μ¬μ©νλ λλΆλΆμ ν΄λμ€λ λ©μλμμ μΈμλ λ°νκ°μΌλ‘ Object νμ
μ μ¬μ©νμΌλ, λ°νλ κ°μ²΄λ₯Ό λ€μ μνλ νμ
μΌλ‘ λ³νν΄μΌ νλ©° μ΄ λ μ€λ₯κ° λ°μν μ μμ΅λλ€.
μ΄λ₯Ό 보μνκΈ° μν΄ JDK 1.5λΆν° λμ
λ μ λ€λ¦μ ν΅ν΄ μ»΄νμΌ μμ 미리 νμ
μ΄ μ ν΄μ Έ λ²κ±°λ‘μ΄ μμ
μ μλ΅ν μ μκ² λ©λλ€.
μ λ€λ¦ ν΄λμ€μ μ μΈμ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
class MyArray<T> {
T element;
void setElement(T element) { this.element = element; }
T getElement() { return element; }
}
T
λ₯Ό νμ
λ³μ(type variable)λΌκ³ νλ©°, μμμ μ°Έμ‘°ν νμ
μ μλ―Έν©λλ€.
μ΄λ ν λ¬Έμλ₯Ό μ¬μ©ν΄λ μκ΄μμΌλ©°, μ¬λ¬ κ°μ νμ
λ³μλ μΌν(,)λ‘ κ΅¬λΆνμ¬ λͺ
μν μ μμ΅λλ€.
νμ
λ³μλ ν΄λμ€μμλΏλ§ μλλΌ λ©μλμ 맀κ°λ³μλ λ°νκ°μΌλ‘λ μ¬μ©ν μ μμ΅λλ€.
μ λ€λ¦ ν΄λμ€λ₯Ό μμ±ν λλ λ€μκ³Ό κ°μ΄ νμ
λ³μ μ리μ μ€μ μ¬μ©ν νμ
μ λͺ
μν΄μΌ ν©λλ€.
MyArray<Integer> myArr = new MyArray<Integer>();
μ΄λ κ² μ€μ μ¬μ©ν νμ
μ λͺ
μνλ©΄ λ΄λΆμ μΌλ‘λ μ μλ νμ
λ³μκ° λͺ
μλ μ€μ νμ
μΌλ‘ λ³νλμ΄ μ²λ¦¬λ©λλ€.
νμ
μ λͺ
μν λ κΈ°λ³Έ νμ
μ λ°λ‘ μ¬μ©ν μ μκ³ , Wrapper Classλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
Java SE 7λΆν° μΈμ€ν΄μ€ μμ± μ νμ
μ μΆμ ν μ μλ κ²½μ° νμ
μ μλ΅ν μ μμ΅λλ€.
MyArray<Integer> myArr = new MyArray<Integer>();
μ λ€λ¦ νμ
μ μ»΄νμΌ μ μ»΄νμΌλ¬μ μν΄ μλμΌλ‘ κ²μ¬λμ΄ νμ
λ³νλ©λλ€.
μ΄ λ μ½λ λ΄μ λͺ¨λ μ λ€λ¦ νμ
μ μ κ±°λμ΄ μ»΄νμΌλ ν΄λμ€ νμΌμλ μ΄λ ν μ λ€λ¦ νμ
λ ν¬ν¨λμ§ μκ² λ©λλ€.
μ λ€λ¦μ μ¬μ©νμ§ μλ μ½λμμ νΈνμ±μ μ μ§νκΈ° μν΄ μ΄λ κ² λμλ©λλ€.
π‘ Java Generic vs C++ Template
- Templateμλ intμ κ°μ κΈ°λ³Έ νμ
μ μΈμλ‘ λκΈΈ μ μμ§λ§, Genericμμλ Integerμ λμ μ¬μ©ν΄μΌ ν©λλ€.
- Templateμ μΈμλ‘ μ£Όμ΄μ§ νμ
μΌλ‘λΆν° κ°μ²΄λ₯Ό λ§λ€μ΄ λΌ μ μμ§λ§, Genericμμλ λΆκ°λ₯ν©λλ€.
- Generic Classλ‘ λ§λ λͺ¨λ κ°μ²΄λ μ λΆ λλ±ν νμ
μ΄μ§λ§, Templateλ λ€λ₯Έ νμ
μΈμ μ¬μ© μ μλ‘ λ€λ₯Έ νμ
μ κ°μ²΄μ
λλ€.
- Genericμ νμ
μΈμλ₯Ό νΉμ ν νμ
μ΄ λλλ‘ μ νν μ μμ΅λλ€.
- Genericμ μ μ λ©μλλ λ³μλ₯Ό μ μΈνλ λ° μ¬μ©ν μ μμ§λ§, Templateλ κ°λ₯ν©λλ€.