1. μΆμ ν΄λμ€(Abstract Class)λ 무μμΈκ°?
μΆμ ν΄λμ€(Abstract Class)λ μλ°μμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μν΄ μ 곡λλ ν΄λμ€ νμ μ€ νλλ‘, μ€μ ꡬνλμ§ μμ μΆμ λ©μλ(abstract method)λ₯Ό ν¬ν¨νκ³ μλ ν΄λμ€μ λλ€. μΆμ ν΄λμ€λ λ€λ₯Έ ν΄λμ€λ€μ 곡ν΅μ μΈ νΉμ§κ³Ό λμμ μ μνκΈ° μν΄ μ¬μ©λ©λλ€.
μΆμ ν΄λμ€λ μμ ν ν΄λμ€(Concrete Class)μ λ¬λ¦¬, λ€μκ³Ό κ°μ λͺ κ°μ§ νΉμ§μ κ°μ§κ³ μμ΅λλ€.
- μΆμ ν΄λμ€λ
abstract
ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈλ©λλ€. - μΆμ ν΄λμ€λ μ§μ μ μΌλ‘ κ°μ²΄λ₯Ό μμ±ν μ μμΌλ©°, μμμ ν΅ν΄ μ¬μ©λ©λλ€.
- μΆμ ν΄λμ€λ μΌλ° λ©μλμ μΆμ λ©μλλ₯Ό λͺ¨λ κ°μ§ μ μμ΅λλ€.
- μΆμ ν΄λμ€λ μμλ°μ ν΄λμ€λ€μκ² μΆμ λ©μλλ₯Ό ꡬννλλ‘ κ°μν μ μμ΅λλ€.
- μΆμ ν΄λμ€λ μμλλ ν΄λμ€λ€ κ°μ μΌκ΄μ±μ μ μ§νκ³ , μ½λμ μ¬μ¬μ©μ±μ λμΌ μ μμ΅λλ€.
μΆμ ν΄λμ€μ μ£Όμ λͺ©μ μ κ·μ½(Contract)μ μ μνλ κ²μΌλ‘, νΉμ μ’ λ₯μ κ°μ²΄λ ν΄λμ€λ€μ΄ μ€μν΄μΌ νλ νΉμ±μ΄λ λμμ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ μ¬ν κΈ°λ₯μ νλ λ€μν ν΄λμ€λ€μ΄ μΆμ ν΄λμ€λ₯Ό μμν΄μ κ³΅ν΅ λΆλΆμ μ¬μ¬μ©νλ©΄μλ λ€μν ꡬνμ μ 곡ν μ μμ΅λλ€. μΆμ ν΄λμ€λ μΈν°νμ΄μ€μ λ§μ°¬κ°μ§λ‘ λ€νμ±(Polymorphism)μ κ°λ μ ꡬννκΈ° μν΄ μ¬μ©λ μ μμ΅λλ€.
2. μΆμ ν΄λμ€μ μ μΈ λ°©λ²κ³Ό νΉμ§
μΆμ ν΄λμ€λ₯Ό μ μΈνκΈ° μν΄μλ λ€μκ³Ό κ°μ λ¨κ³λ₯Ό λ°λΌμΌ ν©λλ€.
public abstract class AbstractClassName {
// μΆμ λ©μλ λ° μΌλ° λ©μλ μ μ
// μΆμ λ©μλ μ μΈ
public abstract void abstractMethod();
// μΌλ° λ©μλ μ μ
public void regularMethod() {
// λ©μλ λ΄μ©
}
}
μμ μμ μμλ μΆμ ν΄λμ€μΈ AbstractClassName
μ μ μΈνμμ΅λλ€. μΆμ ν΄λμ€λ₯Ό μ μΈνκΈ° μν΄μλ ν΄λμ€ μ΄λ¦ μμ abstract
ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ©°, ν΄λμ€ λ΄μ μΆμ λ©μλμ μΌλ° λ©μλλ₯Ό μ μν μ μμ΅λλ€.
μΆμ ν΄λμ€μ μ£Όμ νΉμ§μ λ€μκ³Ό κ°μ΅λλ€.
- μΆμ ν΄λμ€λ
abstract
ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈλ©λλ€. - μΆμ ν΄λμ€λ μΌλ° λ©μλμ μΆμ λ©μλλ₯Ό λͺ¨λ κ°μ§ μ μμ΅λλ€.
- μΆμ λ©μλλ μ μΈλ§ νκ³ κ΅¬νμ νμ§ μμ΅λλ€.
- μΆμ ν΄λμ€λ μ§μ μ μΌλ‘ κ°μ²΄λ₯Ό μμ±ν μ μμΌλ©°, μμμ ν΅ν΄ μ¬μ©λ©λλ€.
- μΆμ ν΄λμ€λ₯Ό μμ λ°μ μλΈ ν΄λμ€λ λͺ¨λ μΆμ λ©μλλ₯Ό λ°λμ ꡬνν΄μΌ ν©λλ€.
- μΆμ ν΄λμ€λ μΈν°νμ΄μ€μ λ§μ°¬κ°μ§λ‘ λ€νμ±(Polymorphism)μ ꡬνν μ μμ΅λλ€.
- μΆμ ν΄λμ€λ₯Ό μμλ°μ μλΈ ν΄λμ€λ₯Ό λ§λ€λ©΄, μΆμ ν΄λμ€μ λ©μλλ₯Ό μ¬μ¬μ©νλ©° μΆκ°μ μΈ κΈ°λ₯μ ꡬνν μ μμ΅λλ€.
3. μΆμ ν΄λμ€μ μμκ³Ό ꡬν λ°©λ²
μΆμ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μκ² κ³΅ν΅μ μΈ νΉμ§κ³Ό λμμ μμνκΈ° μν΄ μ¬μ©λ©λλ€. μΆμ ν΄λμ€λ₯Ό μμλ°λ ν΄λμ€λ€μ μΆμ ν΄λμ€μ μΆμ λ©μλλ₯Ό ꡬννκ³ μΆκ°μ μΈ κΈ°λ₯μ ꡬνν μ μμ΅λλ€.
public abstract class AbstractClassName {
// μΆμ λ©μλ μ μΈ
public abstract void abstractMethod();
// μΌλ° λ©μλ μ μ
public void regularMethod() {
// λ©μλ λ΄μ©
}
}
μμ μμ μμ AbstractClassName
μ μΆμ ν΄λμ€μ
λλ€. μ΄ μΆμ ν΄λμ€λ₯Ό μμλ°λ μλΈ ν΄λμ€λ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€.
public class SubClassName extends AbstractClassName {
// μΆμ λ©μλ ꡬν
public void abstractMethod() {
// λ©μλ λ΄μ© ꡬν
}
// μΆκ°μ μΈ κΈ°λ₯ ꡬν
public void additionalMethod() {
// λ©μλ λ΄μ© ꡬν
}
}
μμ μμ μμ SubClassName
μ AbstractClassName
μ μμλ°λ ν΄λμ€μ
λλ€. μμμ λ°μ λμλ extends
ν€μλλ₯Ό μ¬μ©ν©λλ€. μ΄λ κ² μμλ°μ μλΈ ν΄λμ€λ μΆμ ν΄λμ€μ μΆμ λ©μλμΈ abstractMethod()
λ₯Ό λ°λμ ꡬνν΄μΌ ν©λλ€. λν, μΆκ°μ μΈ κΈ°λ₯μ μν΄ μλΈ ν΄λμ€μμλ μΌλ° λ©μλλ₯Ό ꡬνν μλ μμ΅λλ€.
μΆμ ν΄λμ€λ₯Ό μμλ°μ μλΈ ν΄λμ€λ μΆμ ν΄λμ€μ λ©μλλ₯Ό μμνλ©°, μΆκ°μ μΈ κΈ°λ₯μ ꡬνν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μμ κ΄κ³μ ν΄λμ€λ€ κ°μ μΌκ΄μ±μ μ μ§νλ©΄μλ κ°λ³μ μΈ κ΅¬νμ μ 곡ν μ μμ΅λλ€. μΆμ ν΄λμ€λ₯Ό μ¬μ©ν¨μΌλ‘μ¨ μ½λμ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ λμΌ μ μμ΅λλ€.
4. μΆμ λ©μλ(Abstract Method)μ μ¬μ©λ²κ³Ό μ€μμ±
μΆμ λ©μλλ μΆμ ν΄λμ€λ μΈν°νμ΄μ€μμ μ μΈλλ©°, μ€μ ꡬν λ΄μ©μ΄ μλ λ©μλμ λλ€. μΆμ λ©μλλ μ μΈλ§μ νκ³ μ€μ λ΄μ©μ΄λ ꡬνλΆλ νμ ν΄λμ€μμ μ¬μ μ(μ€λ²λΌμ΄λ©)λμ΄μΌ ν©λλ€.
public abstract class AbstractClassName {
// μΆμ λ©μλ μ μΈ
public abstract void abstractMethod();
}
μμ μμ μμ AbstractClassName
μ μΆμ ν΄λμ€μ΄λ©°, abstractMethod
λ μΆμ λ©μλμ
λλ€. μΆμ λ©μλλ abstract
ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈλλ©°, λ©μλμ λͺΈμ²΄ λΆλΆμ μμ±νμ§ μμ΅λλ€. μ΄λ κ² μΆμ λ©μλλ₯Ό μ μνλ©΄ νμ ν΄λμ€μμ λ°λμ ν΄λΉ λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€.
μΆμ λ©μλμ μ¬μ©λ²κ³Ό μ€μμ±μ λ€μκ³Ό κ°μ΅λλ€.
- μΆμ λ©μλλ₯Ό μ¬μ©νμ¬ νμ ν΄λμ€μμ ν΄λΉ λ©μλλ₯Ό λ°λμ ꡬννλλ‘ κ°μ ν μ μμ΅λλ€.
- μΆμ λ©μλλ μμ λ°μ ν΄λμ€μμ λ©μλμ ꡬ체μ μΈ λμμ μ μν μ μκ² ν©λλ€.
- μΆμ λ©μλλ₯Ό ν΅ν΄ λ€νμ±(Polymorphism)μ ꡬνν μ μμ΅λλ€. μΆμ ν΄λμ€λ μΈν°νμ΄μ€ νμ μΌλ‘ λ³μλ₯Ό μ μΈνκ³ , μ΄λ₯Ό ꡬνν μ¬λ¬ ν΄λμ€μ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μμ΅λλ€. μ΄λ κ² ν¨μΌλ‘μ¨ μ μ°νκ³ νμ₯μ± μλ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
- μΆμ λ©μλλ μμμ ν΅ν΄ μ½λμ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ λμ¬μ€λλ€. νμ ν΄λμ€μμ μΆμ λ©μλλ₯Ό ꡬνν¨μΌλ‘μ¨ κ³΅ν΅μ μΈ λμμ μμ ν΄λμ€μ ꡬννλ λ°λ©΄, κ°λ³ ν΄λμ€μμλ μΆκ°μ μΈ κΈ°λ₯μ ꡬνν μ μμ΅λλ€.
μΆμ λ©μλλ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ μ€ νλλ‘, μμκ³Ό λ€νμ±μ ꡬννλ λ° μμ΄μ λ§€μ° μ€μν©λλ€. μΆμ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄μ μΆμ λ©μλλ₯Ό μ νμ©νμ¬ μ μ°νκ³ νμ₯μ± μλ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
5. μΆμ ν΄λμ€μ μμ λ₯Ό ν΅ν μ€μ΅κ³Ό νμ© λ°©λ²
λ€μ μμ λ₯Ό ν΅ν΄ μΆμ ν΄λμ€μ μ€μ΅κ³Ό νμ© λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
// μΆμ ν΄λμ€
abstract class Animal {
// μΆμ λ©μλ
public abstract void sound();
// μΌλ° λ©μλ
public void sleep() {
System.out.println("μΏ¨μΏ¨~");
}
}
// μΆμ ν΄λμ€λ₯Ό μμλ°μ μλΈ ν΄λμ€
class Dog extends Animal {
// μΆμ λ©μλ ꡬν
public void sound() {
System.out.println("λ©λ©!");
}
}
class Cat extends Animal {
// μΆμ λ©μλ ꡬν
public void sound() {
System.out.println("μΌμΉ!");
}
}
μμ μμ μμ Animal
μ μΆμ ν΄λμ€μ΄λ©°, sound()
λ μΆμ λ©μλμ
λλ€. Dog
μ Cat
μ Animal
μ μμλ°λ μλΈ ν΄λμ€μ
λλ€. μ΄ μμ μμλ λλ¬Όμ μ리λ₯Ό μΆλ ₯νλ μΆμ λ©μλλ₯Ό μμλ°μ μλΈ ν΄λμ€λ€μ΄ μ€μ λ‘ μ΄λ»κ² λμνλμ§ νμΈν΄λ³΄κ² μ΅λλ€.
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // "λ©λ©!" μΆλ ₯
dog.sleep(); // "μΏ¨μΏ¨~" μΆλ ₯
Cat cat = new Cat();
cat.sound(); // "μΌμΉ!" μΆλ ₯
cat.sleep(); // "μΏ¨μΏ¨~" μΆλ ₯
}
}
μΆλ ₯κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€.
λ©λ©!
μΏ¨μΏ¨~
μΌμΉ!
μΏ¨μΏ¨~
μμ μμ μμ Dog
μ Cat
ν΄λμ€λ Animal
μΆμ ν΄λμ€λ₯Ό μμλ°μ ν΄λΉ μΆμ ν΄λμ€μ μΆμ λ©μλμΈ sound()
λ₯Ό ꡬννμ΅λλ€. λν, μΌλ° λ©μλμΈ sleep()
λ μΆμ ν΄λμ€μμ μ΄λ―Έ ꡬνλμ΄ μκΈ° λλ¬Έμ μΆκ°μ μΈ κ΅¬νμ΄ νμνμ§ μμμ΅λλ€.
μ΄μ²λΌ μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ 곡ν΅μ μΈ λμμ μμλ°λ ν΄λμ€λ€μ΄ μ½λλ₯Ό μ¬μ¬μ©νλ©°, μΆκ°μ μΈ κΈ°λ₯μ ꡬνν μ μμ΅λλ€. λν, λ€νμ±μ ν΅ν΄ μΆμ ν΄λμ€λ μΈν°νμ΄μ€ νμ μΌλ‘ λ³μλ₯Ό μ μΈνκ³ μ΄λ₯Ό ꡬνν μ¬λ¬ ν΄λμ€μ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μμ΅λλ€. μ΄λ¬ν μ μ°μ±κ³Ό νμ₯μ±μ ν΅ν΄ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ μ μ©νκ² νμ©ν μ μμ΅λλ€.
λκΈ