πŸ“–μΆ”μƒν΄λž˜μŠ€

λΆ€λͺ¨ν΄λž˜μŠ€ 역할을 μΆ”μƒν΄λž˜μŠ€λ‘œ ν™œμš©!

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에 λ“€μ–΄κ°€μžˆλŠ” λ³€μˆ˜μΈκ±°μ—¬~!

πŸ’»

profile
λ’€μ£½λ°•μ£½ 벨둜그

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보