추상클래스

2022. 12. 3. 23:55자바멘토링

추상클래스

-미완성 설계도: 미완성 메소드를 갖고 있는 메소드 

package main200;


abstract class Player{//추상클래스 (미완성 클래스,미완성 설계도)
	abstract void play(int pos);//추상 메소드 (미완성 메소드) 
	abstract  void stop();//추상 메소드(선언부만 있고 구현부{}가 없는 메소드
	
	
}

 

-다른 클래스 작성에 도움을 주기위한 것으로 , 인스턴스 생성 불가

Player p = new Player(); //에러발생

미완성설계도 => 제품 생산 불가

 

 

-상속을 통해 추상메소드를 완성해야 인스턴스 생성 가능하다.

//추상클래스는 상속을 통해 완성해야 객체 생성 가능
class AudioPlayer extends Player{
		void play (int pos) {
        System.out.println(pos+"위치부터 paly합니다.");
        }
		void stop() {
        System.out.println("재생을 멈춥니다.");
        }
	//두개다 구현을 해야 한다, 안할시는 abstract를 구현해줘야 한다.
	
	
}
//한개 메소드만 구현시 abstract를 붙혀 줘야 한다

abstract Class Abstractpayer extends player{

	void play(int Pos)

}
Audioplayer ap = new Audioplayer(); //인스턴스 생성 가능(완성된 설계도)

Player pr = new Audioplayer(); // 조상 참조변수로도 생성가능  , 조상은 버튼(리모콘) 만 제공

pr.play(100);// 리모콘이 타입과 상관없이 실제 호출 되는 것은 구현 클래스 AudioPlayer가 호출된다.
pr.stop();
//다형성 예시

<추상메소드>

-추상 메소드 호출가능 (호출할때는 선언부만 필요)->인스턴스 (상속을 통해 객체 구현후  호출 가능)

abstract는 강제적인 것이 있다 . 꼭 자식 클래스에서 구현을 해야 한다.

 

 

추상메소드 사용하는 이유?

 

꼭 필요하지만 자손마다 다르게 구현 될 것으로 예상되는 경우

package main200;

public class EX7_10 {//추상 클래스
	public static void main(String []args) {
		
		/* Unit[] group = { new Marine(), new Tank(), new Dropship()}, */
		Unit[] group = new Unit[3];//object로는 타입을 할수 없다 거기에는 move메소드가 없다.
		group[0]= new Marine();
		group[1]= new Tank();
		group[2]= new Dropship();
		
		//다형성 Unit[]타입에다가 ,group[0],group[1],group[2]의 타입은 Unit
		group[0].move(100, 200);//각자  구현 된 것들이 실행된다.
		group[1].move(100, 200);
		group[2].move(100, 200);
		
	}	
}

abstract class Unit{
	
	int x, y;
	abstract void move(int x,int y);
	void stop() {/*현재 위치에 정지*/}
	
}
 class Marine extends Unit{
	 
	 void move(int x,int  y) {
		 System.out.println("Marine[x=" +x + ",y="+y+"]");
	 }
	 void stimPack() {
		 /*스팀팩을 사용한다,*/
		 
	 }
	 
 }

class Tank extends Unit{
	void  move(int x, int y) {
		System.out.println("Tank[x=" +x + ",y="+y+"]");
		
	}
	
	void changeMode() {
		
		
	}
	
}

class Dropship extends Unit{
	void move(int x, int y) {
		System.out.println("Dropship[x=" +x + ",y="+y+"]");
		
	}
	void changeMode() {
		
		
		
	}
	
}

추상화 <->구체화

추상화된 코드는 구체화된 코드 보다 유연하다.변경에 유리 

 

GregorianCalendar cal = new GregorianCalendar();
//어떤 클래스의 객체를 만들어서 그 해당 클래스 타입에 참조변수를 다루다보니 명확하고 분명하다.

Calendar cal = Calendar.getInstance();
//Calendar객체를 반환한다, 그것을 참조 변수를 cal로 받는다.
//Calendar은 추상 클래스 이다. Calendar자손 객체를 반환한다. 어떤것을 반환할 지 모른다.
//추상적으로 써놓으면 유연하다.

 

private static Calendar createCalendar(TimeZone zone, Locale aLocale){

	if(caltype != null{//캘린더 타입에 따라서 객체 생성 및 반환
    	switch (caltype){
        case "buddhist":
    		cal = new BuddhistCalendar(zone,aLocale);
            break;
        case "japanese":
        	cal = new JapaneseImperialCalendar(zone,aLocale);
            break;
        case "gregory";
        	cal = new GregorianCalender(zone,aLocale);
            break;
        }
	}
}

 

정리

 

- 상속과 다르게 꼭  자손 클래스에서 오버라이딩 해서 구현을 해야 한다.

-구현이 안된 추상클래스를 포함하고있다.

 

'자바멘토링' 카테고리의 다른 글

파일디스크립터  (0) 2022.12.18
리플렉션  (0) 2022.12.15
Try - With - Resource  (0) 2022.12.04
Weak Reference & Soft reference  (0) 2022.12.03
Static 이란?  (0) 2022.11.27