Day 15(21.09.27) - Gomserker/Java-101 GitHub Wiki
22. μΆμ ν΄λμ€(Abstract Class)
(1) μΆμ ν΄λμ€λ 무μμΈκ°?
μΆμ ν΄λμ€λ 무μμΈκ°λ₯Ό μκΈ°νκΈ° μ μ μ΄ μ§λ¬Έμ λν΄ μκ°ν΄ 보μ. "μλμ°¨λ 무μμΈκ°?". κ΅μ₯ν "μΆμμ "μ΄μ§ μμκ°? μ°λ¦¬κ° νν μλμ°¨λΌκ³ λΆλ₯΄λ κ²μλ μΈλ¨, νΈλ, 컨λ²ν°λΈ λ±μ μ°¨μ’
μ΄ μλ€. μ¬κΈ°μ μ΄λ¬ν μ°¨μ’
λ€μ μλμ°¨λΌλ κ°λ
μ΄ μ§λ 곡ν΅μ μΈ νΉμ±μ κ°μ§κ³ ꡬ체μ μΈ ννλ‘ λλ¬λκ² λ κ²μ΄λ€.
μ΄μ λ§μ°¬κ°μ§λ‘ λ§μ°¬κ°μ§λ‘ κ°μ²΄ μ§ν₯ κ°λ°μμμ ν΄λμ€μμλ μΆμ ν΄λμ€λΌλ κ²μ΄ μ‘΄μ¬νλ€. κ°μ²΄λ₯Ό μ§μ μμ±ν μ μλ ν΄λμ€λ₯Ό μ€μ²΄ ν΄λμ€λΌκ³ νλ€λ©΄ μ΄λ€μ 곡ν΅λλ νΉμ±μ μΆμΆν΄μ μ μΈν ν΄λμ€λ₯Ό μΆμ(Abstract) ν΄λμ€λΌκ³ νλ€. λ
Όλ¦¬μ κ΄κ³λ₯Ό μκ°νμλ, μ΄λ¬ν μΆμ ν΄λμ€μ μ€μ²΄ ν΄λμ€λ μμ κ΄κ³λ₯Ό κ°μ§κ³ μλ€λ κ²μ μ μ μλ€. μ¦, μ€μ²΄ ν΄λμ€κ° μΆμ ν΄λμ€λ₯Ό μμ λ°μ, μΆμ ν΄λμ€μ λͺ¨λ νΉμ±μ λ¬Όλ €λ°κ³ (μμ), μΆκ°μ μΈ νΉμ±μ κ°μ§ μ μκ² λλ κ²μ΄λ€.(μ€λ²λΌμ΄λ). μμ μλμ°¨ μ΄μΌκΈ°λ‘ μκ°μ ν΄λ³΄λ©΄, μ€ν¬μΈ μΉ΄, νΈλ, νμ λ±μ΄ μ€μ²΄ ν΄λμ€μ΄κ³ , μλμ°¨λΌλ ν¬κ΄μ μΈ κ°λ
μ΄ μΆμ ν΄λμ€κ° λλ©°, μ€μ²΄ ν΄λμ€κ° μ§λ 곡ν΅μ μΈ μμλ₯Ό μΆμ ν΄λμ€μμ μμλ°μ μ¬μ©ν μ μκ² λλ κ²μ΄λΌκ³ 보면 λλ€.
λ¬Όλ‘ μΆμ ν΄λμ€μ κΈ°λ³Έμ μΈ λΆλͺ¨ ν΄λμ€ μν μ μ°¨μ΄λ, μΆμ ν΄λμ€λ λ¬Έμ κ·Έλλ‘ μΆμμ μΈ κ°λ
μ λ΄κ³ μκΈ° λλ¬Έμ κ·Έ μ€μ²΄κ° λ΄κ²¨ μμ§ μλ€. λ€μ λ§ν΄μ, μ€μ²΄κ° λλ κ°μ²΄λ₯Ό μμ±ν μ μκ²λλ©°, new μ°μ°μλ₯Ό μ¬μ©ν μΈμ€ν΄μ€ μμ±μ΄ λΆκ°λ₯νλ€. λλ¬Έμ μΆμ ν΄λμ€λ μ€μ²΄ ν΄λμ€λ₯Ό λ§λ€κΈ° μν λΆλͺ¨ ν΄λμ€μ μν μΈμλ ν μ μλ€. μμ κ΄κ³ μ μΈ μ½λλ‘ μ΄ν΄λ³΄μλ©΄ ~ extends λ€μλ§ μ¬ μ μλ ν΄λμ€λΌλ λ»μ΄λ€.
class Taxi extends Car (O)
class Cat extends Pet (O)
class Rifle extends Weapon (O)
μ μμμμ Carμ Pet, Weaponμ΄ ν΄λΉλκ² λ€.
(2) μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ μ΄μ
μ€μ²΄ ν΄λμ€λ€μ 곡ν΅λ νλμ λ©μλμ μ΄λ¦μ ν΅μΌνλ €κ³
μ€μ²΄ ν΄λμ€λ€μ 곡ν΅μ μΈ νΉμ±(νλ, λ©μλ)μ λ½μλ΄μ΄ μΆμ ν΄λμ€λ‘ λ§λλ μ΄μ λ ν¬κ² λ κ°μ§ μ΄μ κ° μλ€. κ·Έμ€ νλλ λ°λ‘ 곡ν΅λ νλμ λ©μλμ μ΄λ¦μ ν΅μΌνκΈ° μν¨μ΄λ€. μλ₯Ό λ€μ΄, 컨λ²ν°λΈμ μμ μ£Όλ₯Ό ownerλΌκ³ νκ³ , μλμ κ±°λ λͺ λ Ήμ turnOn()μ΄λΌκ³ νμλ, νμμ μμ μ£Όλ₯Ό driverλΌκ³ νκ³ , μλμ κ±°λ λͺ λ Ήμ΄κ° start()λΌκ³ νμ. 곡ν΅λ νΉμ§μ΄μ§λ§ νλλͺ κ³Ό λ©μλμ μ΄λ¦μ΄ μ κ°κ°μΈ κ²½μ°μΈλ°, μ΄λ΄λ CarλΌλ μΆμ ν΄λμ€μ μμ μ£Όλ₯Ό owner, μλμ κ±°λ λͺ λ Ήμ΄λ₯Ό turnOn()μ΄λΌκ³ μ μΈνκ² λλ€λ©΄, κ° μ€μ²΄ ν΄λμ€λ μ΄λ₯Ό μμλ°μ μ¬μ©ν¨μΌλ‘μ¨ νλμ λ©μλμ μ΄λ¦μ ν΅μΌν μ μλ€.
μ€μ²΄ ν΄λμ€λ₯Ό μμ±ν λ μκ°μ μ μ½
μ΄λ μμκ³Ό λμΌν μ΄μ μ΄λ€. νλͺ©μ μμ μ£ΌλΌλ νλ κ°κ³Ό, μλμ 건λ€λ λͺ λ Ή, λ©μλκ° μΆμ ν΄λμ€μμ λͺ¨λ μ μΈν΄λκΈ° λλ¬Έμ μ€μ²΄ ν΄λμ€λ₯Ό μμ±νλλ° μκ°μ μ μ½ν μ μλ€. μ΄λ λ€λ₯Έ κΈ°λ₯μ μΆκ°νλ€κ±°λ ν λλ§ μ¬μ μ ν΄μ μ¬μ©νλ©΄ λκΈ°λ νκ³ , νΉμ λ€λ₯Έ νλ‘κ·Έλλ¨Έμ κ°μ΄ μμ μ ν λ, μΆμ ν΄λμ€ νλλ§ νμΈν΄λ νλμ λ©μλμ μ μλ₯Ό νμΈν μ μκ² ν¨μΌλ‘μ¨ μμ μ 체μ ν¨μ¨μ μ¬λ¦¬λλ° κΈ°μ¬ν μ μκ² λλ€.
(3) μΆμ ν΄λμ€ μ μΈ
μΆμ ν΄λμ€λ₯Ό μ μΈν λμλ ν΄λμ€λ₯Ό μ μΈν λ abstract ν€μλλ₯Ό λΆμΈλ€. μμμ λ§νλ― abstractλ₯Ό λΆμ΄λ©΄ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μκ² λλ―λ‘ new μ°μ°μλ₯Ό μ¬μ©ν μ μκ³ μμ λ°μ μμ ν΄λμ€λ₯Ό ν΅ν΄μλ§ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
public abstract class ν΄λμ€λͺ
{
//field
//constructor
//method
}
(4) μΆμ λ©μλμ μ€λ²λΌμ΄λ©
μλ μμλ μΆμ λ©μλμ μΆμ λ©μλμ μ€λ²λΌμ΄λ©μ κ΄λ ¨λ μμμ΄λ€.
public class HeroTest {
public static void main(String[] args) {
//μμ
-> κ΅μ₯ν μΆμμ μΈ κ°λ
//μνΌλ§¨
SuperMan superman = new SuperMan("μνΌλ§¨");
superman.attack();
//μμ΄μΈλ§¨
IronMan ironman = new IronMan("μμ΄μΈλ§¨");
ironman.attack();
//νν¬
Hulk hulk = new Hulk("νν¬");
hulk.attack();
}
}
public abstract class Hero {
String name;
public Hero() {}
public Hero(String name) {
super();
this.name = name;
}
abstract void attack();
}
class SuperMan extends Hero{
public SuperMan() {}
public SuperMan(String name) {
super(name);
}
@Override
void attack() {
System.out.println("Attack with Eyeball laserbeam");
}
}
class IronMan extends Hero{
public IronMan() {}
public IronMan(String name) {
super(name);
}
@Override
void attack() {
System.out.println("Attack with Hand laserbeam");
}
}
class Hulk extends Hero{
public Hulk() {}
public Hulk(String name) {
super(name);
}
@Override
void attack() {
System.out.println("Beat the shit out of them");
}
}
μμμ μΆμ ν΄λμ€λ μ€μ²΄ ν΄λμ€κ° 곡ν΅μ μΌλ‘ κ°μ ΈμΌ ν νλμ λ©μλλ€μ μ μν΄ λμ μΆμμ μΈ ν΄λμ€λΌκ³ μ μνλ€. λ§μ½ λͺ¨λ μ€μ²΄λ€μ΄ λκ°μ νλμ νκ³ , λκ°μ κΈ°λ₯λ§ νλ€λ©΄ μΆμ ν΄λμ€μ μ μν΄ λμ λ©μλλ‘ λͺ¨λ κ²μ ν λ²μ μ²λ¦¬ν μ μμ κ²μ΄λ€. νμ§λ§ μ€μ λ‘λ "λλ¬Ό"μ΄λΌλ μΆμ ν΄λμ€κ° μλ€κ³ ν λ, κ°κ° μ°λ μ리μ κ³ μμ΄κ° μ°λ μλ¦¬κ° λ€λ₯΄λ―, μ€ν λ΄μ©μ΄ μ€μ²΄ ν΄λμ€λ§λ€ λ¬λΌμΌ νλ κ²½μ°κ° λ°μνλ€. μ΄λ΄λλ κ° μ€μ²΄ ν΄λμ€μμ λ©μλλ₯Ό μ¬μ μν΄μ μ¬μ©ν΄μΌνλ€. μΆμ ν΄λμ€μ μΆμ λ©μλλ μΌλ°μ μΈ λ©μλμ ννμ μ‘°κΈ λ€λ₯Έλ°, μ μΈλΆλ§ μκ³ λ©μλμ μ€ν λ΄μ©μΈ μ€κ΄νΈκ° μλ€.
abstract void attack();
// μ κ·Όμ μ΄μ abstract 리ν΄νμ
λ©μλλͺ
(νλΌλ―Έν°1, νλΌλ―Έν°2, ...);
λ³΄ν΅ μΆμ ν΄λμ€λ₯Ό μ€κ³ν λ, νμ ν΄λμ€κ° λ°λμ μ€ννμΌλ©΄ νλ μ€ν λ΄μ©μ μ±μ°λλ‘ κ°μνκ³ μΆμλ ν΄λΉ λ©μλλ₯Ό μΆμ λ©μλλ‘ μ μΈνλ€. κ·Έλ¦¬κ³ μμ ν΄λμ€λ ν΄λΉ λ©μλλ₯Ό μ¬μ μ ν΄μ μ¬μ©ν΄μΌ νλ€. λ§μ½ κ·Έλ¬μ§ μμΌλ©΄ μ»΄νμΌ μλ¬κ° λλ€. κ·Έλ¬λ λͺ¨λ λΆλͺ¨λμ΄ νλ λ§μ μ λ£μ. μλλ©΄ λ±μ§ λ§λλ€.