μΆμ ν΄λμ€
κ°λ¨ν λ§νλ©΄β¦
ν΄λμ€λ₯Ό μ€κ³λλΌ νλ©΄, μΆμ ν΄λμ€λ λ―Έμμ± μ€κ³λμ λΉμ ν μ μλ€.
(μ¬κΈ°μ ν΄λμ€κ° λ―Έμμ±μ΄λΌλ κ²μ μΆμ λ©μλλ₯Ό ν¬ν¨νκ³ μλ€λ μλ―Έμ΄λ€.)
μλ₯Ό λ€λ©΄, κ°μ ν¬κΈ°μTVλΌλ κΈ°λ₯μ μ°¨μ΄μ λ°λΌ μ¬λ¬ μ’
λ₯μ λͺ¨λΈμ΄ μμ§λ§
μ€κ³λ 90μ λμΌν ν
λ, μ΄λμ λ νμ κ°μΆ μνμμ μ§ννλ κ²μ΄ μ’λ€.
μ΄λ μ¬μ©ν μ μλ κ²μ΄ μΆμ ν΄λμ€μ΄λ€.
μΆμ λ©μλ ?
μ μΈλΆλ§ μμ±νκ³ κ΅¬νλΆλ μμ±νμ§ μμ μ±λ‘ λ¨κ²¨ λ κ²μ΄ μΆμλ©μλμ΄λ€.
μΆμ λ©μλλ μμλ°λ ν΄λμ€μ λ°λΌ λ¬λΌμ§ μ μλ€.
μΆμ ν΄λμ€ κ·μΉ
- μΆμ ν΄λμ€λ ν€μλ
abstract
λ₯Ό λΆμ¬ νννλ€. μΆμ λ©μλλ₯Ό ν¬ν¨νμ§ μμ ν΄λμ€μμλabstract
λ₯Ό λΆμ¬μ μΆμ ν΄λμ€λ‘ μ§μ ν μλ μλ€. - ν΄λμ€λ₯Ό abstractλ‘ μ§μ νλ©΄
new
λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μ§μ μμ±ν μ μλ€. - λ©μλμ abstractλ₯Ό μ¬μ©ν κ²½μ° interfaceμ λ©μλμ κ°μ΄ ꡬν λΆλΆμ μλ€.
- abstractλ‘ μ μΈν λ©μλλ₯Ό μμ ν΄λμ€μμ λ°λμ ꡬνν΄μΌ νλ€. (μ€λ²λΌμ΄λ©) μ΄λ μμ ν΄λμ€μμ μΆμ λ©μλλ₯Ό λ°λμ ꡬννλλ‘ κ°μ νλ κ²μ΄λ€.
λ€μ μμ λ₯Ό 보면μ μΆμ ν΄λμ€μ λν΄ μμ보μ !
Exmaple
public abstract class Player {
boolean pause;
int currentPos;
public Player() {
this.pause = false;
this.currentPos = 0;
}
// μ§μ λ μμΉμμ μ¬μμ μμνλ κΈ°λ₯ μνλλλ‘ μμ±
abstract void play(int pos);
// μ¬μμ μ¦μ λ©μΆλ κΈ°λ₯μ μννλλ‘ μμ±
abstract void stop();
void pause() {
if (pause) {
pause = false;
play(currentPos);
} else {
pause = true;
stop();
}
}
}
Player μΆμ ν΄λμ€λ
VCRμ΄λ Audio κ°μ μ¬μμ΄ κ°λ₯ν κΈ°κΈ°μ λΆλͺ¨ ν΄λμ€κ° λ μ μλ€.
μ΄μ Player μΆμ ν΄λμ€λ₯Ό μμλ°λ CDPlayer ν΄λμ€λ₯Ό λ§λ€μ΄λ³΄μ π¨
public class CDPlayer extends Player {
@Override
void play(int pos) {
// ꡬν μλ΅
}
@Override
void stop() {
// ꡬν μλ΅
}
//CDPlayer ν΄λμ€μ μΆκ°λ‘ μ μλ λ©€λ²
int currentTrack;
void nextTrack() {
currentTrack++;
// ...
}
void preTrack() {
if (currentTrack > 1) {
currentTrack--;
}
// ...
}
}
λΆλͺ¨ ν΄λμ€μ μΆμλ©μλλ₯Ό CDPlayerμ λ§κ² μ€λ²λΌμ΄λ©ν΄μ£Όκ³ ,
CDPlayerλ§μ μλ‘μ΄ λ©€λ²λ€μ μΆκ°ν΄μ£Όμλ€.
μΈν°νμ΄μ€
κ°λ¨ν λ§νλ©΄β¦
μΈν°νμ΄μ€λ μΌμ’
μ μΆμ ν΄λμ€λ‘, μΆμ λ©μλλ₯Ό κ°μ§λ§
μΆμ ν΄λμ€λ³΄λ€ μΆμν μ λκ° λμ
μΆμ ν΄λμ€μ λ¬λ¦¬ λͺΈν΅μ κ°μΆ μΌλ° λ©μλ, λ©€λ² λ³μλ₯Ό ꡬμ±μμΌλ‘ κ°μ§ μ μλ€.
μΆμ ν΄λμ€λ₯Ό λ―Έμμ± μ€κ³λλΌ νλ©΄, μΈν°νμ΄μ€λ ꡬνλ κ²μ μ무 κ²λ μλ,
λ°κ·Έλ¦Όλ§ κ·Έλ €μ§ κΈ°λ³Έ μ€κ³λλΌκ³ ν μ μλ€.
μΈν°νμ΄μ€ κ·μΉ
- μΆμ ν΄λμ€μ²λΌ λΆμμ ν κ²μ΄κΈ° λλ¬Έμ κ·Έ μ체λ§μΌλ‘ μ¬μ©λκΈ° 보λ€, λ€λ₯Έ ν΄λμ€λ₯Ό μμ±νλλ° λμμ μ€ λͺ©μ μΌλ‘ μμ±λλ€.
- μΌλ° λ©μλ λλ λ©€λ² λ³μλ₯Ό ꡬμ±μμΌλ‘ κ°μ§ μ μλ€.
- λͺ¨λ λ©€λ² λ³μλ
public static final
μ΄μ΄ν νλ©°, μ΄λ₯Ό μλ΅ν μ μλ€. - λͺ¨λ λ©μλλ
public abtract
μ΄μ΄μΌ νλ©°, μ΄λ₯Ό μλ΅ν μ μλ€. (λ¨, JDK1.8λΆν° static λ©μλμ default λ©μλλ₯Ό μ¬μ©ν μ μλ€.)
π€ public static finalμ μ¬μ© λͺ©μ ?
μΈν°νμ΄μ€ λ³μλ μ무 μΈμ€ν΄μ€λ μ‘΄μ¬νμ§ μλ μμ μ΄κΈ° λλ¬Έμ μ€μ€λ‘ μ΄κΈ°ν λ κΆνμ΄ μλ€.
λλ¬Έμ public static final
λ₯Ό μ¬μ©ν΄ ꡬν κ°μ²΄μ κ°μ μνλ₯Ό 보μ₯νλ€.
μΈν°νμ΄μ€μ λ€μ€ μμ
μΈν°νμ΄μ€λ μΈν°νμ΄μ€λ‘λΆν°λ§ μμλ°μ μ μμΌλ©°,
ν΄λμ€μ λ¬λ¦¬ λ€μ€μμμ λ°λ κ²μ΄ κ°λ₯νλ€.
public interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Movable, Attackable {
}
ν΄λμ€μ μμκ³Ό λ§μ°¬κ°μ§λ‘ μμ μΈν°νμ΄μ€λ λΆλͺ¨ μΈν°νμ΄μ€μ μ μλ λ©€λ² λͺ¨λ μμλ°λλ€.
μΈν°νμ΄μ€κ° λ€μ€ μμμ΄ κ°λ₯ν μ΄μ λ?
μΈν°νμ΄μ€λ abstract λ©μλλ§μ κ°μ§κ³ μλλ°,
μ΄λ₯Ό μμν κ²½μ° μμνλ ν΄λμ€μμ 무쑰건 κ·Έ λ©μλλ₯Ό ꡬνν΄μ£Όμ΄μΌ νλλ°,
μ΄ κ²½μ° λ€μ€ μμνκ³ μλ μΈν°νμ΄μ€λ€μ λμΌν λ©μλκ° μ‘΄μ¬νλ€ νλλΌλ,
κ·Έ λ΄λΆ ꡬνμ μ μλμ§ μμμΌλ λ¬Έμ λ κ²μ΄ μκΈ° λλ¬Έμ΄ μλκΉ νλ€.
κ·Έλ°λ° μ΄μ μΈν°νμ΄μ€μμ default λ©μλλ₯Ό ꡬνν μ μλλ°
λκ°μ μΈν°νμ΄μ€λ₯Ό λ€μ€ μμνλ κ²½μ°,
μ΄ default λ©μλκ° μ€λ³΅μ΄ λλ©΄ μ΄λ»κ² λλκ±°μ§?
μ΄ μ§λ¬Έμ λν λ΅μ ν μ€νΈ ν΄λ³΄μλ€.
λμΌν printStatic()
μ κ°μ§ μΈν°νμ΄μ€ Cμ Bλ₯Ό μμνλ
μΈν°νμ΄μ€ Aλ printStatic()
λ₯Ό 무쑰건 μ€λ²λΌμ΄λ©νκ² λμ΄ μμλ€β¦
λ§μ½ μ€λ³΅ λ©μλκ° μμ κ²½μ° μ€λ²λΌμ΄λ©μ νμ§ μμλ μ»΄νμΌ μλ¬κ° λμ§ μλλ€.
π― Tip
μΈν°νμ΄μ€ λͺ
μ λλΆλΆ β~μ ν μ μλβμ μλ―ΈμΈ able
λ‘ λλλ κ²λ€μ΄ λ§λ€κ³ νλ€.
κ·Έ μ΄μ λ μ΄λ€ κΈ°λ₯ λλ νμλ₯Ό νλλ° νμν λ©μλλ₯Ό μ 곡νλ€λ μλ―Έλ₯Ό κ°μ‘°νκΈ° μν΄μλ€.
λλ¬Έμ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ β~λ₯Ό ν μ μλβ λ₯λ ₯μ κ°μΆμλ€λ μλ―Έμ΄κΈ°λ νλ€.
μΆμ ν΄λμ€ VS μΈν°νμ΄μ€
곡ν΅μ ?
λ¨Όμ μΆμ ν΄λμ€μ μΈν°νμ΄μ€μ 곡ν΅μ μ μ°Ύμ보μ.
μΆμ ν΄λμ€μ μΈν°νμ΄μ€ λ λ€ κ°μ§κ³ μλ μΆμ λ©μλλ₯Ό ꡬννλλ‘ κ°μ νλ€.
λ μΈμ€ν΄μ€νκ° λΆκ°λ₯νλ€.
κ·Έλ λ€λ©΄ μΆμ ν΄λμ€ μμ μνλ κ²λ§ μΆμ λ©μλλ₯Ό μ¬λ¬κ° λκ±°λ,
μ λΆ μΆμ λ©μλλ‘ λ§λ€λ©΄ λμ΄ μΆμ ν΄λμ€κ° μΈν°νμ΄μ€ μν μ ν μ μλ€.
λ§μ½ λͺ¨λ ν΄λμ€κ° μΈν°νμ΄μ€λ§ μ¬μ©ν΄μ ꡬννλ€λ©΄,
λͺ¨λ ν΄λμ€μμ 곡ν΅μΌλ‘ νμν κΈ°λ₯λ€μ κ°κ° μ€λ²λΌμ΄λ© νκ² λλ μ½λμ μ€λ³΅μ΄ λ°μνλ€.
λλ¬Έμ μ΄ κ³΅ν΅μΌλ‘ νμν κΈ°λ₯λ€μ λΆλͺ¨ ν΄λμ€μμ μΌλ° λ©μλλ‘ κ΅¬νν
μΆμν΄λμ€λ₯Ό μμ λ°μ μμ ν΄λμ€μμ μ¬μ©ν μ μλλ‘ νλ©΄ λ κ±°κ°μλ°β¦
μ μΈν°νμ΄μ€λ μ νμνκ±ΈκΉ? π€
μ κ·Όμ
μΈν°νμ΄μ€μμ λͺ¨λ λ³μλ public static final
,
λͺ¨λ λ©μλλ public abstract
μ΄λ€.
νμ§λ§ μΆμ ν΄λμ€μμλ static
μ΄λ final
μ΄ μλ νλλ₯Ό κ°μ§ μ μκ³ ,
public, protected, private
λͺ¨λ κ°μ§ μ μλ€.
κ°μΈμ μΈ μκ°μΌλ‘λ μΈν°νμ΄μ€λ§μ ꡬννλ©΄ public static final
λ§μ μ¬μ©ν΄
ꡬν κ°μ²΄μ κ°μ μνλ₯Ό 곡μ ν μ λ°μ μλλ°,
μΆμ ν΄λμ€λ static
μ΄λ final
μ΄ μλ νλλν κ°μ§ μ μκΈ° λλ¬Έμ
μΆμ ν΄λμ€λ₯Ό μμ λ°μ κ°μ²΄λ€μ΄ κ°μ μνλ₯Ό κ°μ§κ³ μμ μ μλ€.
λ€μ€ μμ μ¬λΆ
μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ λ€λ₯Έ μ¬λ¬κ° μΈν°νμ΄μ€λ₯Ό ν¨κ» ꡬνν μ μλ€.
νμ§λ§ μλ°μμλ λ€μ€ μμμ μ§μνμ§ μκΈ° λλ¬Έμ μ¬λ¬ μΆμ ν΄λμ€λ₯Ό μμν μ μλ€.
μ¬μ© μλ
λ¬Όλ‘ λ€μ€ μμ μ¬λΆμ μ°¨μ΄λ μμ§λ§ μ΄κ²μ΄ ν¬μΈνΈκ° μλλΌ,
μ΄μ λ°λ₯Έ μ¬μ© λͺ©μ μ΄ λ€λ₯΄λ€λ κ²μ ν¬μΈνΈλ₯Ό λ§μΆ°λ³΄μ.
μμμ λ§ν λ€μ€ μμ μ¬λΆμ λ°λΌ μΆμ ν΄λμ€μ μΈν°νμ΄μ€μ μ¬μ© μλ λν λ€λ₯΄λ€.
μΆμ ν΄λμ€λ μ΄λ₯Ό μμν κ° κ°μ²΄λ€μ 곡ν΅μ μ μ°Ύμ μΆμνμμΌ λμ κ²μΌλ‘,
μμ κ΄κ³λ₯Ό νκ³ μ¬λΌκ°μ λ κ°μ λΆλͺ¨ ν΄λμ€λ₯Ό μμνλ©°
λΆλͺ¨ ν΄λμ€κ° κ°μ§ κΈ°λ₯λ€μ ꡬνν΄μΌν κ²½μ° μ¬μ©νλ€.
μΈν°νμ΄μ€λ μμ κ΄κ³λ₯Ό νκ³ μ¬λΌκ°μ λ
λ€λ₯Έ μ‘°μ ν΄λμ€λ₯Ό μμνλλΌλ, κ°μ κΈ°λ₯μ΄ νμν κ²½μ° μ¬μ©νλ€.
ν΄λμ€μ λ³λλ‘ κ΅¬ν κ°μ²΄κ° κ°μ λμμ νλ€λ κ²μ 보μ₯νκΈ° μν΄ μ¬μ©νλ€.
Exmaple
μλμ κ°μ κ΄κ³λ₯Ό κ°λ μμ λ₯Ό μ΄ν΄λ³Έλ€.
μ μΌ λΆλͺ¨ ν΄λμ€μΈ Creatureμ μλ¬Όμ λν Abstract Classμ΄λ€.
κ° μλ¬Όμ ꡬλΆμ λ°λΌ Animal λλ Plantλ₯Ό μμνλ€.
κ·Έλ¦¬κ³ κ°κ°μ΄ ν μ μλ μΆκ°μ μΈ κΈ°λ₯λ€μ μΈν°νμ΄μ€λ‘ ꡬννλ€.
Animalμ μμλ°λ Amazzi(λ^^), Dog, Catμ Plantμ λ€λ₯΄κ²
bark(μ§λ€) ν μ μμΌλ Barkable μΈν°νμ΄μ€λ₯Ό ꡬννμλ€.
μ¬κΈ°μ λμ¬κ²¨ λ³Ό κ²μ λ°λ‘ EatableμΈλ°,
Eatable μΈν°νμ΄μ€λ νμ¬ μμ κ΄κ³κ° λ€λ₯Έ Amazzi(λ^^), Dog, Cat, FlyHellPlantμκ²
곡ν΅μ μΈ κΈ°λ₯μΈ Eat κΈ°λ₯μ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν¨μΌλ‘ κ°μ κΈ°λ₯μ ꡬννλλ‘ κ°μ νκ³ μλ€.
κ·Έλ¬λ©΄ κ²°κ΅ μ΄ 4κ°μ§ ν΄λμ€ λͺ¨λ μλ¬Ό ν΄λμ€λ₯Ό μμνκ³ μλλ°,
μλ¬Ό ν΄λμ€μ eatμ΄λΌλ μΆμ λ©μλλ₯Ό λ§λ€λ©΄ μλλκ°?λΌκ³ μκ°ν μ μμ§λ§
Plantλ₯Ό μμλ°μ Roseλ eat λ©μλλ₯Ό κ°μ§ μ μλ€.
κ·Έλ¬λ©΄ μ΄λ»κ²νμ§ π€·ββοΈ
μ΄λ λ°λ‘ μΈν°νμ΄μ€λ‘ λ°λ‘ μ μΈμ ν΄μ£Όμ΄ κ°κ° eatμ ν μ μλ
ν΄λμ€μ implementsν΄μ£Όμ΄ λ§λ€μ΄ μ£Όλ©΄ κ°λ
μ±μ΄ μ¬λΌκ°λ©° μ μ§λ³΄μ λν μ¬μμ§λ€.
κ°κ°μ μ μ ν μ¬μ© μΌμ΄μ€ μ 리
μΆμ ν΄λμ€
- κ΄λ ¨μ±μ΄ λμ ν΄λμ€ κ°μ μ½λλ₯Ό 곡μ νκ³ μΆμ κ²½μ°
- μΆμ ν΄λμ€λ₯Ό μμ λ°μ ν΄λμ€λ€μ΄ 곡ν΅μΌλ‘ κ°μ§λ λ©μλμ νλκ° λ§κ±°λ, publicμ΄μΈμ μ κ·Όμ(protected, private) μ μΈμ΄ νμν κ²½μ°
- non-static, non-final νλ μ μΈμ΄ νμν κ²½μ° (κ° μΈμ€ν΄μ€μμ μν λ³κ²½μ μν λ©μλκ° νμν κ²½μ°)
μΈν°νμ΄μ€
- μλ‘ κ΄λ ¨μ±μ΄ μλ ν΄λμ€λ€μ΄ μΈν°νμ΄μ€λ₯Ό ꡬννκ² λλ κ²½μ°. ex) Comparable, Cloneable μΈν°νμ΄μ€λ μ¬λ¬ ν΄λμ€λ€μμ ꡬνλλλ°, ꡬνν΄λμ€λ€ κ°μ κ΄λ ¨μ±μ΄ μλ€.
- νΉμ λ°μ΄ν° νμ μ νλμ λͺ μνκ³ μΆμλ°, μ΄λμ κ·Έ νλμ΄ κ΅¬νλλμ§λ μ κ²½μ°μ§ μλ κ²½μ°.
- λ€μ€μμμ νμ©νκ³ μΆμ κ²½μ°
μ°Έκ³ μλ£
- [[JAVA] μΆμν΄λμ€ VS μΈν°νμ΄μ€ μ μ¬μ©ν κΉ? μ°¨μ΄μ , μμ λ‘ νμΈ :: λ§μ΄μλͺ½](