πμΈν°νμ΄μ€μ μΆμν΄λμ€μ μ°¨μ΄
μΈν°νμ΄μ€(Interface) | μΆμ ν΄λμ€(Abstract Class) | |
μ¬μ© λͺ©μ | ν΄λμ€κ° ꡬνν΄μΌν λ©μλμ μ§ν©μ μ μ | μμμ ν΅ν΄ κ³΅ν΅ κΈ°λ₯ 곡μ |
ꡬν | λͺ¨λ λ©μλκ° μΆμ λ©μλ (μΆμ λ©μλλ§ κ°λ₯) | μΆμ λ©μλμ μΌλ° λ©μλλ₯Ό λͺ¨λ κ°μ§ |
λ©€λ² λ³μ | (μ묡μ μΌλ‘) public static final | μΈμ€ν΄μ€ λ³μ κ°μ§ μ μμ |
λ€μ€ μμ μ¬λΆ | νλμ ν΄λμ€μμ μ¬λ¬κ°μ μΈν°νμ΄μ€ ꡬν κ°λ₯ | νλμ ν΄λμ€μ νλμ μΆμ ν΄λμ€λ§ μμ κ°λ₯ |
μμ±μ κ°λ₯μ¬λΆ | μμ±μ κ°μ§ μ μμ | μμ±μ κ°μ§ μ μμ |
μλ°μλ λΉμ·ν λ― λ€λ₯Έ μΈν°νμ΄μ€μ μΆμ ν΄λμ€κ° μλ€. μ΄ λμ μ°¨μ΄μ μ μ 리ν΄λ³΄λ € νλ€.
λ¨Όμ , μΈν°νμ΄μ€μ μΆμ ν΄λμ€κ° 무μμΈμ§ λ¨Όμ μμ보μ.
μΈν°νμ΄μ€(Interface)
μΈν°νμ΄μ€λ λͺ¨λ λ©μλκ° μΆμ λ©μλλ‘ κ΅¬μ±λμ΄μκ³ , ν΄λμ€κ° ꡬνν΄μΌν λ©μλμ μ§ν©μ μ μνλ€.
κ°λ¨νκ² λ¬΄μΈκ° ꡬνν΄μΌν λ΄μ©μ μ μν΄λμ κ²μ΄λΌκ³ μκ°νλ©΄ λλ€.
'ꡬνν΄μΌν ' κ²λ€μ μ μν΄λμ κ²μ΄λ―λ‘ μΌλ° ν΄λμ€μ λ¬λ¦¬ λ©μλμ μ½λ λΈλμ΄ μλ€. μ¦, μ΄λ€ λ©μλμ κΈ°λ₯μ ꡬνν΄λμ λ΄μ©μΈ μ½λ λΈλμ΄ μλ€.
interface μΈν°νμ΄μ€λͺ
() {
public static final μμλͺ
= κ°;
public abstract void λ©μλλͺ
();
}
μΈν°νμ΄μ€λ₯Ό μ μΈν λλ μ κ·Ό μ μ΄μμ ν¨κ» β interface ν€μλλ₯Ό μ¬μ©νλ€.
κ·Έλ¦¬κ³ β‘ μΈν°νμ΄μ€μ λͺ¨λ λ©μλλ μ묡μ μΌλ‘ public μ΄λ©°, νλ(λ³μ)λ public static final μ΄λ€.
*μΈν°νμ΄μ€ νλμ int COUNT = 3;μ public static finalμ μλ΅ν΄λ μλμΌλ‘ public static finalμ΄ μ μ©λλ€.
λ©μλμ κΈ°λ₯μ ꡬνν΄λμ§ μκΈ° λλ¬Έμ, μΈν°νμ΄μ€λ νΌμμ 무μΈκ° ν μλ μλ€. μΈν°νμ΄μ€λ₯Ό μμν ν΄λμ€(ꡬν체)μμ λ©μλλ₯Ό Override ν΄μ ꡬνν΄μΌνλ€.
interface Computer { }
Computer C = new Computer(); // Error: Cannot instantiate the type Computer
μμ²λΌ μΈν°νμ΄μ€κ° μλ€κ³ ν λ, Computer κ°μ²΄λ₯Ό μμ±νλ €νλ©΄ μλ¬κ° λ°μνλ€.
κ·Έλ¦¬κ³ μΈν°νμ΄μ€λ β’ λ€μ€ μμμ΄ κ°λ₯ν΄μ, μλμ κ°μ΄ ν ν΄λμ€κ° μ¬λ¬ μΈν°νμ΄μ€λ₯Ό μμλ°μ ꡬνν μ μλ€.
class ν΄λμ€λͺ
implements μΈν°νμ΄μ€1, μΈν°νμ΄μ€2
β£ Java8 λΆν° μΈν°νμ΄μ€λ default λ©μλμ static λ©μλλ₯Ό μ¬μ©ν μ μλ€.
μΈν°νμ΄μ€μ λ©μλλ ꡬν체λ₯Ό κ°μ§ μ μμ§λ§, default λ©μλλ₯Ό μ¬μ©νλ©΄ μ€μ ꡬνλ ννμ λ©μλλ₯Ό κ°μ§ μ μλ€.
κ·Έλ¦¬κ³ μΈν°νμ΄μ€μ static λ©μλλ₯Ό ꡬννλ©΄ μΈν°νμ΄μ€λͺ .μ€νν±λ©μλλͺ κ³Ό κ°μ΄ μ¬μ©νμ¬ μΌλ° ν΄λμ€μ static λ©μλλ₯Ό μ¬μ©νλ κ²κ³Ό λμΌνκ² μ¬μ©ν μ μλ€.
interface TestInterface {
// default λ©μλ
default void printSomething() {
System.out.println("default method in interface");
}
// static λ©μλ
static int getNum() {
return 10;
}
}
μλμ κ°μ΄ μΈν°νμ΄μ€λͺ .μ€νν±λ©μλλͺ μΌλ‘ μ¬μ©ν μ μλ€.
TestInterface.printSomething();
μΈν°νμ΄μ€(Interface)λ₯Ό μ¬μ©νλ μ΄μ ?
κ·Έλ λ€λ©΄ μΈν°νμ΄μ€λ₯Ό μ μ¬μ©ν΄μΌ νλκ±ΈκΉ?
λ³΄ν΅ μ€μ ν΄λμ€λ₯Ό μμ±νλ μμ μμ ν΄λμ€μ ꡬνμ²΄κ° λͺ κ°κ° λ μ§ μ μ μμΌλ―λ‘ μΈν°νμ΄μ€λ₯Ό μ μν΄μ μΈν°νμ΄μ€λ₯Ό κΈ°μ€μΌλ‘ λ©μλλ₯Ό λ§λλ κ²μ΄ ν¨μ¨μ μ΄κΈ° λλ¬Έμ΄λ€.
λΉμ₯ μ΄ λ¬Έμ₯μ μ½μμλλ λ¬΄μ¨ μλ¦°κ° μΆλ€.
μμλ‘ νλ² λ€μ μ 리ν΄λ³΄μ.
Animal ν΄λμ€λ₯Ό μμνλ Tiger, Bear ν΄λμ€κ° μκ³ , μ΄λ€μ κ΄λ¦¬νκ³ λ¨Ήμ΄λ₯Ό μ£Όλ ZooKeeper ν΄λμ€κ° μλ€κ³ ν΄λ³΄μ.
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Tiger extends Animal { }
class Bear extends Animal { }
class ZooKeeper {
void feed(Tiger tiger) {
System.out.println("feed apple to Tiger");
}
void feed(Bear bear) {
System.out.println("feed banana to Bear");
}
}
ZooKeeperλ feed() λ©μλ νΈμΆμ μΈμμ νμ μ λ°λΌ Tigerλ Bearμκ² λ¨Ήμ΄λ₯Ό μ€λ€.
public static void main(String[] args) {
ZooKeeper zooKeeper = new ZooKeeper();
Tiger tiger = new Tiger();
Bear bear = new Bear();
zooKeeper.feed(tiger); // feed apple to Tiger
zooKeeper.feed(bear); // feed banana to Bear
}
κ·Όλ° μ΄λ λλ¬Όλ€μ΄ κ³μν΄μ λμ΄λλ€λ©΄, ZooKeeperμ ν΄λΉ λλ¬Όλ€μ νμ μ λ§€κ°λ³μλ‘ ν feed() λ©μλλ₯Ό κ³μ κ³μ μΆκ°ν΄μ£Όμ΄μΌνλ€. μ΄λ κ² κ³μ μΆκ°νκ² λλ©΄ ZooKeeper κ° κ΅μ₯ν 볡μ‘ν΄μ§ κ²μ΄λ€.
μ΄λ΄λ μΈν°νμ΄μ€λ₯Ό ꡬννλ©΄ ν¨μ¬ ν¨μ¨μ μΌλ‘ μ½λλ₯Ό ꡬμ±ν μ μλ€.
λ¨Ήμ΄λ₯Ό μ£Όλ λ©μλ κΈ°λ₯μ κ°μ§ μΈν°νμ΄μ€ Workλ₯Ό μμ±ν΄λ³΄μ.
interface Work { } // μΈν°νμ΄μ€
class Animal { // λΆλͺ¨(μμ) ν΄λμ€
String name;
void setName(String name) {
this.name = name;
}
}
class Tiger extends Animal implements Work { }
class Bear extends Animal implements Work { }
κ·Έλ¦¬κ³ Tiger, Bear ν΄λμ€μμ μΈν°νμ΄μ€ Workλ₯Ό μμνλ€.
*μΈν°νμ΄μ€ μμμ ν€μλλ implements
μ΄λ κ²νλ©΄ ZooKeeper ν΄λμ€μ μΈν°νμ΄μ€ Work νμ μ λ§€κ°λ³μλ‘ λ°μμ λ¨Ήμ΄λ₯Ό μ£Όλ κΈ°λ₯μΈ feed() λ©μλλ₯Ό ꡬνν μ μλ€.
class ZooKeeper {
void feed(Work work) {
System.out.println("feed apple to Animal");
}
}
μλλ Tiger, Bear νμ μ λν΄ κ°κ° feed() λ©μλλ₯Ό ꡬνν΄μΌνμ§λ§, μΈν°νμ΄μ€μΈ Work νμ μνλμ λ©μλλ§μΌλ‘λ feed() λ©μλ ꡬνμ΄ κ°λ₯νλ€.
μ€μ λ‘ Tiger, Bear μΈμ€ν΄μ€λ₯Ό feed(Work work) λ©μλμ μΈμλ‘ λ£μ΄μ νΈμΆνλ©΄ μλμ κ°μ κ²°κ³Όκ° λμ¨λ€.
public static void main(String[] args) {
ZooKeeper zooKeeper = new ZooKeeper();
Tiger tiger = new Tiger();
Bear bear = new Bear();
zooKeeper.feed(tiger); // feed apple to Animal
zooKeeper.feed(bear); // feed apple to Animal
}
μ΄μ μ΄λ€ λλ¬Ό ν΄λμ€λ₯Ό μΆκ°νλ ZooKeeper ν΄λμ€μ feed() λ©μλλ₯Ό μΆκ°ν νμκ° μλ€.
λ€μ μμμ μκΈ°νλ μ΄μ λ₯Ό κ°μ Έμ€λ©΄,
"μ€μ ν΄λμ€λ₯Ό μμ±νλ μμ μμ ν΄λμ€μ ꡬνμ²΄κ° λͺ κ°κ° λ μ§ μ μ μμΌλ―λ‘ μΈν°νμ΄μ€λ₯Ό μ μν΄μ μΈν°νμ΄μ€λ₯Ό κΈ°μ€μΌλ‘ λ©μλλ₯Ό λ§λλ κ²μ΄ ν¨μ¨μ "
μ΄λΌλ λ§μ΄ μ‘°κΈμ μ΄ν΄κ° λ κ²μ΄λ€.
λ€λ§, μ μμλ μΈν°νμ΄μ€κ° μ νμνκ°μ λν λΆλΆμ λν μ€λͺ μ μν μμλ‘, Work μΈν°νμ΄μ€λ₯Ό μμνλ λͺ¨λ ν΄λμ€μμ κ°μ μΆλ ₯μ΄ λμ¨λ€. μ΄κ±΄ Work μΈν°νμ΄μ€λ₯Ό μμλ°λ νμ ν΄λμ€, μ¦ μμ ν΄λμ€μμ λ³λλ‘ λ©μλλ₯Ό ꡬνν΄μ κ° λλ¬Ό ν΄λμ€λ§λ€ λ€λ₯Έ κ²°κ³Όλ₯Ό λμ€κ² ν μ μλ€.
*μ΄λ»κ² νλ건μ§λ μ΄ ν¬μ€ν μμλ λ€λ£¨μ§ μκ² λ€. μΆμ ν΄λμ€λ λΉκ΅κ° λͺ©μ μ΄λ―λ‘..
μΆμ ν΄λμ€(Abstract Class)
μΆμ ν΄λμ€λ β νλ μ΄μμ μΆμ λ©μλλ₯Ό ν¬ν¨νλ©°, μΈν°νμ΄μ€μ μν λ νλ©΄μ ν΄λμ€μ κΈ°λ₯λ κ°μ§κ³ μλ ν΄λμ€μ΄λ€.
νλ μ΄μμ μΆμ λ©μλλ₯Ό ν¬ν¨νλ€λ κ²μ, μΌλ° λ©μλλ₯Ό κ°μ§ μ μλ€λ μλ―Έλ λ΄ν¬νλ€.
μΈν°νμ΄μ€μ κ²½μ°, λͺ¨λ λ©μλκ° μΆμ λ©μλμΈ λ°λ©΄ μΆμ ν΄λμ€λ 미리 ꡬνλ λ©μλλ₯Ό κ°μ§ μ μλ€λ μ°¨μ΄κ° μλ€.
abstract class ν΄λμ€λͺ
() { // μΆμ ν΄λμ€
abstract λ°ννμ
λ©μλλͺ
(); // μΆμ λ©μλ
}
μΆμ λ©μλλ μΈν°νμ΄μ€μ λ©μλμ λ§μ°¬κ°μ§λ‘ ꡬνμ²΄κ° μλ€.
μ¦, μΆμ ν΄λμ€λ₯Ό μμνλ μμ ν΄λμ€μμ λ°λμ ν΄λΉ μΆμ λ©μλλ₯Ό μ€λ°λΌμ΄λ©μν΄μΌ μ¬μ©ν μ μλ€.
μΆμ λ©μλλ μ½λ λΈλμ΄ μλ ꡬνμ²΄λ‘ μμ±λμ§ μκ³ , μ μΈλΆλ§ μ‘΄μ¬νλ€. μ΄ λ©μλλ₯Ό μμ ν΄λμ€μμ μ€λ²λΌμ΄λ©νμ¬ κ΅¬νν΄μ μ¬μ©νλ κ²μ΄λ€.
λ€μλ§ν΄, μΆμ ν΄λμ€λ "λ΄κ° μ΄ κΈ°λ₯μ μ ν΄λμ§ μμν λ, λλ₯Ό μμν μμ ν΄λμ€λ€μ, λ΄κ° μ μν κΈ°λ₯μ ꡬνν΄λ΄!" λΌκ³ μ΄μΌκΈ° νλ κ²μ΄λ€. μ¬κΈ°μ μΆκ°λ‘, "λ¨ μΌλΆλ λ§λ€μ΄μ£Όκ³ , μΌλΆλ μλ§λ€μ΄μ€κ²" λΌκ³ νλ€κ³ μκ°νλ©΄ κΈ°μ΅νκΈ° μ½λ€.
μΆμ ν΄λμ€λ μΈν°νμ΄μ€μ λ§μ°¬κ°μ§λ‘ ꡬνλΆκ° μλ μΆμ λ©μλκ° μκΈ° λλ¬Έμ μΌλ° ν΄λμ€μ λ¬λ¦¬ β‘ λ¨λ μΌλ‘ κ°μ²΄, μ¦ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
λ°λμ μΆμ ν΄λμ€λ₯Ό μμν μ€μ ν΄λμ€λ₯Ό ν΅ν΄μλ§ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
(μΆμ ν΄λμ€λ₯Ό μμν μμ ν΄λμ€μμ ν΄λΉ μΆμ ν΄λμ€μ μΆμ λ©μλλ₯Ό μ€λ²λΌμ΄λ© ν΄μΌ, μμ ν΄λμ€μ μΈμ€ν΄μ€ μμ± κ°λ₯)
abstract class Teacher { }
Teacher t = new Teacher(); // Error: Cannot instantiate the type Teacher
κ·Έλ¦¬κ³ μΆμ ν΄λμ€λ μΈν°νμ΄μ€μ λ¬λ¦¬ μΌλ° ν΄λμ€μ²λΌ β’ μΈμ€ν΄μ€ λ³μ, μμ±μ, private λ©μλ λ±μ κ°μ§ μ μλ€.
μ¦, μΆμ λ©μλμ μΌλ° λ©μλ, κ°μ²΄ λ³μ, μμ±μκΉμ§ κ°μ§ μ μλ κ²μ΄λ€.
abstract class Teacher {
private String name; // λ©€λ² λ³μ
Teacher() {} // μμ±μ
abstract void hello(); // μΆμ λ©μλ
void hi() { System.out.println("μλ
!"); } // μΌλ° λ©μλ
}
κ·Έλ¦¬κ³ Javaμμλ ν΄λμ€μ λ€μ€ μμμ λ§κΈ° λλ¬Έμ β£ μΆμ ν΄λμ€λ λ€μ€ μμμ ν μ μλ€.
class ν΄λμ€λͺ
extends μΆμν΄λμ€
μΆμ ν΄λμ€(Abstract Class)λ₯Ό μ¬μ©νλ μ΄μ ?
μΆμ λ©μλλ μΈν°νμ΄μ€μ λΉμ·νκ², μ€λ³΅λκ±°λ 곡ν΅λλ λΆλΆμ λν΄ λ―Έλ¦¬ λ§λ€μ΄μ§ κ²μ μ¬μ©νκ³ , μ΄λ₯Ό μ¬μ©νλ μͺ½μμ μμ μκ² νμν λΆλΆλ§ μ¬μ μν΄μ μ¬μ©ν¨μΌλ‘μ¨ μμ°μ±κ³Ό ν¨μ¨μ±μ΄ ν₯μλκΈ° λλ¬Έμ μ¬μ©νλ€.
λν μΆμ λ©μλκ° ν¬ν¨λ ν΄λμ€λ₯Ό μμλ°λ νμ(μμ)ν΄λμ€κ° λ°λμ κ·Έ μΆμ λ©μλλ₯Ό ꡬννκ²λ νκΈ° μν¨μ΄λ€.
μΌλ° λ©μλλ ν΄λΉ λ©μλλ₯Ό ꡬννμ§ μμμλ μμ§λ§, μΆμ λ©μλκ° ν¬ν¨λ μΆμ ν΄λμ€λ₯Ό μμλ°μ λͺ¨λ νμ(μμ)ν΄λμ€λ μΆμ λ©μλλ₯Ό ꡬνν΄μΌλ§ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μκΈ° λλ¬Έμ λ°λμ ꡬννκ² λλ€.
μΈν°νμ΄μ€(Interface) vs μΆμ ν΄λμ€(Abstract Class)
κ·ΈλΌ μ΄ λμ μ°¨μ΄κ° μ΄λμ μλμ§ μ 리ν΄λ³΄μ.
1. μ¬μ© λͺ©μ
- μΈν°νμ΄μ€λ λͺ¨λ λ©μλκ° μΆμ λ©μλλ‘, μΈν°νμ΄μ€λ₯Ό μμλ°λ ν΄λμ€κ° ꡬνν΄μΌ ν λ©μλμ μ§ν©μ μ μνλ€.
- μΆμ ν΄λμ€λ 1κ° μ΄μμ μΆμ λ©μλκ° μκ³ , μΌλ° λ©μλλ ν¬ν¨ν μ μκΈ° λλ¬Έμ, μΆμ λ©μλμ κΈ°λ₯μ ꡬννκ² νκΈ° μν΄μλ μμ§λ§, μμμ ν΅ν κ³΅ν΅ κΈ°λ₯ 곡μ νλλ‘ νλ κ²μλ λͺ©μ μ΄ μλ€.
2. ꡬν
- μΈν°νμ΄μ€λ λͺ¨λ λ©μλκ° μΆμ λ©μλμ΄λ€.
- μΆμ ν΄λμ€λ μΆμ λ©μλμ μΌλ° λ©μλλ₯Ό λͺ¨λ κ°μ§ μ μλ€.
3. λ©€λ² λ³μ
- μΈν°νμ΄μ€μ λ©€λ² λ³μλ public static finalμ΄λ€. μ¦, μΈμ€ν΄μ€ λ³μλ₯Ό κ°μ§ μ μλ€.
- μΆμ ν΄λμ€λ μΈμ€ν΄μ€ λ³μλ₯Ό κ°μ§ μ μλ€.
4. μμ±μ κ°λ₯ μ¬λΆ
- μΈν°νμ΄μ€λ μμ±μλ₯Ό κ°μ§ μ μλ€.
- μΆμ ν΄λμ€λ μμ±μλ₯Ό κ°μ§ μ μλ€.
5. λ€μ€ μμ μ¬λΆ
- μΈν°νμ΄μ€(ν€μλ: implements)λ λ€μ€ μμμ΄ κ°λ₯νλ€.
- μΆμ ν΄λμ€(ν€μλ: extends) λ λ€μ€ μμμ΄ λΆκ°λ₯νλ€.
λ§μΉλ©°,
Javaμ μΈν°νμ΄μ€μ μΆμ ν΄λμ€μ λν΄ μμ보μλ€.
μμ보면μλ λ μμλ΄μΌν κ°λ λ€μ΄ λ§μμ, μ΄νμ νλμ© μ°¨κ·Όν μ 리ν΄λ³΄μμΌκ² λ€.
μ°Έκ³ ν¬μ€ν λ° μμ
- Do it! μ ν ν¬ μλ°
- TCP School
'π» Programming > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] λ¨μΆ νκ°(Short-circuit Evaluation) (0) | 2024.06.27 |
---|---|
[Java] λ©μΈλ©μλ(public static void main(String[] args)) λ―μ΄λ³΄κΈ° (0) | 2024.06.26 |
[Java] Arrayλ₯Ό Listλ‘ λ³ν : int[] to List<Integer> (0) | 2024.04.17 |