ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 step9 - AbstractClass(override)
    Java 2022. 11. 6. 14:35

     

    [ 추상클래스 (Abstract Class) ]
    - class 예약어 앞에 abstract 를 명시해서 클래스를 정의한다.
    - 형태만 정의되고 실제 구현은 되지 않은 메소드가 존재할수 있다.
    - 형태만 정의된 메소드를 만들때는 abstract 예약어를 붙어서 메소드를 정의한다.
    - 생성자는 존재하지만 단독으로 객체 생성은 불가하다
    - 추상클래스 Type 의 id 가 필요하다면 추상클래스를 상속받은 자식클래스를 정의해서 객체 생성한다.
    - 추상클래스를 상속받은 자식클래스는 부모의 추상메소드를 모두 오버라이드(재정의) 해야한다. 

     

     

     

    Weapon class를 생성하였다.

    package test.mypac;
    
    /*
     *  클래스를 만들어서 우리에게 사용하도록 제공해주는 개발자가(유틸리티나 프레임워크를 공급해주는) 있다고 가정하자.
     *  
     *  그 개발자는 특정 메소드를 우리의 상황에 맞게 구현하도록 미완성인 메소드를 제공할 때도 있다.
     *  
     *  미완성 된 메소드를 추상(abstract) 메소드라고 하며 추상메소드를 하나이상 가지고 있는 클래스를
     *  
     *  추상(abstract) 클래스라고 한다.
     *  
     *  추상 메소드와 추상 클래스를 만들기 위해서는 abstract 예약어가 필요하다.
     *  
     */
    public abstract class Weapon {
    	
    	//무기 작동을 준비하는 메소드
    	public void prepare() {
    		System.out.println("무기 작동을 준비합니다.");
    	}
    	//공격하는 메소드
    	public abstract void attack();
    }

     

    Weapon class를 상속받아 MyWeapon class를 생성하였다. 

    package test.mypac;
    
    public class MyWeapon extends Weapon {
    
    	@Override
    	public void attack() {
    		System.out.println("전원 공격~!!!");
    	}
    
    }

    Weapon class에는 attack() 메소드에 abstract을 명시했는데 정의만하고 아무런 구현은 하지 않았다.

     

    package test.main;
    
    import test.mypac.MyWeapon;
    import test.mypac.Weapon;
    /*
     *  [ 추상클래스 (Abstract Class) ]
     *  
     *  - class 예약어 앞에 abstract 를 명시해서 클래스를 정의한다.
     *  - 형태만 정의되고 실제 구현은 되지 않은 메소드가 존재할수 
     *    있다.
     *  - 형태만 정의된 메소드를 만들때는 abstract 예약어를 
     *    붙어서 메소드를 정의한다.
     *  - 생성자는 존재하지만 단독으로 객체 생성은 불가하다
     *  - 추상클래스 Type 의 id 가 필요하다면 추상클래스를 상속받은 
     *    자식클래스를 정의해서 객체 생성한다.
     *  - 추상클래스를 상속받은 자식클래스는 부모의 추상메소드를 
     *    모두 오버라이드(재정의) 해야한다. 
     */
    public class MainClass01 {
    	public static void main(String[] args) {
    		Weapon w1=new MyWeapon();
    		w1.prepare();
    		w1.attack();
    	}
    }
    
    <console>
    무기 작동을 준비합니다.
    전원 공격~!!!

     

    MyWeapon class 상속받아 Weapon 객체를 생성하였으며 attack() 메소드는 MyWeapon에 구현하여 그것을 override를 하였으므로 사용할 수 있다.

     

     

    package test.mypac;
    
    public class Goattack extends Weapon{
    
    	@Override
    	public void attack() {
    		System.out.println("공격 공격 공격~!!!");
    	}
    }

     

    package test.main;
    
    import test.mypac.Goattack;
    import test.mypac.Weapon;
    
    public class MainClass02 {
    	
    	public static void main(String[] args) {
    		//여러분이 직접 클래스를 만들고 객체 생성을 해서 아래의 useWeapon() 메소드를 호출해보세요.
    		//클래스명도 마음대로... attack 메소드안에서 어떤 동작을 할지 마음대로...
    		//테스트 후 작성한 클래스와 main() 메소드안에 작성한 코드를 카톡으로 공유해보세요.
    		Weapon w1=new Goattack();			
    		MainClass02.useWeapon(w1);
    	}
    		
    	
    
    	//이 메소드는 미리 준비된 메소드이고 아주 특별한 동작을 하는 메소드라고 가정하자
    	public static void useWeapon(Weapon w) {
    		w.prepare();
    		w.attack();
    		System.out.println("잠시 휴식 후...");
    		w.attack();
    	}
    }
    
    <console>
    무기 작동을 준비합니다.
    공격 공격 공격~!!!
    잠시 휴식 후...
    공격 공격 공격~!!!

    위와 매한가지로  같은 방식이지만 이번에는 mainclass에 class를 생성하여 Weapon class를 상속받아 바로 사용하는 형식이다.  Goattack class에서도 override가 되어있기 때문에 attack() 메소드를 사용할 수 있다.

     

     

    댓글

Designed by Tistory.