π μΆμν΄λμ€
λ―Έμμ± λ©μλ(μΆμ λ©μλ)λ₯Ό ν¬ν¨νκ³ μλ ν΄λμ€. (μΌλ° λ©μλ λλ λ©€λ²λ³μ ν¬ν¨ κ°λ₯)
ν΄λμ€ μμ abstract
λΌλ ν€μλλ§ λΆμ΄λ©΄ λλ€.
π¨ μΈμ€ν΄μ€(ν΄λμ€λ‘λΆν° λ§λ€μ΄μ§ κ°μ²΄)λ₯Ό μμ±ν μ μλ€.
π¨ μμμ ν΅ν΄μ μμ ν΄λμ€μ μν΄μλ§ μμ±λ μ μλ€.
abstract class ν΄λμ€ μ΄λ¦ {
...
}
π μΆμλ©μλ
μμ abstract
ν€μλκ° λΆκ³ , ꡬνλΆ(μ€κ΄νΈ{}
λ‘ κ°μΈμ Έ μλ λΆλΆ)λ₯Ό μμ€ λ©μλ
abstract 리ν΄νμ
λ©μλμ΄λ¦();
ꡬνλΆλ μμμ ν΅ν΄ μμ±λ μ μλ€.
abstract class Player { // μΆμ ν΄λμ€
abstract void play(int pos); // μΆμ λ©μλ
abstract void stop(); // μΆμ λ©μλ
}
class AudioPlayer extends Player {
void play(int pos) { ... }; // μΆμ λ©μλλ₯Ό ꡬν
void stop { ... }; // μΆμ λ©μλλ₯Ό ꡬν
}
abstract class AbstractPlayer extends Player {
void play(int pos) { ... } // μΆμ λ©μλλ₯Ό ꡬν
}
π μΈν°νμ΄μ€
μΌμ’
μ μΆμν΄λμ€.
μ€μ§! μΆμλ©μλμ μμ(λ³νμ§ μλ κ°)λ§μ λ©€λ²λ‘ κ°μ§ μ μλ€.
interface μΈν°νμ΄μ€ μ΄λ¦ {
public static final νμ
μμμ΄λ¦ = κ°;
public abstract λ©μλμ΄λ¦(맀κ°λ³μλͺ©λ‘);
}
π¨ λͺ¨λ λ©€λ² λ³μλ public static final
μ΄μ΄μΌνλ©°, μ΄λ₯Ό μλ΅ν μ μλ€.
π¨ λͺ¨λ λ©μλλ public abstract
μ΄μ΄μΌνλ©°, μ΄λ₯Ό μλ΅ν μ μλ€.
(μλ΅λ μ μ΄μλ μ»΄νμΌ μμ μ»΄νμΌλ¬κ° μλμΌλ‘ μΆκ°ν΄μ€λ€.)
π μΈν°νμ΄μ€μ μμ
μΈν°νμ΄μ€λ μΈν°νμ΄μ€λ‘λΆν°λ§ μμλ°μ μ μλ€.
ν΄λμ€μ λ¬λ¦¬, λ€μ€ μμ κ°λ₯. (νμ§λ§, μλ°μμ μΈν°νμ΄μ€λ‘ λ€μ€ μμμ ꡬννλ κ²½μ°λ κ±°μ μλ€.)
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Movable, Attackable { ... }
π μΈν°νμ΄μ€μ ꡬν
implements
('ꡬννλ€'λΌλ λ») ν€μλλ‘ μΈν°νμ΄μ€ λ΄λΆμ μΆμλ©μλλ₯Ό μμ±ν΄ μ€ μ μλ€.
class ν΄λμ€ μ΄λ¦ implements μΈν°νμ΄μ€μ΄λ¦ {
// μΈν°νμ΄μ€μ μ μλλ μΆμλ©μλ ꡬν
}
class Fighter implements Fightable {
pulic void move(int x, int y) { ... }
public void attack(Unit u) { ... }
}
π¨ μΌλΆμ μΆμλ©μλλ§ μμ±ν΄ μ£Όκ³ μΆλ€λ©΄ abstract
λ₯Ό λΆμ¬μ μΆμν΄λμ€ λ‘ μ μΈν΄μ€μΌνλ€.
abstract class Fighter implements Fightable {
public void move(int x, int y) { ... }
}
π¨ μμ(extends
)κ³Ό ꡬν(implements
)μ λμμ μ¬μ©ν μ μλ€.
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { ... }
public void attack(Unit u) { ... }
}
π μΈν°νμ΄μ€μ μ₯μ
- κ°λ° μκ°μ λ¨μΆ μν¬ μ μλ€.
- νμ€νκ° κ°λ₯νλ€.
- μλ‘ κ΄κ³ μλ ν΄λμ€λ€μκ² κ΄κ³λ₯Ό λ§Ίμ΄μ€ μ μλ€.
- λ 립μ μΈ νλ‘κ·Έλλ°μ΄ κ°λ₯νλ€.
π λ€νμ±
μ¬λ¬κ°μ§ ννλ₯Ό κ°μ§ μ μλ λ₯λ ₯.
μ‘°μ ν΄λμ€ νμ
μ μ°Έμ‘°λ³μλ‘ μμν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μλλ‘ νλ κ².
class Tv { // μ‘°μ ν΄λμ€
boolean power;
int channeel;
void power() { power = !power; }
void channelUp { ++channel; }
void channelDown { --channel; }
}
class CaptionTv extends Tv { // μμ ν΄λμ€
String text;
void caption() { ... }
}
Tv t = new CaptionTv(); // μ‘°μ νμ
μ μ°Έμ‘°λ³μλ‘ μμ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°
μ°Έμ‘°λ³μ t
μ νμ
μ΄ μ‘°μ(Tv
)μ΄κΈ° λλ¬Έμ μ€μ μΈμ€ν΄μ€κ° CaptionTv
λΌ ν μ§λΌλ,
μ°Έμ‘°λ³μ t
λ‘λ CaptionTv
μΈμ€ν΄μ€μ λͺ¨λ λ©€λ²λ₯Ό μ¬μ©ν μ μλ€.
Tv
ν΄λμ€μ λ©€λ²λ€λ§ μ¬μ©ν μ μλ€.
λλ¬Έμ μ°Έμ‘°λ³μκ° μ¬μ©ν μ μλ λ©€λ²μ κ°μλ μΈμ€ν΄μ€μ λ©€λ² κ°μλ³΄λ€ κ°κ±°λ μ λ€.
π μΈν°νμ΄μ€λ₯Ό μ΄μ©ν λ€νμ±
μΈν°νμ΄μ€λ μ΄λ€ ν΄λμ€λ₯Ό ꡬν(implements
) νλ©΄μ μμ±λ μ μλ€κ³ νλ€.
μ¦, ꡬνν ν΄λμ€μ μ‘°μμ΄λΌν μ μλ μ
μ΄λ€.
λλ¬Έμ μμ μ€λͺ ν λ€νμ±μ νΉμ§μ΄ μΈν°νμ΄μ€μμλ μ μ©λλ€.
μΈν°νμ΄μ€ Fightable
μ ν΄λμ€ Fighter
κ° κ΅¬ννμ λ,
μλμ κ°μ΄ μ°Έμ‘°λ³μ(f
)μ νμ
μ μ‘°μ(Fightable
)μΌλ‘ μ μν΄ μ€ μ μλ€.
Fightable f = new Fighter();
π¨λ§€κ°λ³μμ νμ μ΄ μΈν°νμ΄μ€μΈ κ²½μ°π¨
void attack(Fightable f) {
...
}
Fightable
μΈν°νμ΄μ€ νμ
μ 맀κ°λ³μ f
κ° κ°λ μλ―Έλ
λ©μλ νΈμΆ μ ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό 맀κ°λ³μλ‘ μ 곡ν΄μΌνλ€λ κ²μ΄λ€.
λ°λΌμ attack
λ©μλλ₯Ό νΈμΆν λλ 맀κ°λ³μλ‘ Fightable
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ겨주μ΄μΌ νλ€.
attac(new Fighter());
π¨λ¦¬ν΄νμ μ΄ μΈν°νμ΄μ€μΈ κ²½μ°π¨
Fightable method() {
Fighter f = new Fighter();
return f;
}
λ©μλκ° ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°νν΄μΌνλ€λ μλ―Έμ΄λ€.