JDK1.8λΆν° λν΄νΈ λ©μλμ static λ©μλλ μΈν°νμ΄μ€μμ μ¬μ©ν μ μκ² λμλ€.
μΌλ¨μ JDK1.8 μ΄μ μ μΈν°νμ΄μ€μ λν΄μ λ¨Όμ μ΄ν΄λ³΄κ³ , κ·Έλ¦¬κ³ JDK1.8μμ μΆκ°λ κΈ°λ₯(λν΄νΈ λ©μλ, static λ©μλ)κ³Ό Java9λΆν° μ¬μ©ν μ μλ private λ©μλμ λν΄μ μ΄ν΄λ³΄λ κ²μΌλ‘ νμ.
π 1. μΈν°νμ΄μ€λ
μΈν°νμ΄μ€λ μΌμ’ μ μΆμν΄λμ€μ΄λ€. μΈν°νμ΄μ€λ μΆμν΄λμ€μ²λΌ μΆμλ©μλλ₯Ό κ°μ§λ§ μΆμν΄λμ€λ³΄λ€ μΆμν μ λκ° λμμ μΆμν΄λμ€μ λ¬λ¦¬ λͺΈν΅μ κ°μΆ μΌλ° λ©μλ λλ λ©€λ²λ³μλ₯Ό ꡬμ±μμΌλ‘ κ°μ§ μ μλ€. μ€μ§ μΆμλ©μλμ μμλ§μ λ©€λ²λ‘λ§ κ°μ§ μ μμΌλ©°, κ·Έ μΈμ λ€λ₯Έ μ΄λ ν μμλ νμ©νμ§ μλλ€.
μΈν°νμ΄μ€λ μΆμν΄λμ€μ²λΌ μμ±λμ§ μμ λΆμμ ν κ²μ΄κΈ° λλ¬Έμ κ·Έ μ체λ§μΌλ‘ μ¬μ©λ기보λ€λ λ€λ₯Έ ν΄λμ€λ₯Ό μμ±νλλ° λμμ μ€ λͺ©μ μΌλ‘ μμ±λλ€.
π 2. μΈν°νμ΄μ€μ μ¬μ©λ²
π 1. μΈν°νμ΄μ€ μμ±
public interface PlayingCard {
public static final int SPADE = 4;
public abstract String getCardNumber();
}
μΌλ°μ μΈ ν΄λμ€μ λ©€λ²λ€κ³Ό λ¬λ¦¬ μΈν°νμ΄μ€μ λ©€λ²λ€μ λ€μκ³Ό κ°μ μ μ½μ¬νμ΄ μλ€.
- λͺ¨λ λ©€λ²λ³μλ public static final μ΄μ΄μΌ νλ©°, μ΄λ₯Ό μλ΅ν μ μλ€.
- λͺ¨λ λ©μλλ public abstract μ΄μ΄μΌ νλ©°, μ΄λ₯Ό μλ΅ν μ μλ€.
μΈν°νμ΄μ€μ μ μλ λͺ¨λ λ©€λ²μ μμΈ μμ΄ μ μ©λλ μ¬νμ΄κΈ° λλ¬Έμ μ μ΄μλ₯Ό μλ΅ν μ μλ κ²μ΄λ©°, νΈμμ μλ΅νλ κ²½μ°κ° λ§λ€. μλ΅λ μ μ΄μλ μ»΄νμΌ μμ μ»΄νμΌλ¬κ° μλμ μΌλ‘ μΆκ°ν΄ μ€λ€.
public interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3; // public static final int DIAMOND = 3;
static int HEART = 2; // public static final int HEART = 2;
int CLOVER =1 ; // public static final int DIAMOND = 1;
public abstract String getCardNumber();
String getCardKind(); // public abstract String getCardKind();
}
π 2. ꡬν
μΈν°νμ΄μ€λ μΆμν΄λμ€μ²λΌ μμλ°μ μμν΄λμ€κ° μ€λ²λΌμ΄λ©μ ν΅ν΄ μΆμ λ©μλλ₯Ό ꡬνν¨μΌλ‘μ¨ μ¬μ©ν μ μλ€. λ€λ§ ν΄λμ€λ νμ₯νλ€λ μλ―Έμ ν€μλ 'extends'λ₯Ό μ¬μ©νμ§λ§ μΈν°νμ΄μ€λ ꡬννλ€λ μλ―Έμ ν€μλ 'implements'λ₯Ό μ¬μ©ν λΏμ΄λ€.
public interface Movable {
void move(int x, int y);
}
public class Player implements Movable {
@Override
public void move(int x, int y) {
System.out.println("(" + x + ", " + y + ") λ‘ μμ§μΈλ€!");
}
}
public static void main(String[] args) {
Player player = new Player();
player.move(1, 2); // (1, 2) λ‘ μμ§μΈλ€!
}
ν κ°μ§ μ£Όμν μ μ move()λ₯Ό μ€λ²λΌμ΄λ©ν λ μ κ·Ό μ μ΄μλ₯Ό λ°λμ publicμΌλ‘ ν΄μΌ νλ€. Movableμμ 'void move(int x, int y)'λΌκ³ μ μΈνμμ§λ§ 'public abstract'κ° μλ΅λ κ²μ΄κΈ° λλ¬Έμ μ€μ λ‘λ 'public abstract void move(int x, int y)'μ΄λ€.
μ€λ²λΌμ΄λ© ν λλ μ‘°μμ λ©μλλ³΄λ€ λμ λ²μμ μ κ·Ό μ μ΄μλ₯Ό μ§μ ν΄μΌ νκΈ° λλ¬Έμ move()λ₯Ό ꡬνν λμλ μ κ·Ό μ μ΄μλ₯Ό λ°λμ publicμΌλ‘ ν΄μΌ νλ€λ κ²μ΄λ€.
π 3. μμ
μΈν°νμ΄μ€λ μΈν°νμ΄μ€λ‘λΆν°λ§ μμλ°μ μ μμΌλ©°, ν΄λμ€μλ λ¬λ¦¬ λ€μ€μμ, μ¦ μ¬λ¬ κ°μ μΈν°νμ΄μ€λ‘λΆν° μμμ λ°λ κ²μ΄ κ°λ₯νλ€.
public interface Movable {
void move(int x, int y);
}
public interface Attackable {
void attack(Unit u);
}
public interface Fightable extends Movable, Attackable { }
π 3. μΈν°νμ΄μ€μ μ₯μ
π 1. νμ€νκ° κ°λ₯νλ€.
νλ‘μ νΈμ μ¬μ©λλ κΈ°λ³Έ νμ μΈν°νμ΄μ€λ‘ μμ±ν λ€μ, κ°λ°μλ€μκ² μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ νλ‘κ·Έλ¨μ μμ±νλλ‘ ν¨μΌλ‘μ¨ λ³΄λ€ μΌκ΄λκ³ μ ννλ νλ‘κ·Έλ¨μ κ°λ°μ΄ κ°λ₯νλ€.
π 2. μλ‘ κ΄κ³μλ ν΄λμ€λ€μκ² κ΄κ³λ₯Ό λ§Ίμ΄ μ€ μ μλ€.
μλ‘ μμκ΄κ³μ μμ§λ μκ³ , κ°μ μ‘°μν΄λμ€λ₯Ό κ°μ§κ³ μμ§ μμ μλ‘ μλ¬΄λ° κ΄κ³λ μλ ν΄λμ€λ€μκ² νλμ μΈν°νμ΄μ€λ₯Ό 곡ν΅μ μΌλ‘ ꡬννλλ‘ ν¨μΌλ‘μ¨ κ΄κ³λ₯Ό λ§Ίμ΄ μ€ μ μλ€.
public interface Repairable { }
class SCV extends GroundUnit implements Repairable { }
class Tank extends GroundUnit implements Repairable { }
class Dropship extends AirUnit implements Repairable { }
GroundUnitμΈ SCVμ Tank, κ·Έλ¦¬κ³ AirUnitμΈ DropShipμ΄ μλ‘ κ΄κ³κ° μλ ν΄λμ€μ΄μ§λ§ Repairable μΈν°νμ΄μ€λ₯Ό ν΅ν΄μ μλ¦¬κ° κ°λ₯ν μ λμ΄λΌκ³ κ΄κ³λ₯Ό λ§Ίμ΄μ€ μ μλ€.
π 3. λ 립μ μΈ νλ‘κ·Έλλ°μ΄ κ°λ₯νλ€.
μΈν°νμ΄μ€λ₯Ό μ΄μ©νλ©΄ ν΄λμ€μ μ μΈκ³Ό ꡬνμ λΆλ¦¬μν¬ μ μκΈ° λλ¬Έμ μ€μ ꡬνμ λ 립μ μΈ νλ‘κ·Έλ¨μ μμ±νλ κ²μ΄ κ°λ₯νλ€.
ν΄λμ€μ ν΄λμ€ κ°μ μ§μ μ μΈ κ΄κ³λ₯Ό μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ κ°μ μ μΈ κ΄κ³λ‘ λ³κ²½νλ©΄, ν ν΄λμ€μ λ³κ²½μ΄ κ΄λ ¨λ λ€λ₯Έ ν΄λμ€μ μν₯μ λ―ΈμΉμ§ μλ λ 립μ μΈ νλ‘κ·Έλλ°μ΄ κ°λ₯νλ€.
π 4. κ°λ°μκ°μ λ¨μΆμν¬ μ μλ€.
μΌλ¨ μΈν°νμ΄μ€κ° μμ±λλ©΄, μ΄λ₯Ό μ¬μ©ν΄μ νλ‘κ·Έλ¨μ μμ±νλ κ²μ΄ κ°λ₯νλ€. λ©μλλ₯Ό νΈμΆνλ μͺ½μμλ λ©μλμ λ΄μ©μ κ΄κ³μμ΄ μ μΈλΆλ§ μλ©΄ λκΈ° λλ¬Έμ΄λ€.
κ·Έλ¦¬κ³ λμμ λ€λ₯Έ νμͺ½μμλ μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ₯Ό μμ±νκ² λλ©΄, μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€κ° μμ±λ λκΉμ§ κΈ°λ€λ¦¬μ§ μκ³ λ μμͺ½μμ λμμ κ°λ°μ μ§νν μ μλ€.
π 4. μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ μ΄μ
μ§κΈκΉμ§ μΈν°νμ΄μ€μ νΉμ§κ³Ό ꡬννλ λ°©λ², μ₯μ λ± μΈν°νμ΄μ€μ λν μΌλ°μ μΈ μ¬νλ€μ λν΄μ λͺ¨λ μ΄ν΄λ³΄μλ€.
νμ§λ§ 'μΈν°νμ΄μ€λ λλ체 무μμΈκ°?'λΌλ μλ¬Έμ μ¬μ ν λ¨μμμ κ²μ΄λ€. κ·Έλμ μ΄λ²μλ μΈν°νμ΄μ€μ κ·μΉμ΄λ νμ©μ΄ μλ, λ³Έμ§μ μΈ μΈ‘λ©΄μ λν΄μ νλ² μ΄ν΄λ³΄μ.
μΈν°νμ΄μ€λ₯Ό μ΄ν΄νκΈ° μν΄μ μλ 2κ°μ§ μ¬νμ μΌλμ λκ³ μμ΄μΌ νλ€.
- ν΄λμ€λ₯Ό μ¬μ©νλ μͺ½(User)κ³Ό ν΄λμ€λ₯Ό μ 곡νλ μͺ½(Provider)μ΄ μλ€.
- λ©μλλ₯Ό μ¬μ©(νΈμΆ)νλ μͺ½(User)μμλ μ¬μ©νλ €λ λ©μλ(Provider)μ μ μΈλΆλ§ μλ©΄ λλ€. (λ΄μ©μ λͺ°λΌλ λλ€.)
ν΄λμ€ Aμ ν΄λμ€ Bκ° λ€μκ³Ό κ°μ΄ μλ€κ³ νμ.
class A {
public void methodA(B b) {
b.methodB();
}
}
class B {
public void methodB() {
System.out.println("methodB()");
}
}
public class InterfaceTest {
public static void main(String[] args) {
A a = new A();
a.methodA(new B());
}
}
ν΄λμ€ Aμ ν΄λμ€ Bλ μλ‘ μ§μ μ μΈ κ΄κ³κ° μλ€. ν΄λμ€ Aλ₯Ό μμ±νλ €λ©΄ ν΄λμ€ Bκ° μμ±λμ΄ μμ΄μΌ νκ³ , ν΄λμ€ Bμ methodB()μ μ μΈλΆκ° λ³κ²½λλ©΄ μ΄λ₯Ό μ¬μ©νλ ν΄λμ€ Aλ λ³κ²½λμ΄μΌ νλ€.
μ¦, μ§μ μ μΈ κ΄κ³μ λ ν΄λμ€λ νμͺ½(Provider)μ΄ λ³κ²½λλ©΄ λ€λ₯Έ νμͺ½(User)λ λ³κ²½λμ΄μΌ νλ€λ λ¨μ μ΄ μλ€.
κ·Έλ¬λ ν΄λμ€ Aκ° ν΄λμ€ Bλ₯Ό μ§μ νΈμΆνμ§ μκ³ μΈν°νμ΄μ€λ₯Ό 맀κ°μ²΄λ‘ ν΄μ ν΄λμ€ Aκ° μΈν°νμ΄μ€λ₯Ό ν΅ν΄μ ν΄λμ€ Bμ λ©μλμ μ κ·Όνλλ‘ νλ©΄, ν΄λμ€ Bμ λ³κ²½μ¬νμ΄ μκΈ°κ±°λ ν΄λμ€ Bμ κ°μ κΈ°λ₯μ λ€λ₯Έ ν΄λμ€λ‘ λ체λμ΄λ ν΄λμ€ Aλ μ ν μν₯μ λ°μ§ μλλ‘ νλ κ²μ΄ κ°λ₯νλ€.
class A {
// ν΄λμ€ Bλμ μΈν°νμ΄μ€ Iλ₯Ό μ΄μ©
public void methodA(I i) {
i.methodB();
}
}
interface I {
public abstract void methodB();
}
class B implements I{
@Override
public void methodB() {
System.out.println("methodB in B class");
}
}
public class InterfaceTest {
public static void main(String[] args) {
A a = new A();
a.methodA(new B());
}
}
μ΄λ κ² μμ±νλ©΄ ν΄λμ€ Aμ ν΄λμ€ Bλ 'A-B'μ μ§μ μ μΈ κ΄κ³μμ 'A-I-B'μ κ°μ μ μΈ κ΄κ³λ‘ λ°λκ² λλ€. ν΄λμ€ Aλ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ€μ λ‘ μ¬μ©νλ ν΄λμ€μ μ΄λ¦μ λͺ°λΌλ λκ³ μ¬μ§μ΄λ μ€μ λ‘ κ΅¬νλ ν΄λμ€κ° μ‘΄μ¬νμ§ μμλ λ¬Έμ λμ§ μλλ€.
mainμ½λμμ νμΈν μ μλ―μ΄ μ§κΈμ 맀κ°λ³μλ₯Ό ν΅ν΄μ μΈν°νμ΄μ€ Iλ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λμ μΌλ‘ μ 곡λ°κ³ μλ€. νμ§λ§ μλμ κ°μ΄ μ 3μ ν΄λμ€λ₯Ό ν΅ν΄μ μ 곡λ°μ μ μλ€. (JDBCμ DriverManager ν΄λμ€κ° μ΄λ° λ°©μμΌλ‘ λμ΄ μλ€.)
class A {
// μ 3μ ν΄λμ€μ λ©μλλ₯Ό ν΅ν΄μ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ»μ΄μ¨λ€.
public void methodA() {
I i = InstanceManager.getInstance();
i.methodB();
}
}
interface I {
public abstract void methodB();
}
class B implements I {
@Override
public void methodB() {
System.out.println("methodB in B class");
}
}
class InstanceManager {
public static I getInstance() {
return new B();
}
}
public class InterfaceTest {
public static void main(String[] args) {
A a = new A();
a.methodA();
}
}
μ΄λ κ² νλ©΄ μΈμ€ν΄μ€λ₯Ό μ§μ μμ±νμ§ μκ³ , getInstance()λΌλ λ©μλλ₯Ό ν΅ν΄ μ 곡λ°λλ€. κ·Έλ¬λ©΄ λμ€μ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€λ‘ λ³κ²½λμ΄λ Aν΄λμ€μ λ³κ²½ μμ΄ getInstance()λ§ λ³κ²½νλ©΄ λλ€λ μ₯μ μ΄ μλ€.
class InstanceManager {
public static I getInstance() {
return new B();
// return new C(); // λ³κ²½ κ°λ₯
// return new D(); // λ³κ²½ κ°λ₯
}
}
π 5. λν΄νΈ λ©μλ & static λ©μλ (from JDK1.8)
JDK1.8λΆν° μκΈ΄ κΈ°λ₯λ€μ λν΄μ μμ보μ. μλλ μΈν°νμ΄μ€μ μΆμ λ©μλλ§ μ μΈν μ μλλ°, JDK1.8λΆν° λν΄νΈ λ©μλμ staticλ©μλλ μΆκ°ν μ μκ² λμλ€.
π 1. λν΄νΈ λ©μλ
μ‘°μ ν΄λμ€μ μλ‘μ΄ λ©μλλ₯Ό μΆκ°νλ κ²μ λ³λ‘ ν° λ¬Έμ κ° λμ§ μμ§λ§, μΈν°νμ΄μ€μ κ²½μ°μλ ν° λ¬Έμ κ° λλ€. μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°νλ€λ κ²μ, μΆμ λ©μλλ₯Ό μΆκ°νλ€λ κ²μ΄κ³ , μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν κΈ°μ‘΄μ λͺ¨λ ν΄λμ€λ€μ΄ μλ‘ μΆκ°λ λ©μλλ₯Ό ꡬνν΄μΌ νκΈ° λλ¬Έμ΄λ€.
μ΄λ₯Ό ν΄κ²°νκ³ μ λν΄νΈ λ©μλ(default method)λΌλ κ²μ΄ λμλ€.
λν΄νΈ λ©μλλ μΆμ λ©μλμ κΈ°λ³Έμ μΈ κ΅¬νμ μ 곡νλ λ©μλλ‘, μΆμ λ©μλκ° μλκΈ° λλ¬Έμ λν΄νΈ λ©μλκ° μλ‘ μΆκ°λμ΄λ ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ₯Ό λ³κ²½νμ§ μμλ λλ€.
public interface MyInterface {
void walk();
default void fly() {
System.out.println("Let's Fly!!");
};
}
λν΄νΈ λ©μλ μμ μ κ·Ό μ μ΄μκ° publicμ΄λ©°, μλ΅κ°λ₯νλ€.
μλ‘ μΆκ°λ λν΄νΈ λ©μλκ° κΈ°μ‘΄μ λ©μλμ μ΄λ¦μ΄ μ€λ³΅λμ΄ μΆ©λνλ κ²½μ°κ° λ°μνλ€. μ΄ μΆ©λμ ν΄κ²°νλ κ·μΉμ λ€μκ³Ό κ°λ€.
- μ¬λ¬ μΈν°νμ΄μ€μ λν΄νΈ λ©μλ κ°μ μΆ©λ
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μμ λν΄νΈ λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν΄μΌ νλ€. - λν΄νΈ λ©μλμ μ‘°μ ν΄λμ€μ λ©μλ κ°μ μΆ©λ
μ‘°μ ν΄λμ€μ λ©μλκ° μμλκ³ , λν΄νΈ λ©μλλ 무μλλ€.
μ΄λ¬ν μ μ κ³ λ €νκΈ° λ²κ±°λ‘λ€λ©΄, κ·Έλ₯ νμν μͺ½μ λ©μλμ κ°μ λ΄μ©μΌλ‘ μ€λ²λΌμ΄λ©νλ©΄ λλ€.
π 2. static λ©μλ
μ¬μ€ static λ©μλλ μΈμ€ν΄μ€μ κ΄κ³κ° μλ λ 립μ μΈ λ©μλμ΄κΈ° λλ¬Έμ μμ λΆν° μΈν°νμ΄μ€μ μΆκ°νμ§ λͺ»ν μ΄μ κ° μμλ€. κ·Έλ¬λ μλ°λ₯Ό λ³΄λ€ μ½κ² λ°°μΈ μ μλλ‘ κ·μΉμ λ¨μν ν νμκ° μμ΄μ μΈν°νμ΄μ€μ λͺ¨λ λ©μλλ μΆμ λ©μλμ΄μ΄μΌ νλ€λ κ·μΉμ μμΈλ₯Ό λμ§ μμλ€.
κ·Έλμ μΈν°νμ΄μ€μ κ΄λ ¨λ static λ©μλλ λ³λμ ν΄λμ€μ λ°λ‘ λμ΄μΌ νλ€. (java.util.Collection μΈν°νμ΄μ€μ Collections ν΄λμ€)
JDK1.8λΆν° μΈν°νμ΄μ€μμλ static λ©μλλ₯Ό μ¬μ©ν μ μκ² λμλ€. μΈν°νμ΄μ€ μ μ© static λ©μλλΌκ³ ν΄μ μΌλ° ν΄λμ€μ static λ©μλμ λ€λ₯Έ κ²μ΄ μκ³ κ°μ λ°©λ²μΌλ‘ μ¬μ©νλ©΄ λλ€.
public interface MyInterface {
public static void explain() {
System.out.println("MyInterfaceμ explain() λ©μλμ
λλ€.");
}
}
public static void main(String[] args) {
MyInterface.explain();
}
π 6. private λ©μλ (from Java9)
μλ° 9λΆν° μΈν°νμ΄μ€μμ private λ©μλλ₯Ό μ¬μ©ν μ μκ² λμλ€. μΈν°νμ΄μ€μ default, static λ©μλκ° μκΈ΄ μ΄ν, μ΄λ¬ν λ©μλλ€μ λ‘μ§μ 곡ν΅ννκ³ μ¬μ¬μ©νκΈ° μν΄ μκΈ΄ λ©μλλ€.
private λ©μλλ ꡬνλΆλ₯Ό κ°μ ΈμΌ νλ€. λ¨, private λ©μλλ μΈν°νμ΄μ€ λ΄λΆμμλ§ λμκ°λ μ½λμ΄λ€. μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μμ μ¬μ©νκ±°λ μ¬μ μ ν μ μλ€.
λ°λΌμ μΈν°νμ΄μ€ λ΄λΆμμ private λ©μλλ₯Ό νΈμΆν λ, default λ©μλ λ΄λΆμμ νΈμΆν΄μΌ νλ©°, λ§μΌ private static ν€μλλ₯Ό λΆμΈ λ©μλλ static λ©μλμμλ§ νΈμΆμ΄ κ°λ₯νλ€.
public interface MyInterface {
default void callPrivateMethod() {
privateMethod();
}
private void privateMethod() {
System.out.println("private λ©μλμ
λλ€.");
}
static void callPrivateStaticMethod() {
privateStaticMethod();
}
private static void privateStaticMethod() {
System.out.println("private static λ©μλμ
λλ€.");
}
}
ν΄λΉ κΈμ
λ¨κΆμ± λμ 'μλ°μ μ μ',
geeksforgeeks μ 'Private Methods in Java 9 Interfaces',
Inpa λμ 'μΈν°νμ΄μ€(Interface) λ¬Έλ² & νμ© - μλ²½ κ°μ΄λ'
λ₯Ό μ°Έκ³ νμμ΅λλ€.
'π JAVA > μ£Όμ κ°λ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μλ°μ μ»΄νμΌ κ³Όμ (0) | 2023.06.19 |
---|---|
μΆμν΄λμ€(Abstract Class) VS μΈν°νμ΄μ€(Interface) (1) | 2023.06.13 |
μΆμ ν΄λμ€(Abstract Class) (2) | 2023.06.11 |
μ λ€λ¦(Generics) - 곡λ³(Covariant), λΆκ³΅λ³(Invariant), λ°κ³΅λ³(Contravariant) (0) | 2023.05.29 |
νλ³ν(μΊμ€ν , Casting) - μ μΊμ€ν (Up-Casting), λ€μ΄μΊμ€ν (Down-Casting) (0) | 2023.05.24 |