Java

자바 step9 - AbstractClass(override)

코딩탕탕 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() 메소드를 사용할 수 있다.