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