π μΆμ
μ¬μ μ μλ―Έμ μΆμ(abstract)μ μ€μ²΄ κ°μ 곡ν΅λλ νΉμ±μ μΆμΆν κ²
μΆμ ν΄λμ€
κ°μ²΄λ₯Ό μμ±ν μ μλ ν΄λμ€λ₯Ό μ€μ²΄ ν΄λμ€λΌκ³ νλ€λ©΄,
μ΄λ° ν΄λμ€λ€μ 곡ν΅μ μΈ `νλ`λ `λ©μλ`λ₯Ό μΆμΆν΄μ μ μΈν ν΄λμ€λ₯Ό μΆμ ν΄λμ€λΌκ³ ν¨
μμ
μ, κ³€μΆ©, λ¬Όκ³ κΈ°λ λλ¬Όμ΄λΌλ 곡ν΅μ μΈ νΉμ±μ κ°μ§
μ€μ²΄ ν΄λμ€ = μ, κ³€μΆ©, λ¬Όκ³ κΈ°
μΆμ ν΄λμ€ = λλ¬Ό
μΆμ ν΄λμ€λ `new μ°μ°μ`λ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μ§μ μμ±ν μ μλ€.
μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ μ΄μ β
1. κ³΅ν΅ κΈ°λ₯μ λ¬Άμ΄μ μ½λ μ€λ³΅ λ°©μ§
- μ¬λ¬ μμ ν΄λμ€μ 곡ν΅λ νλλ λ©μλλ₯Ό μΆμ ν΄λμ€μ μ μν΄μ, μ½λμ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ λμΌ μ μμ.
abstract class Animal {
String name;
void breathe() {
System.out.println("μ¨μ μ°λ€");
}
abstract void sound(); // κ³΅ν΅ κΈ°λ₯μ΄μ§λ§ λμ λ°©μμ λ€λ¦
}
→ breathe()λ λͺ¨λ λλ¬Όμ΄ κ³΅μ νλκΉ μΆμ ν΄λμ€μμ ꡬν,
→ sound()λ λλ¬Όλ§λ€ λ€λ₯΄λκΉ μΆμ λ©μλλ‘ μ μΈν΄μ μμμ΄ κ΅¬ννκ² ν¨.
2. μμ ν΄λμ€κ° λ°λμ ꡬνν΄μΌ ν λ©μλ κ°μ
- μΆμ λ©μλλ₯Ό μ μΈνλ©΄, μμ ν΄λμ€λ κ·Έ λ©μλλ₯Ό λ°λμ μ€λ²λΌμ΄λ©ν΄μΌ ν΄.
→ ν΅μΌλ μΈν°νμ΄μ€ μ κ³΅μ΄ κ°λ₯ν΄μ§κ³ , μ€μλ‘ λΉ λ¨λ¦΄ κ±±μ μ΄ μμ΄μ§.
abstract class Animal {
abstract void sound(); // 무쑰건 μ€λ²λΌμ΄λ©ν΄μΌ ν¨
}
3. κ°μ²΄ μμ±μ λ§κ³ μ€κ³ μ©λλ‘λ§ μ¬μ©
- μΆμ ν΄λμ€λ μ§μ κ°μ²΄λ‘ λ§λ€ μ μμ → μ€μ§ `μμ μ μ©`
- μ¦, μ€κ³λμ²λΌ "κ³΅ν΅ κ·κ²©"λ§ μ 곡νκ³ , μ€μ λμμ μμμ΄ μ±μλ£λ ꡬ쑰
Animal a = new Animal(); // β μλ¬! μΆμ ν΄λμ€λ μΈμ€ν΄μ€ν λΆκ°
4. μΈν°νμ΄μ€λ³΄λ€ μ μ°ν μ νμ§
- μλ°λ λ€μ€ μμμ΄ μ λλκΉ, ν΄λμ€λ νλλ°μ μμ λͺ» ν¨.
- νμ§λ§ μΈν°νμ΄μ€λ λ€μ€ ꡬνμ΄ κ°λ₯νκ³ , μΆμ ν΄λμ€λ μμλ§ κ°λ₯ν¨.
- μΆμ ν΄λμ€λ νλ, μμ±μ, μΌλ° λ©μλκΉμ§ ν¬ν¨ν μ μμ΄μ, κ³΅ν΅ κ΅¬ν λ‘μ§μ΄ λ§μ κ²½μ° μΈν°νμ΄μ€λ³΄λ€ μ 리ν¨.
λͺ©μ | μ€λͺ |
κ³΅ν΅ κΈ°λ₯ μ μ | μμ ν΄λμ€μ 곡ν΅λ μ½λ λ¬ΆκΈ° |
λ©μλ ꡬν κ°μ | μμ ν΄λμ€κ° λ°λμ μ€λ²λΌμ΄λ©νκ² ν¨ |
μ€κ³μ© ν΄λμ€ | μ§μ κ°μ²΄ μμ± λ°©μ§, μ€κ³λλ‘λ§ μ¬μ© |
μΈν°νμ΄μ€λ³΄λ€ μ€μ©μ μΈ κ²½μ° | νλλ ꡬν λ©μλκ° νμν κ²½μ° λ μ ν© |
Q. μΆμ ν΄λμ€κ° μΆμ ν΄λμ€λ₯Ό μμν μ μμκΉ?
A. μΆμ ν΄λμ€λ λ€λ₯Έ μΆμ ν΄λμ€λ₯Ό μμν μ μμ
μ μΆμ ν΄λμ€κ° μΆμ ν΄λμ€λ₯Ό μμνλκ°?
1. μΆμν λ¨κ³(λ 벨)λ₯Ό λλ μ μκΈ° λλ¬Έμ
볡μ‘ν μμ€ν μΌμλ‘ ν λ²μ λͺ¨λ κ±Έ μ μν기보λ¨, μ μ§μ μΌλ‘ μΆμνν΄μ κ³μΈ΅μ μΌλ‘ ꡬ쑰ννλ κ² μ’μ
abstract class Animal {
abstract void makeSound();
}
abstract class Canine extends Animal {
abstract void sniff();
}
class Dog extends Canine {
void makeSound() { System.out.println("λ©λ©"); }
void sniff() { System.out.println("νν"); }
}
- `Animal`: λͺ¨λ λλ¬Όμ κ³΅ν΅ κΈ°λ₯ μ μ
- `Canine`: κ°κ³Ό λλ¬Όλ§μ κ³΅ν΅ κΈ°λ₯(sniff) μ μ (μμ§ κ΅¬μ²΄μ μ΄μ§ μμ)
- `Dog`: ꡬ체μ μΈ λλ¬Ό → μ¬κΈ°μμΌ μ€μ λ©μλ ꡬν!
2. κ³΅ν΅ λ‘μ§μ μΆμ ν΄λμ€κ° λλ κ°κΈ° λλ¬Έ
- μμ μΆμ ν΄λμ€: μ λ§ κ³΅ν΅μ μΈ μΆμ λ©μλ μ μ
- νμ μΆμ ν΄λμ€: λ ꡬ체μ μΈ μν μ μ + μΌλΆ κ³΅ν΅ λ©μλ ꡬν
- μ΅νμ ν΄λμ€(ꡬν ν΄λμ€): μμ ν κΈ°λ₯ ꡬν
μ΄λ κ² νλ©΄ μ€λ³΅μ μ€μ΄λ©΄μλ μν μ λͺ νν λΆλ¦¬ν μ μμ΄.
νλͺ© | μ€λͺ |
κ°λ₯ μ¬λΆ | β μΆμ ν΄λμ€λ μΆμ ν΄λμ€λ₯Ό μμν μ μμ |
μ¬μ©νλ μ΄μ | μΆμν λ¨κ³λ₯Ό λλκ³ , μν μ κ³μΈ΅μ μΌλ‘ λΆλ¦¬νκΈ° μν΄ |
μ₯μ | μ€λ³΅ μ κ±°, ꡬ쑰μ μ€κ³, μ μ§λ³΄μ μ¬μ |
λ΄μΈλ ν΄λμ€
- κΈ°λ³Έμ μΌλ‘ `final` ν΄λμ€λ₯Ό μ μΈν λͺ¨λ ν΄λμ€λ λΆλͺ¨ ν΄λμ€κ° λ μ μμ
- JAVA 15 λΆν° 무λΆλ³ν μμ ν΄λμ€ μμ±μ λ°©μ§νκΈ° μν΄ λ΄μΈλ(sealed) ν΄λμ€κ° λμ λ¨
ππ» Personμ μμ ν΄λμ€λ Employeeμ Managerλ§ κ°λ₯
public sealed class Person permits Employee, Manager { ... }
- sealed ν€μλλ₯Ό μ¬μ©νλ©΄ permits ν€μλ λ€μ μμ κ°λ₯ν μμ ν΄λμ€λ₯Ό μ§μ ν΄μΌ ν¨.
- λ΄μΈλ Person ν΄λμ€λ₯Ό μμνλ Employeeμ Mangerλ `final`, `non-sealed` λλ λλ€λ₯Έ λ΄μΈλ ν΄λμ€μΈ `sealed` ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈν΄μΌ ν¨
final | λ μ΄μ μμ λΆκ° |
non-sealed | λ΄μΈ ν΄μ |
Q. non-sealedκ° μ‘΄μ¬νλ μ΄μ ?
λ΄μΈλ ν΄λμ€λ μμ ν΄λμ€λ₯Ό νμ νκΈ° μν΄ μ¬μ©νλλ°, μ μμμμ λ΄μΈμ ν΄μ νλκ°??
A. μ νμ νλ©΄μλ μ μ°ν¨μ νμ©νλ €λ μ€κ³ μ² ν λλ¬Έμ
1. μΌλΆ μμλ§ μ ννκ³ , μΌλΆλ μμ λ‘κ² νκ³ μΆμ λ
sealed ν΄λμ€λ₯Ό λ§λ€λ©΄ μμ ν΄λμ€λ₯Ό λͺ μμ μΌλ‘ μ ν κ°λ₯
public sealed class Shape permits Circle, Rectangle {}
public final class Circle extends Shape {} // μμ λΆκ°
public non-sealed class Rectangle extends Shape {} // μμ νμ©
π `non-sealed`μ "λλ μμ λ‘κ² νμ₯λ μ μλ€" λΌκ³ μ μΈνλ κ²
μ¦, λΆλͺ¨λ μ 체μ μΌλ‘ μμλ€μ μ ννμ§λ§, νΉμ μμμ λ€μ μ΄μ΄λλ€κ³ μ νν μ μκ² λ§λλ ꡬ쑰
2. μμ κ³μΈ΅μ μ μ°μ±μ μν΄
μ΄λ€ ν΄λμ€ κ³μΈ΅μ μ격νκ², μ΄λ€ ν΄λμ€ κ³μΈ΅μ μ μ°νκ² μ΄μ΄λ νμκ° μλ€.
μλ₯Ό λ€μ΄ Javaμ sealedλ OOPμμ λλ©μΈ λͺ¨λΈμ λ μμ νκ² μ€κ³νκΈ° μν λꡬμΈλ°,
λͺ¨λ κ³μΈ΅μ΄ λ±λ±νκ² λ«ν μμΌλ©΄ νμ₯μ΄ λΆκ°λ₯ν΄μ λΆνΈν μ μμ
sealed class Expr permits ConstExpr, VarExpr {}
non-sealed class VarExpr extends Expr {} // λ€μν λ³μ ννμ΄ νμν¨
final class ConstExpr extends Expr {} // κ³ μ μμλ νμ₯ νμ μμ
3. κΆνμ μΌλ¨ μ£Όκ³ , μμμ΄ μ€κ³ μ± μμ κ°μ§ μ μλλ‘ ν¨
non-sealedμ λΆλͺ¨κ° "λλ λκΉμ§λ μ μ΄ν κ²"
→ "κ·Έ λ€μμ λ€κ° μ±
μμ§κ³ μμμ μ΄λ λ«λ κ²°μ ν΄" λΌλ μλλ μλ€.
μ€λ¬΄μμλ μ΄λ κ² νμ λͺ¨λ μ€κ³ μ± μμ λκΈ°λ κ²½μ°λ μμ£Ό μμ
ν€μλ | μ€λͺ | μμ κ°λ₯μ± | μ¬μ© λͺ©μ | μμ |
sealed | μμ ν΄λμ€λ₯Ό μ ννκ³ μΆμ λ μ¬μ© | λͺ μν ν΄λμ€λ§ κ°λ₯ | μμ κ³μΈ΅ μ μ΄, 보μμ± ν₯μ | sealed class Shape permits Circle, Square {} |
non-sealed | μμ μ νμ ν΄μ νκ³ μΆμ λ μ¬μ© | λꡬλ μμ κ°λ₯ | μ μ°ν νμ₯ νμ© | non-sealed class Rectangle extends Shape {} |
final | μμμ μμ ν λ§κ³ μΆμ λ μ¬μ© | μ λ λΆκ° | ν΄λμ€ νμ₯ κΈμ§ | final class Circle extends Shape {} |