λΆλͺ¨ν΄λμ€ μν μ μΆμν΄λμ€λ‘ νμ©!
abstract class ν΄λμ€λͺ
: λͺΈν΅μ΄ μλ ν΄λμ€
-> λ³μ, μμ±μ, λ©μλ λ€ κ°λ₯
-> μΆμλ©μλ : μ μΈλ§ μκ³ μ μ(μ€νμ½λ)κ° μμ
μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€μ μΆμλ©μλλ νμλ‘ κ΅¬νμ ν΄μΌνλ€.
//μΆμν΄λμ€
public interface Abstract002 {
public static void main(String[] args) {
// Car c = new Car();
//μΆμν΄λμ€λ μΈμ€ν΄μ€ κ°μ²΄ μμ±X
Car c = new Bus();
//νμ
μΌλ‘λ μΈ μ μλ€!
Bus b = new Bus();
Truck t = new Truck();
b.stop(); //μμκ΄κ³λ λμλ μν! κ·Έλ₯ Carν΄λμ€μ κ°μ²΄λ₯Ό μμ±νμ§ λͺ»νλκ²~!
t.stop(); //μμκ΄κ³λ λμλ μν! κ·Έλ₯ Carν΄λμ€μ κ°μ²΄λ₯Ό μμ±νμ§ λͺ»νλκ²~!
// b.run();
// t.run();
Car[] carArr = {b, t};
for (int i=0; i<carArr.length; i++) {
carArr[i].run();
//μμ abstract run(); μ΄ μμλ Carμ run()λ©μλκ° μμΌλκΉ λ°μμ²λΌ νλ³νν΄μ λΆλ¬μ€μΌν¨!
// ((Bus)carArr[i]).run();
// ((Truck)carArr[i]).run();
}
}
}
abstract class Car { //μΆμν΄λμ€ -> CarλΌλ μ€κ³λκ° λ°λ§ μμ±λ μν
//μ΅μνμ κΈ°λ³Έ 곡ν΅μ λ§ λͺ¨μλλκ³³μΌλ‘ κ΅³μ΄ κ°μ²΄μμ±νμ§ μμλ λλ ν΄λμ€ λ§λ€κ³ μΆμλ!
//μ΅μνμ κΈ°λ³Έ 곡ν΅μ λ§ κ°μ§κ³ κ°μ²΄νμ΄λλ©΄ μλλ μν©μΌλ
//μ°¨ -> λλ²μ£Ό λΆλ₯μμΌλ‘ κ·Έλ₯ μ°¨!
//νλ
String type; //νμ
//μμ±μ
public Car() {}
//λ©μλ
void stop() {
System.out.println("Car stop()");
}
abstract public void run();
//μΆμλ©μλλ μ μΈ λΆλΆλ§ μμ±! μ μ{}λΆλΆμ μμ±X
}
class Bus extends Car {
//μ°¨μ ν μ’
λ₯μΈ μ€μ²΄κ° λ²μ€
//λΆλͺ¨ν΄λμ€μ μΆμλ©μλκ° μμΌλ©΄ 무쑰건 μμν΄λμ€μμ ꡬνν΄μ€μΌνλ€
//μλμΌλ‘ importνλ―μ΄ νλ©΄ μκΉ
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Bus run()");
}
void stop() {
System.out.println("Bus stop()");
}
}
class Truck extends Car {
// μ°¨μ ν μ’
λ₯μΈ μ€μ²΄κ° νΈλ
//λΆλͺ¨ν΄λμ€μ μΆμλ©μλκ° μμΌλ©΄ 무쑰건 μμν΄λμ€μμ ꡬνν΄μ€μΌνλ€
//μλμΌλ‘ importνλ―μ΄ νλ©΄ μκΉ
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Truck run()");
}
}
π»
πμΆμν΄λμ€λ κ°μ²΄μμ±μ ν μ μλ€!
νμ§λ§ νμ
μΌλ‘λ μΈ μ μλ€!
πνμ§λ§ μμν΄λμ€μμ μμκ΄κ³μ λκ°μ΄ λΆλͺ¨ν΄λμ€μ λ³μ, λ©μλλ₯Ό μ΄μ©ν μ μλ€
πμΆμν΄λμ€λ νλλ³μ, λ©μλ μ μΈ+ꡬνκΉμ§ λ€ ν μ μμ΄ μμκ³Ό λκ°λ€κ³ μκ°νλ©΄ λκ³ λ©μΈν΄λμ€μμ μΆμν΄λμ€ κ°μ²΄λ₯Ό μμ±νμ§ λͺ»νλ€λ μ°¨μ΄μ λ§ μλκ±°κ³
μΆμλ©μλ abstract public void run(); λ μ μΈλ§ κ°λ₯νκ³ κ΅¬ν{}μ λͺ»νλ€!
πκ·Έλμ μΆμν΄λμ€ Carλ₯Ό μμλ°λ Busμ Truckμ μΆμν΄λμ€ Carμ μΆμλ©μλκ° μμΌλ©΄ 무쑰건 ꡬνν΄μ€μΌ νλ€!
λΆλͺ¨ν΄λμ€μ μΆμλ©μλκ° μμΌλ©΄ μμν΄λμ€μμ 무쑰건 ꡬνν΄μ€μΌνλ€
μ°κ²°ν΅μ , μλ‘ μν΅νλ κΈ°μ€!
ex)220V κ½λ κ³³: interface / μ΄λν°λ€: class
public class Interface002 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Callable c1 = new Callable(); //μΈν°νμ΄μ€λ κ°μ²΄ μμ±X
GalaxyPhone1 gp1 = new GalaxyPhone1();
gp1.callState = Callable.CALL_ON;
GalaxyPhone1 gp2 = new GalaxyPhone1();
gp2.callState = Callable.CALL_OFF;
//μμκ³Ό λμΌν λΆλΆ -> κ°μ²΄μμ±μ λͺ»νμ§λ§ νμ
μΌλ‘λ O
Callable gp3 = new GalaxyPhone1();
//μΈν°νμ΄μ€ νμ
= ꡬνν΄λμ€
Callable gp4 = new IPhone1();
IPhone1 gp5 = new IPhone1();
Callable[] arr = {gp3, gp4};
arr[0].call();
arr[1].call();
GalaxyTab1 gt1 = new GalaxyTab1();
gt1.call();
gt1.connect();
Callable gt2 = new GalaxyTab1(); //ꡬν νκ³ μμΌλκΉ λ΄μ μ μμ΄
gt2.call();
// gt2.connect(); //Callableμ λ€μ΄κ°μλ λ©μλλ§ κ°λ₯~!
Callable[] arr2 = {gp3, gp4, gt1}; //λ€ λ΄μ μ μμ§~! μμμ΄λ λμΌν λΆλΆ!
for (Callable ca : arr2) {
ca.call();
}
//μΈν°νμ΄μ€ νμ
= ꡬνν΄λμ€
BluetoothConnectable bc1 = new GalaxyPhone1();
BluetoothConnectable bc2 = new GalaxyTab1();
bc2.connect();
// bc2.call(); //BluetoothConnectableμ λ€μ΄κ°μλ λ©μλλ§ κ°λ₯!
//BluetoothConnectable bc3 = new IPhone1(); //ꡬνμνμΌλκΉ X
GalaxyTab1 gt3 = new GalaxyTab1();
Callable ca = gt3;
BluetoothConnectable bc = gt3;
BluetoothConnectable[] bcArr = {gt1, gp1};
//gp3 -> Callableμ λ΄κ²¨μμ΄! μκ΄μλκ΄κ³λκΉ μλ΄κΈ°μ§
//gp4 -> Callableμ λ΄κ²¨μμ΄! μκ΄μλκ΄κ³λκΉ μλ΄κΈ°μ§
//gp5 -> IPhone1μ λ΄κ²¨μμ΄! IPhone1μ BluetoothConnectableμ ꡬνX
//gt1 -> GalaxyTab1μ λ΄κ²¨μμΌλκΉ BluetoothConnectableμ λ€μ΄κ°μμΌλκΉ λ΄κΈ°μ§
//gp1 -> GalaxyPhone1μ λ΄κ²¨μμΌλκΉ BluetoothConnectableμ λ€μ΄κ°μμΌλκΉ λ΄κΈ°μ§
//νμ
λ³ν
Callable ca2 = gt3; //gt3λ GalaxyTab1μ λ΄κ²¨μ Έμμ
if (ca2 instanceof GalaxyTab1) { //ca2λ₯Ό GalaxyTab1λ‘ λ°κΏμ μλ
}
GalaxyTab1 gt33 = (GalaxyTab1)ca2; //ca2λ Callableμ λ΄κ²¨μ ΈμμΌλκΉ λΆλͺ¨κ° μμμ λ΄κΈΈμμμΌλ κ°μ νλ³ν!
gt33.call();
gt33.connect();
BluetoothConnectable bt2 = gt3;
//gt3λ GalaxyTab1μ λ΄κ²¨μ Έμμ? μμμ Callableμ λ΄κ²¨μ Έμλ μνλ‘ λ³νκ±° μλκ°..X
//ca2,bt2λ Q167μ λ΄κ²¨μλ gt3λ₯Ό κ°λ¦¬ν€κ³ μλκ² -> gt3λ κ·Έλ₯ μ§ νμ
μ΄ μλκ±°μ§
if (bt2 instanceof GalaxyTab1) { //bt2λ₯Ό GalaxyTab1λ‘ λ°κΏμ μλ
}
GalaxyTab1 gt34 = (GalaxyTab1)bt2;
gt34.call();
gt34.connect();
/*
GalaxyTab1 gt3 = new GalaxyTab1();
Callable ca2 = gt3; //O //gt3λ GalaxyTab1μ λ΄κ²¨μ Έμμ
BluetoothConnectable bt2 = gt3; //O //gt3λ GalaxyTab1μ λ΄κ²¨μ Έμμ
//ca2,bt2λ Q167μ λ΄κ²¨μλ gt3λ₯Ό κ°λ¦¬ν€κ³ μλκ² -> gt3λ κ·Έλ₯ μ§ νμ
μ΄ μλκ±°μ§
BluetoothConnectable bt2 = ca2; //X //ca2λ Callableμ λ΄κ²¨μ Έμμ
*/
}
}
//μΈν°νμ΄μ€
//has-a : Callable (μ νλ₯Ό κ±Έ μ μλ€) / κΈ°λ₯μ μ€μ μΌλ‘ ~ν μμλ?
// κ°€λμν°μ μ νκ°λ₯. μμ΄ν° μ νκ°λ₯
// μ€μ€λ―Έν° μ νκ°λ₯. μμ΄ν¨λ μ νκ°λ₯
// μ νμμΉ μ νκ°λ₯.
interface Callable {
//μμν λ³μ μ¬μ© O
public static final int CALL_ON = 1;
//νλλ³μ κ°μ΄ 보μ¬λ μμν λ³μλ‘ μΈμνλ€! (static final μλ΅)
public int CALL_OFF = 5;
//νλλ³μ X
// int callState; //μΈν°νμ΄μ€μμλ νλ μΈμ€ν΄μ€ λ³μ X
public void call(); //μ μΈλ§ κ°λ₯ ꡬν{}μ X == μΆμλ©μλ
}
interface BluetoothConnectable { //λΈλ£¨ν¬μ€μ°κ²°κ°λ₯?
public void connect(); //μ μΈλ§ κ°λ₯ ꡬν{}μ X == μΆμλ©μλ
}
class Phone1 {}
class GalaxyPhone1 implements Callable, BluetoothConnectable { //ꡬννκ² λ€
//νλλ³μ -> interfaceμμ νλλ³μλ₯Ό λͺ»κ°μ§λκΉ μ¬κΈ°μ λ§λ€μ΄
int callState;
//μμμ΄ κΌ κ΅¬νν΄μΌνλ€ (importνλ―μ΄) == μΆμλ©μλ
@Override
public void call() { //μ체μ μΈ λ©μλ
// TODO Auto-generated method stub
System.out.println("κ°€λμ μ νκ±ΈκΈ°");
}
//μμμ΄ κΌ κ΅¬νν΄μΌνλ€ (importνλ―μ΄) == μΆμλ©μλ
@Override
public void connect() { //μ체μ μΈ λ©μλ
// TODO Auto-generated method stub
System.out.println("κ°€λμ λΈλ£¨ν¬μ€ μ°κ²°");
}
}
class IPhone1 implements Callable { //λΈλ£¨ν¬μ€μ°κ²°κΈ°λ₯X
//νλλ³μ -> interfaceμμ νλλ³μλ₯Ό λͺ»κ°μ§λκΉ μ¬κΈ°μ λ§λ€μ΄
int callState;
//μμμ΄ κΌ κ΅¬νν΄μΌνλ€ (importνλ―μ΄) == μΆμλ©μλ
@Override
public void call() { //μ체μ μΈ λ©μλ
// TODO Auto-generated method stub
System.out.println("μμ΄ν° μ νκ±ΈκΈ°");
}
}
//κ°€λμν νλΈλ¦Ώ
class GalaxyTab1 implements Callable, BluetoothConnectable { //λ€μ€μΈν°νμ΄μ€ O
//νλλ³μ -> interfaceμμ νλλ³μλ₯Ό λͺ»κ°μ§λκΉ μ¬κΈ°μ λ§λ€μ΄
int callState;
//μμμ΄ κΌ κ΅¬νν΄μΌνλ€ (importνλ―μ΄) == μΆμλ©μλ
@Override
public void call() { //μ체μ μΈ λ©μλ
// TODO Auto-generated method stub
System.out.println("κ°€λμν μ νκ±ΈκΈ°");
}
//μμμ΄ κΌ κ΅¬νν΄μΌνλ€ (importνλ―μ΄) == μΆμλ©μλ
@Override
public void connect() { //μ체μ μΈ λ©μλ
// TODO Auto-generated method stub
System.out.println("κ°€λμν λΈλ£¨ν¬μ€ μ°κ²°");
}
}
class MarshallSpeaker implements BluetoothConnectable {
//μμμ΄ κΌ κ΅¬νν΄μΌνλ€ (importνλ―μ΄) == μΆμλ©μλ
@Override
public void connect() {
// TODO Auto-generated method stub
}
}
πinterface Callable {} => νλλ³μX, μμ±μX, λ©μλλ μ μΈλ§! {}X, μΈν°νμ΄μ€ κ°μ²΄ μμ±X // νλλ³μμ²λΌ μ¨λ μμν λ³μλ‘ μΈμ!
πinterface Callable {} => μμν λ³μO, λ€μ€ μΈν°νμ΄μ€ ꡬνO
π
GalaxyTab1 gt3 = new GalaxyTab1();
Callable ca2 = gt3; //O //gt3λ GalaxyTab1μ λ΄κ²¨μ Έμμ
BluetoothConnectable bt2 = gt3; //O
//gt3λ GalaxyTab1μ λ΄κ²¨μ Έμμ
//ca2,bt2λ Q167μ λ΄κ²¨μλ gt3λ₯Ό κ°λ¦¬ν€κ³ μλκ² -> gt3λ κ·Έλ₯ μ§ νμ
μ΄ μλκ±°μ§
BluetoothConnectable bt2 = ca2; //X //ca2λ Callableμ λ΄κ²¨μ Έμμ
gt3λ κ·Έλ₯ μ§ νμ μ΄ λ°λ‘ μλκ²! ca2μ λ΄κ²Όλ€κ³ ν΄μ Callableμ λ΄κ²¨μ BluetoothConnectable bt2μ λͺ»λ€μ΄κ°λκ² μλλΌ! κ± gt3λ GalaxyTab1μ λ€μ΄κ°μλ λ³μμΈκ±°μ¬~!
π»