λͺ©μ°¨
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP)μ μ§μ§ νμ μ μ°ν¨κ³Ό νμ₯μ±μ μμ΅λλ€.
κ·Έ ν΅μ¬μ μλ κ°λ μ΄ λ°λ‘ μΆμν(Abstraction) μ λ€νμ±(Polymorphism) μ΄μ£ .
μ΄λ² κΈμμλ μΆμ ν΄λμ€, μΈν°νμ΄μ€, λ€νμ±, instanceofλ₯Ό ν΅ν΄ Javaλ‘ μ μ§λ³΄μκ° μ¬μ΄ μ€κ³ ꡬ쑰λ₯Ό λ§λλ λ°©λ²μ μμλ³΄κ² μ΅λλ€.
π· μΆμ ν΄λμ€μ μΈν°νμ΄μ€
π μΆμνλ?
μΆμνλ 곡ν΅μ μΈ μμ±κ³Ό λμμ λ½μλ΄μ΄ μΌλ°ννλ κ°λ μ λλ€.
μ¦, μ¬λ¬ κ°μ²΄κ° 곡ν΅μΌλ‘ κ°μ ΈμΌ ν ‘ν’μ μ μνλ, ꡬνμ λμ€μ νκ² λ§λλ κ±°μ£ .
Javaμμλ μ΄ μΆμνλ₯Ό μν΄ μΆμ ν΄λμ€(Abstract Class)μ μΈν°νμ΄μ€(Interface)λ₯Ό μ 곡ν©λλ€.
μΆμ ν΄λμ€(Abstract Class)
μΆμ ν΄λμ€λ μμ νμ§ μμ ν΄λμ€λ‘, νλ μ΄μμ μΆμ λ©μλλ₯Ό ν¬ν¨ν μ μμ΅λλ€.
μΆμ λ©μλλ μ μΈλ§ μκ³ κ΅¬νμ μλ λ©μλμ λλ€.
// μΆμ ν΄λμ€ μ μΈ
abstract class Animal {
// μΌλ° νλ
protected String name;
// μΌλ° λ©μλ
public void eat() {
System.out.println(name + "μ΄(κ°) λ¨Ήκ³ μμ΅λλ€.");
}
// μΆμ λ©μλ (ꡬνλΆκ° μμ)
abstract void makeSound();
}
// μΆμ ν΄λμ€ μμ
class Dog extends Animal {
public Dog(String name) {
this.name = name;
}
// μΆμ λ©μλ ꡬν (νμ)
@Override
void makeSound() {
System.out.println("λ©λ©!");
}
}
μΆμ ν΄λμ€μ νΉμ§
- abstract ν€μλλ‘ μ μΈ
- κ°μ²΄λ₯Ό μ§μ μμ±ν μ μμ (new Animal() λΆκ°λ₯)
- μΆμ λ©μλμ μΌλ° λ©μλ λͺ¨λ ν¬ν¨ κ°λ₯
- μμ±μ, νλ, μΌλ° λ©μλλ κ°μ§ μ μμ
- μμ ν΄λμ€λ λͺ¨λ μΆμ λ©μλλ₯Ό λ°λμ ꡬνν΄μΌ ν¨
μΈν°νμ΄μ€ (interface)
μΈν°νμ΄μ€λ μμ ν μΆμνλ₯Ό μ 곡νλ ꡬ쑰λ‘, ν΄λμ€κ° μ΄λ€ λ©μλλ₯Ό ꡬνν΄μΌ νλμ§λ₯Ό μ μν©λλ€.
// μΈν°νμ΄μ€ μ μΈ
interface Flyable {
// λͺ¨λ λ©μλλ κΈ°λ³Έμ μΌλ‘ public abstract
void fly();
// μμ μ μΈ (κΈ°λ³Έμ μΌλ‘ public static final)
int MAX_SPEED = 100;
// Java 8λΆν° μΆκ°λ default λ©μλ (ꡬν κ°λ₯)
default void land() {
System.out.println("μ°©λ₯ν©λλ€.");
}
// Java 8λΆν° μΆκ°λ static λ©μλ
static void info() {
System.out.println("λ μ μλ κ°μ²΄ μΈν°νμ΄μ€");
}
}
// μΈν°νμ΄μ€ ꡬν
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("μκ° λ μκ°λλ€.");
}
// default λ©μλ μ¬μ μ (μ νμ )
@Override
public void land() {
System.out.println("μκ° λλκ°μ§μ μμ΅λλ€.");
}
}
μΈν°νμ΄μ€μ νΉμ§
- interface ν€μλλ‘ μ μΈ
- λͺ¨λ λ©μλλ κΈ°λ³Έμ μΌλ‘ public abstract (Java 8 μ΄μ )
- λͺ¨λ νλλ public static final (μμ)
- Java 8λΆν° default λ©μλμ static λ©μλ ν¬ν¨ κ°λ₯
- ν΄λμ€λ μ¬λ¬ μΈν°νμ΄μ€λ₯Ό ꡬν κ°λ₯ (λ€μ€ ꡬν)
- μΈν°νμ΄μ€λ λ€λ₯Έ μΈν°νμ΄μ€λ₯Ό νμ₯ κ°λ₯ (extends)
π μΆμ ν΄λμ€ vs μΈν°νμ΄μ€
νλͺ© | μΆμ ν΄λμ€ | μΈν°νμ΄μ€ |
ν€μλ | abstract class | interface |
μμ/ꡬν λ°©μ | extends | implements |
λ€μ€ μμ | β (λΆκ°) | β (μ¬λ¬ κ° κ΅¬ν κ°λ₯) |
νλ | μΈμ€ν΄μ€ λ³μ μ μΈ κ°λ₯ | μμ(public static final)λ§ |
λ©μλ ꡬν | μΆμ λ©μλμ μΌλ° λ©μλ | abstract, default, static λ©μλ |
μ κ·Ό μ μ΄μ |
λͺ¨λ μ’ λ₯ κ°λ₯ | publicλ§ κ°λ₯ |
μ¬μ© λͺ©μ | κ³΅ν΅ λ‘μ§ κ³΅μ + νμ₯μ± | μν λͺ μΈ(κ·μ½) μ μ |
π‘ μΈμ 무μμ μ¬μ©ν΄μΌ ν κΉ?
μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ κ²½μ°:
- κ΄λ ¨μ±μ΄ λμ ν΄λμ€λ€ κ°μ μ½λλ₯Ό 곡μ νκ³ μΆμ λ
- κ³΅ν΅ νλλ λ©μλκ° λ§κ³ , μνλ₯Ό κ°μ ΈμΌ ν λ
- μ κ·Ό μ μ΄μλ₯Ό λ€μνκ² μ¬μ©ν΄μΌ ν λ
- ν΄λμ€ κ³μΈ΅κ΅¬μ‘°μμ "is-a" κ΄κ³μΌ λ
μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²½μ°:
- κ΄λ ¨μ±μ΄ μλ ν΄λμ€λ€μ΄ νΉμ λμμ ꡬνν΄μΌ ν λ
- λ€μ€ μμμ΄ νμν λ
- ꡬνλ³΄λ€ **κ·μ½(λͺ μΈ)**μ μ€μ μ λ λ
- "can-do" κ΄κ³λ₯Ό ννν λ
πΆ λ€νμ±κ³Ό instanceof
λ€νμ±(Polymorphism)μ΄λ?
λ€νμ±μ νλμ κ°μ²΄κ° μ¬λ¬ νμ μ μ°Έμ‘° λ³μλ‘ μ¬μ©λ μ μλ μ±μ§μ λ§ν©λλ€.
μ¦, λΆλͺ¨ νμ μΌλ‘ μμ κ°μ²΄λ₯Ό μ°Έμ‘°νλ©΄ λ€μν ννλ‘ νλν μ μμ΄μ!
Animal animal = new Dog(); // λΆλͺ¨ νμ
= μμ κ°μ²΄
animal.sound(); // μ€μ λ Dogμ sound() μ€ν
λ€νμ±μ μ£Όμ νν
- λ©μλ μ€λ²λΌμ΄λ©: μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ¬μ μ
- μ°Έμ‘° λ³μμ λ€νμ±: λΆλͺ¨ νμ μ°Έμ‘° λ³μλ‘ μμ κ°μ²΄λ₯Ό μ°Έμ‘°
λ€νμ±μ μ₯μ
- μ μ°ν νλ‘κ·Έλλ° κ°λ₯
- μ½λ νμ₯μ± μ¦κ°
- μ μ§λ³΄μ μ©μ΄μ± ν₯μ
- κ²°ν©λ κ°μ
instanceof μ°μ°μ
instanceof μ°μ°μλ κ°μ²΄κ° νΉμ ν΄λμ€/μΈν°νμ΄μ€μ μΈμ€ν΄μ€μΈμ§ νμΈνλ μ°μ°μμ λλ€.
μ£Όλ‘ λ€νμ± νκ²½μμ μ€μ κ°μ²΄ νμ μ νμΈν λ μ¬μ©ν©λλ€.
public void printSound(Animal animal) {
if (animal instanceof Dog) {
System.out.println("λ©λ©!");
} else if (animal instanceof Cat) {
System.out.println("μΌμΉ!");
} else {
System.out.println("λλ¬Ό μ리");
}
}
π‘ Java 16λΆν°λ instanceofμ ν¨κ» νμ μΊμ€ν κΉμ§ ν μ€λ‘ κ°λ₯ν΄μ‘μ΄μ!
if (obj instanceof Cat cat) { ... }
π λ§λ¬΄λ¦¬
μ€λμ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ μΈ μΆμν(Abstract)μ λ€νμ±(Polymorphism)μ λν΄ μμλ΄€μ΅λλ€.
μΆμ ν΄λμ€λ κ³΅ν΅ κΈ°λ₯μ ꡬννκ³ νμ₯μ μν νμ μ 곡νλ©°, μΈν°νμ΄μ€λ μ¬λ¬ ν΄λμ€μ κ³΅ν΅ λμμ κ°μ νλ κ³μ½ μν μ ν©λλ€.
λ€νμ±μ ν΅ν΄ νλμ νμ μΌλ‘ λ€μν ꡬν체λ₯Ό λ€λ£° μ μμ΄ μ μ°νκ³ νμ₯ κ°λ₯ν μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
instanceof μ°μ°μλ μ€ν μκ°μ κ°μ²΄μ μ€μ νμ μ νμΈνμ¬ μ μ ν μ²λ¦¬λ₯Ό κ°λ₯νκ² ν©λλ€.
μ΄λ¬ν κ³ κΈ κ°μ²΄μ§ν₯ κ°λ λ€μ λκ·λͺ¨ μ ν리μΌμ΄μ κ°λ°μμ μ½λ μ¬μ¬μ©μ±, μ μ§λ³΄μμ±, νμ₯μ±μ ν¬κ² ν₯μμν€λ ν΅μ¬ μμμ λλ€.
λ€μ μκ°μλ Javaμ μμΈ μ²λ¦¬μ λν΄ μμλ³΄κ² μ΅λλ€.
κΆκΈν λ΄μ©μ΄λ μΆκ°λ‘ μκ³ μΆμ κ°λ μ΄ μλ€λ©΄ λκΈλ‘ λ¨κ²¨μ£ΌμΈμ π